<p>免責事項: これは PHP コード インジェクションを学習するための単なる例であり、運用コードを何らかの形で使用するものではありません。これが良いコーディング手法ではないことは十分に承知しています。 </p>
<p>次の PHP スクリプトがあります: </p>
<pre class="brush:php;toolbar:false;"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
「http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd」>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<頭>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>サンプルスクリプト</title>
</head>
<本体>
<h1>サンプルページ</h1>
<p>それでは計算してみましょう。計算する式を入力してください。例: 1 1。 </p>
<フォームメソッド="get">
<p>数式: <input type="text" name="maths" /></p>
<p><input type="submit" value="calculate" /></p>
</フォーム>
if (( isset($_REQUEST["数学"])) && ($_REQUEST["数学"] != "") )
{
echo "<p>結果は次のとおりです:";
eval("echo (".$_REQUEST["数学"].");");
エコー "</p>";
}
?>
</ボディ>
</html></pre>
<p>このスクリプトは PHP コード インジェクションに対して脆弱ですが、次のことを行うことでこれを突破することができました (ほとんどの場合、試行錯誤によって判明しました)。 </p>
<pre class="brush:php;toolbar:false;">$a='1');phpinfo();echo($a</pre>
<p>しかし、その根拠はよくわかりません。私が理解しているところによると、echo ステートメントを完成させ、独自のコード (phpinfo() など) を挿入してから、閉じ括弧を処理する別の関数 (echo など) を記述する必要があります。 </p>
<p>次のようなコードが機能すると思いました:</p>
<pre class="brush:php;toolbar:false;">");phpinfo();echo("</pre>
<p>ただし、phpinfo は文字列の一部とみなされ、eval 関数によって評価されないため、これは機能しません。
また、引用符をエスケープしようとしましたが、成功しませんでした。 </p>
<p>質問:</p>
<li>ここにコードを挿入する正しい方法は何ですか? </li>
<li>なぜ<code>$a='1');phpinfo();echo($a</code> は機能するのでしょうか?</li>
</ul>
問題は、このステートメントが無効であることです:
リーリー解析エラーが発生します。したがって、このエラーを回避するには何かを注入する必要があります。例えば:### リーリー
その入力を使用すると、変数を置換した結果は次のようになります:
リーリーしたがって、ここでは
$a='1'
が代入され、代入結果 (つまり、$a
に代入された値) が出力されます。次にphpinfo()
が実行されました。最後に$a
が再度出力されます。);phpinfo();echo(
を使用しようとすると、echo ()
を実行しようとしているため、機能しません。ただし、echo
少なくとも 1 つのパラメータが必要です。したがって、ここにコードを挿入するには、入力が
echo (
) の後の有効な何かで始まり、);
の前の有効な何かで終わることを確認する必要があります。挿入する追加のコードをこれら 2 つの部分の間に配置します。