解析與應對PHP中的eval函數
P粉476547076
P粉476547076 2023-08-13 17:40:10
0
2
522
<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>
P粉476547076
P粉476547076

全部回覆(2)
P粉561749334

問題在於這個語句是無效的:

echo ();

它會導致解析錯誤。所以你需要注入一些東西來避免這個錯誤。例如:

$var = "1); phpinfo(); echo (1";
eval("echo ($var);");
P粉033429162

當你使用那個輸入時,替換變數的結果是:

eval("echo ($a='1');phpinfo();echo($a);");

所以這裡賦值了 $a='1',並且輸出了該賦值的結果(即被賦給 $a 的值)。然後執行了 phpinfo()。最後再次輸出了 $a

如果你嘗試使用);phpinfo();echo(,它不會起作用,因為它試圖執行echo ()。但是echo至少需要一個參數。

所以要在這裡注入程式碼,你必須確保輸入以在 echo ( 之後是有效的內容開頭,並且以在 ); 之前是有效的內容結尾。將你想要注入的額外程式碼放在這兩部分之間。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!