やられアプリ BadTodo - 9 Server Side Code Injection - PHP Code Injection

前回:やられアプリ BadTodo - 8.2 OS コマンド・インジェクション(内部でシェルを呼び出す関数) - demandosigno

ZAPで検出されたリスク(高)の最後の一つ「Server Side Code Injection - PHP Code Injection」を確認します。

ZAPのリクエスト例。
https://todo.example.jp/exportdo.php?query=%24%7B%40print%28chr%28122%29.chr%2897%29.chr%28112%29.chr%2895%29.chr%28116%29.chr%28111%29.chr%28107%29.chr%28101%29.chr%28110%29%29%7D

実行結果。

クエリ部分をデコードすると query=${@print(chr(122).chr(97).chr(112).chr(95).chr(116).chr(111).chr(107).chr(101).chr(110))} です。

ChatGPT による解説。
1. ${}:これは一般的にシェルスクリプトにおける変数の展開を行うための構文です。この場合、バッククオート(``)の代わりに$()を使用しています。
2. @print():@は、一般的にシェルスクリプトにおいてコマンドの出力を表示しないようにするための記号です。
3. chr():chr()関数は、引数に指定されたASCIIコードに対応する文字を返すPHPの組み込み関数です。
したがって、このコードはPHPコードとして解釈され、print()関数によってASCIIコードに対応する文字が結合されて表示されます。具体的には、ASCIIコード122は小文字の「z」、ASCIIコード97は小文字の「a」、ASCIIコード112は小文字の「p」、ASCIIコード95はアンダースコア(_)などに対応しています。

実行結果のレスポンスに"zap_token"と表示されていることから、PHPコードが実行されていることが確認できます。

その他の実行例。
https://todo.example.jp/exportdo.php?query=10%20;%20system(%22/bin/ls%20-l%22);

https://todo.example.jp/exportdo.php?query=system(%22/bin/echo%20TestTest%22);

queryの値としては連想配列を表す文字列が入力されることを期待されているため、一つ目の例"10%20;%20"のようにダミーコードを記述していない場合エラー表示も出ます。

次回:やられアプリ BadTodo - 10 CSRF(クロスサイト・リクエスト・フォージェリ) - demandosigno

/* -----codeの行番号----- */