ThinkPHP framework 任意代碼執行漏洞預警

發布日期:2012-04-11首頁 > 安全資(zī)訊
        ThinkPHP是一(yī)個國内使用很廣泛的老牌PHP MVC框架。貌似國内有不少創業公司或者項目都用了這個框架。
        最近官方發布了一(yī)個安全補丁,官方表述是:該URL安全漏洞會造成用戶在客戶端僞造URL,執行非法代碼。
        可是貌似大(dà)多數開(kāi)發者和使用者并沒有注意到此漏洞的危害性,應者了了,更不用說有多少人去(qù)升級了。随後我(wǒ)對其進行了分(fēn)析,發現此問題果然是一(yī)個非常嚴重的問題,隻要使用了thinkphp框架,就可以直接執行任意php代碼。特此發帖預警各位。
        我(wǒ)們來分(fēn)析一(yī)下(xià)官方的補丁: 
        /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中(zhōng)的數據解析并合并到$_GET數組中(zhōng)。
        然而在用正則解析pathinfo的時候,主要是這一(yī)句:
        $res = preg_replace('@(w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
        這裏明顯使用了preg_replace的/e參數,這是個非常危險的參數,如果用了這個參數,preg_replace第二個參數就會被當做php代碼執行,作者用這種方式在第二個參數中(zhōng),利用PHP代碼給數組動态賦值。
        '$var[\'\\1\']="\\2";'
        而這裏又(yòu)是雙引号,而雙引号中(zhōng)的php變量語法又(yòu)是能夠被解析執行的。因此,攻擊者隻要對任意一(yī)個使用thinkphp框架編寫的應用程序,使用如下(xià)方式進行訪問,即可執行任意PHP代碼:
        由于是雙引号執行,這裏爲了保險起見,不給出更有危害性的代碼,利用這個還是需要點技巧的。
        總之這個問題非常嚴重,找了一(yī)下(xià),發現目前沒有修補漏洞的網站還是很多的。而ThinkPHP框架的特征其實非常好識别,有意者直接寫個scanner進行掃描也未必不可能。 
爲了不造成更大(dà)損失,特地發帖希望引起各位使用thinkphp做開(kāi)發的同學關注,盡早升級官方的安全補丁。(轉載自黑吧安全網)