thinkphp 網站程式碼注入執行命令漏洞的過程與修復方案
THINKPHP漏洞修復,官方於近日,對現有的thinkphp5.0到5.1所有版本進行了升級,以及補丁更新,這次更新主要是進行了一些漏洞修復,最嚴重的就是之前存在的SQL注入漏洞,以及遠端程式碼執行查詢系統的漏洞都進行了修復,官方本以為沒有問題了,但是在實際的安全檢測當中發現,還是存在問題,還是可以遠端程式碼進行注入,插入非法字元,提交到伺服器後端中去。
關於這次發現的oday漏洞,我們來看下官方之前更新的程式碼檔案是怎麼樣的,更新的程式檔案路徑是library資料夾下的think目錄裡的app.php,如下圖:
漏洞產生的原因就在於這個控制器這裡,整個thinkphp框架裡的功能對控制器沒有進行嚴格的安全過濾於檢查,使***者可以偽造惡意引數進行強制插入,最根本的原因就是正則的表示式寫的不好,導致可以繞過。
在controller獲取控制器後,直接進行賦值,但是並沒有對控制器的名進行嚴格的檢測,導致可以使用斜槓等特殊符號來遠端程式碼注入。
我們來搭建一下網站的環境,apache+mysql+Linux centos系統,搭建好的測試環境地址是http://127.0.01/anquan ,我們可以直接在index.php後面偽造***引數,示例如下:
直接get方式提交到網站中去,可以直接查詢到網站當前根目錄的所有檔案,截圖如下:
通過該漏洞也可以直接遠端程式碼注入執行phpinfo語句,查詢當前的php版本,路徑,擴充套件,以及php.ini存放的地址,都可以看得到,構造如下程式碼即可。
有些人可能會問了,既然都可以phpinfo,查詢目錄檔案,可不可以getshell寫網站***檔案到網站裡呢? 答案是可以的,我們測試的時候是以一句話***程式碼的寫入到safe.php檔案裡。
關於這次thinkphp的漏洞利用以及分析到此就結束了,該漏洞屬於高危漏洞,危害嚴重性較大,很多升級更新補丁的網站都會受到***,甚至有些網站會被掛馬,那麼該如何修復thinkphp的漏洞呢?替換之前的正規則表示式即可,還需要對網站的目錄進行許可權部署,防止生成php檔案,對網站上的漏洞進行修復,或者是對網站安全防護引數進行重新設定,使他符合當時的網站環境。如果不懂如何修復網站漏洞,也可以找專業的網站安全公司來處理,國內如Sinesafe和綠盟、啟明星辰等安全公司比較專業.
針對於這個情況,我們要對其library/think/App.php程式碼裡的正規則表示式進行更改,if (!preg_match('/^[A-Za-z][\w.]*$/', $controller)) { throw new HttpException(404, 'controller not exists:' . $controller); }