
Dockerベースのラボで、Nginx CVE-2013-4547のURI解析の脆弱性を実演し、権限バイパスとコード実行のための段階的な悪用手順を提供します。
影響バージョン:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
参考リンク:
この脆弱性は実際にはコード実行とはあまり関係がなく、主な原因はリクエストURIを誤って解析し、ユーザーがリクエストしたファイル名を誤って取得したことにより、権限バイパスやコード実行といった付随的な影響が発生するというものです。
例えば、Nginxが.phpで終わるリクエストにマッチすると、fastcgiに送信して解析させます。一般的な書き方は次のとおりです。
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
通常の状態(pathinfoをオフにしている場合)では、.php拡張子のファイルのみがfastcgiに送信されて解析されます。
一方、CVE-2013-4547が存在する場合、をリクエストすると、このURIは正規表現にマッチし、このLocationブロックに入ることができます。しかし、入った後、Nginxはリクエストされたファイルがであると誤って判断し、それをの値としてfastcgiに送信します。
1.gif[0x20][0x00].php\.php$1.gif[0x20]SCRIPT_FILENAMEfastcgiはSCRIPT_FILENAMEの値に基づいて解析するため、最終的に解析の脆弱性が発生します。
したがって、スペースで終わるファイルをアップロードするだけで、PHPにそれを解析させることができます。
もう一つ例を挙げると、多くのWebサイトでは管理画面(バックエンド)へのアクセスをIPで制限しています。
location /admin/ {
allow 127.0.0.1;
deny all;
}
次のようなURIをリクエストできます:/test[0x20]/../admin/index.php。このURIはlocationの後ろの/admin/にはマッチしないため、そのIP検証をバイパスできます。しかし最終的にリクエストされるファイルは/test[0x20]/../admin/index.php、すなわち/admin/index.phpであり、バックエンドへのアクセスに成功します。(この前提として、test という名前のディレクトリが存在する必要があります。これはLinuxシステムの特徴です。存在しないディレクトリの場合、上の階層に遷移してもファイルが存在しないエラーが発生します。Windowsではこの制限はありません)
脆弱性環境を起動します:
docker-compose build
docker-compose up -d
環境の起動後、http://your-ip:8080/にアクセスするとアップロードページが表示されます。
この環境はブラックリスト検証のため、php拡張子のファイルはアップロードできません。CVE-2013-4547を利用する必要があります。1.gif をアップロードします。末尾のスペースに注意してください:

http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].phpにアクセスすると、PHPが解析されていることが確認できます:

注意:[0x20]はスペース、[0x00]は\0です。これらの2つの文字はエンコードする必要はありません。