ThinkPHP是一個國內使用很廣泛的老牌PHP MVC框架。貌似國內有不少創業公司或者項目都用了這個框架。
最近官方發布了一個安全補丁,官方表述是:該URL安全漏洞會造成用戶在客戶端偽造URL,執行非法代碼。
可是貌似大多數開發者和使用者並沒有注意到此漏洞的危害性,應者了了,更不用說有多少人去升級了。隨後我對其進行了分析,發現此問題果然是一個非常嚴重的問題,只要使用了thinkphp框架,就可以直接執行任意php代碼。特此發帖預警各位。
我們來分析一下官方的補丁:
/trunk/ThinkPHP/Lib/Core/Dispatcher.class.php
復制代碼
代碼如下:
125 - $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['1']="2";', implode($depr,$paths));
125 + $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['1']='2';', implode($depr,$paths));
這個代碼是把pathinfo當作restful類型url進行解析的,主要作用是把pathinfo中的數據解析並合並到$_GET數組中。
然而在用正則解析pathinfo的時候,主要是這一句:
復制代碼
代碼如下:
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var['1']="2";', implode($depr,$paths));
這裡明顯使用了preg_replace的/e參數,這是個非常危險的參數,如果用了這個參數,preg_replace第二個參數就會被當做php代碼執行,作者用這種方式在第二個參數中,利用PHP代碼給數組動態賦值。
復制代碼
代碼如下:
'$var['1']="2";'
而這裡又是雙引號,而雙引號中的php變量語法又是能夠被解析執行的。因此,攻擊者只要對任意一個使用thinkphp框架編寫的應用程序,使用如下方式進行訪問,即可執行任意PHP代碼:
復制代碼
代碼如下: