解析與應對PHP中的eval函數
<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="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>範例腳本</title>
</head>
<body>
<h1>範例頁面</h1>
<p>現在進行數學計算。請輸入一個公式進行計算。例如:1 1。 </p>
<form method="get">
<p>公式:<input type="text" name="maths" /></p>
<p><input type="submit" value="計算" /></p>
</form>
<?
if (( isset($_REQUEST["maths"])) && ($_REQUEST["maths"] != "") )
{
echo "<p>結果是:";
eval("echo (".$_REQUEST["maths"].");");
echo "</p>";
}
?>
</body>
</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>
<ul>
<li>在這裡注入程式碼的正確方式是什麼? </li>
<li>為什麼<code>$a='1');phpinfo();echo($a</code>會起作用?</li>
</ul><p><br /></p>