2012-09-28 32 views
11

我希望有人能爲我回答這個問題,因爲我已經相當好奇了很長一段時間,似乎還沒有能夠獲得答案。 但是,我確定這裏有人能夠做到,因爲這裏有一些非常聰明的人。

現在,問題。 我將以遠程命令執行漏洞爲例。

<?php echo preg_replace('/(.*)/e', 'strtoupper("\\1")', $argv[1]); ?> 

要利用此攻擊者只會輸入{${phpinfo()}}例如。 我的問題如下:

  1. 哪些括號{}以及爲什麼它看起來像一個 變量?
  2. 它是否有某種名稱?我不相信這是一個可變的功能,因爲它們不同,不是嗎?

謝謝!

+1

哦,花括號不是目前列表中的一部分:[參考 - 這是什麼符號在PHP中的意思?](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol -mean功能於PHP) – hakre

回答

8

這是Complex (curly) syntax

功能,方法調用,靜態類變量和類常量,因爲PHP 5 內{$}工作。但是,訪問的值將爲 ,該值被解釋爲定義字符串 的範圍內的變量的名稱。 使用單個大括號({})將不起作用訪問 函數或方法的返回值或類 常量或靜態類變量的值。

所以,一個簡單的變量,單{}會的工作,像"{$foo}",但phpinfo()是一種功能,當你需要調用它,你需要兩個{},你的例子"{${phpinfo()}}",將調用phpinfo()功能。

這就是爲什麼e修改爲氣餒,例如,成像這個

{${eval($_GET['php_code'])}},這給攻擊者執行任意PHP代碼的能力,因此讓他幾乎完全訪問您的服務器。

爲防止出現這種情況,請改用preg_replace_callback()