免責事項: これは PHP コード インジェクションを学習するための単なる例であり、運用コードを何らかの形で使用するものではありません。これが良いコーディング手法ではないことは十分に承知しています。
次の PHP スクリプトがあります:
<頭>サンプルスクリプト <本体>サンプルページ
それでは計算してみましょう。計算する式を入力してください。例: 1 1。
<フォームメソッド="get">数式:
フォーム> ボディ>
このスクリプトは PHP コード インジェクションに対して脆弱ですが、次のことを行うことでこれを突破することができました (ほとんどの場合、試行錯誤によって判明しました)。
$a='1');phpinfo();echo($a
しかし、その根拠はよくわかりません。私が理解しているところによると、echo ステートメントを完成させ、独自のコード (phpinfo() など) を挿入してから、閉じ括弧を処理する別の関数 (echo など) を記述する必要があります。
次のようなコードが機能すると思いました:
");phpinfo();echo("
ただし、phpinfo は文字列の一部とみなされ、eval 関数によって評価されないため、これは機能しません。 また、引用符をエスケープしようとしましたが、成功しませんでした。
質問:
$a='1');phpinfo();echo($a
は機能するのでしょうか?
問題は、このステートメントが無効であることです:
リーリー解析エラーが発生します。したがって、このエラーを回避するには何かを注入する必要があります。例えば:### リーリー
その入力を使用すると、変数を置換した結果は次のようになります:
リーリーしたがって、ここでは
$a='1'
が代入され、代入結果 (つまり、$a
に代入された値) が出力されます。次にphpinfo()
が実行されました。最後に$a
が再度出力されます。);phpinfo();echo(
を使用しようとすると、echo ()
を実行しようとしているため、機能しません。ただし、echo
少なくとも 1 つのパラメータが必要です。したがって、ここにコードを挿入するには、入力が
echo (
) の後の有効な何かで始まり、);
の前の有効な何かで終わることを確認する必要があります。挿入する追加のコードをこれら 2 つの部分の間に配置します。