奥运会网球比分规则|雪缘网网球比分直播|
歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

淺析PHP變量解析復雜規則語法

來源:本站整理 作者:佚名 時間:2019-04-16 TAG: 我要投稿

翻了好久前寫過的關于php復雜語法變量解析的文章,發現很多地方存在問題。因此又查閱文檔重新理解了一遍該語法,談談個人的理解,并記錄在此。
 
題目簡析
一道很早之前的題目,代碼(簡化):
$str= @(string)$_GET['str'];
eval('$str="'.addslashes($str).'";');
通過eval執行php代碼獲得flag,addslashes函數將字符串中的特殊字符轉義,“{}”在雙引號中可以標記變量邊界來解析,利用該方式來達到代碼執行的目的。
eg:

通過payload:${assert($_GET[cmd])}}即可獲取shell,也可以利用system函數來執行命令讀取flag等。
 
變量解析之復雜語法
當字符串用雙引號或heredoc結構定義時,其中的變量將會被解析。共有兩種語法規則,一種簡單規則,一種復雜規則,這里討論復雜規則。
復雜規則語法的顯著標記是用花括號包圍的表達式。任何具有string表達的標量變量,數組單元或對象屬性都可使用此語法,表達方式{$var_name}或${var_name}。

根據php官方文檔,這里提示在PHP5以后可以使用{$}來調用函數、方法等。看下面的例子:

不難理解,{${getname()}} => {$s1ye},以函數返回值命名變量。這里我在函數中加入了echo "s1ye";,可以發現先執行了getname函數并輸出了“s1ye”,接著才執行了echo(優先級)。
為了方便理解payload,利用以下代碼進行測試:

構造了一個類似phpinfo的簡化函數,利用變量解析在雙引號中的復雜語法,先執行了test函數輸出了“just for test”并返回true,可以看到,返回一條警告并且變量a的值是空的。
為什么Notice為”Undefined variable: 1”呢?返回TRUE,變量應該為$TRUE的。前面官方文檔說過了,$ + string的變量會被解析,而TRUE是bool類型,并且是個常量,當返回TRUE并命名變量時php解析器將TRUE轉換為了string類型。

由于沒有該變量導致賦值給a變量時返回為空(并不能用數字開頭來命名變量)。
 
理解payload
直接利用payload{${phpinfo()}}或者${${phpinfo()}}會返回phpinfo信息,但都會報錯。


上面已經講過了報錯的原因,這里就很好理解了。接下來逐步的來分析payload成功執行的過程:

eval函數將字符串當作php代碼執行,因此,通過圖中代碼清晰可見相當于定義了str變量,賦值為一個字符串”{${phpinfo()}}”。
$str = "{${phpinfo()}}",花括號定義了變量的邊界,因此該條語句先執行括號中內容,獲取函數返回值,并以返回值的string命名變量再賦值給str變量(同上面分析的test函數一樣)。
到了這里只要修改”{${?}}”中的?為其他php代碼就可以達到寫文件讀文件或者getshell等操作了,只需要注意addslashes函數即可。
 
思考
先看一下原題代碼
eval('$str="'.addslashes($str).'";');
在雙引號中可以利用花括號定義變量邊界,調用函數等,如果修改為單引號包裹addslashes函數,還能執行代碼了嗎。
$str = @(string)$_GET['str'];
eval("$str='".addslashes($str)."';");
很容易就發現雖然addslashes函數部分內容被單引號包裹,但是變量str卻變成了雙引號包裹。這說明還是可以被利用的,直接嘗試上面的payload:

發現報錯,變量同樣被雙引號包裹(其實并沒有被雙引號包裹),這里卻報錯了。但是payload2${${phpinfo()}}卻可以正常執行。

其實這里只要稍微思考一下就可以理解了,用兩個例子來解釋:

可以看到payload1不能執行成功的原因就是并沒有被雙引號包裹,所以外層標記變量邊界的花括號無用。而payload${phpinfo()}/${${phpinfo()}}(無論加幾個”${}”都無差,只不過報錯更多而已)相當于$a=’string’,a==(phpinfo()的返回值string形式),即執行函數后利用返回值定義變量并賦值,因此可以執行成功。
 
總結
整體看下來感覺還是很繞的,總結就是遇到問題除了百度谷歌,要多認真讀官方文檔, 其實文檔已經寫得很清楚了。
 

【聲明】:黑吧安全網(http://www.nddver.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        奥运会网球比分规则
        雷速体育旧版本 街机海龙王捕鱼 今日买什么股票推荐 083期葡京特码资料 云南11选5 四川快乐12手机版遗漏 北京11选5走势图top 任选9场奖金是多少 双色球复式32 篮球比分直播新浪