どうもー 最近CGI環境のphpの脆弱性が話題になっているのでゆるくまとめます。
脆弱な環境例
概要
windowsが日本語もしくは中国語(繁体字と簡体字)のロケールで実行されている場合phpの脆弱性を使い、任意のコードが実行できてしまう脆弱性です。
ざっと解説しますと。。。
なんと!ソフトハイフンはエスケープしないんです!!
・・・・・
何言ってんだって感じだと思いますが、ハイフンとソフトハイフンをUnicodeで表すと。。
ハイフン:0x2D
ソフトハイフン:0xAD
になります。
ハイフン(0x2D)はApacheでしっかりガードしてくれますが、ソフトハイフン(0xAD)は番号が違うため、通ってしまいます。そして、phpはソフトハイフンを通常のハイフンと認識してしまうため、ハイフンで始まるコマンドラインの引数をphpに送り込むことができます。
以下に簡単にまとめると、、、
悪意のあるコード⇒Apache「なんかハイフンに似てるやついるけど大丈夫やろ!ヨシ!」⇒php「なんかきた!実行すればええやろ!」⇒完
検証
では実際に検証していきます。
※運営しているサービスの脆弱性を確かめるためにご利用ください。
http://localhost/index.phpで普通にindex.phpを表示させます。
index.phpの後ろに「?%ADs」をつけます。
そしてEnterを押すと、index.phpの中身が表示されます。
以上です。すごく簡単です。
%ADは先ほど述べたようにソフトハイフンです。sはソースコードを表示するオプションです。
つまりコマンドラインで表すと以下のようになります。
php.exe -s index.php
対処法
もっとも有効な対処法は最新のPHPバージョン(8.3.8, 8.2.20, 8.1.29)に上げることです。
しかし、「それができれば苦労しねぇよ、、」ってシステムもあると思います。(化石システムとか。。。。)
そういうシステムには「.htaccess」に以下の記述をして下さい。
RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]
上記追加後に実行してみると、
403エラーで返ってきます。
しかし、これは一時的な処置です。システム全体をアップデートするなりなんなりと改修が必要になるかと思います。