【乾貨】Thinkphp漏洞跟蹤

2021-02-19 SecPulse安全脈搏

漏洞分析環境:https://github.com/vulnspy/thinkphp-5.1.29與phpstudy php-7.0.12-nts+apache

Thinkphp框架中url的訪問為index.php/模塊/控制器/操作,index.php稱為入口文件(pathinfo方式的URL訪問),也可使用兼容模式,通過變量s傳參/模塊/控制器/操作。

根據參考連結中的關鍵代碼,追溯漏洞源文件/thinkphp/library/think/route/dispatch/Module.php,如下圖所示:

繼續跟蹤result數組,如下圖所示:

發現調用父類init函數,module類繼承於抽象類Dispatch,追蹤Dispatch如下圖所示:

觀察判斷語句,通過偽變量this對象引用到rule.php文件中,執行doAfter函數,獲取路由的後置操作。如下圖所示:

這裡稍微引入一下路由後置操作簡介,至於大佬可以加以補充,小弟就不獻醜了。

Thinkphp路由為三種模式:

1、普通模式(採用默認的pathinfo方式url):'url_route_on' => false

2、混合模式(該方式下面,只需要對需要定義路由規則的訪問地址定義路由規則,其它的仍然按照默認的PATH_INFO模式訪問URL):'url_route_on' => true

3、強制模式(必須定義路由才可訪問):'url_route_must' => true 'url_route_on' => true

Thinkphp 5.0以上版本對新的路由功能做了新的增強,支持路由到模塊(模塊/控制器/操作)、控制器(控制器類/操作)、類(任何類庫),也是此次漏洞的原因之一

根據以上描述,分析此次漏洞環境代碼,採用為混合模式,在採用s變量獲取,觸發漏洞。分析獲取pathifo的過程,如下圖所示:

第一步先判斷pathinfo是否有兼容模式的參數,第二步分析pathinfo信息,將ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL三種模式循環賦值給變量$type,使用server函數,將變量$type轉換為大寫存入 server數組中,當變量server數組已被賦值,則返回server數組,否則返回空,如下圖所示:

最終當變量pathinfo不為空時,$pathinfo為刪除/符號前後空白字符的字符串,追溯pathinfo函數,找到path函數,如下圖所示:

跟蹤path函數,找到App.php文件中的routeCheck函數,如下圖所示:

可以觀察到此函數返回一個Dispatch對象,而module文件中$result = $this->dispatch,繼續跟蹤Check函數,如下圖所示:

返回值為創建的新對象UrlDispatch,跟蹤UrlDispatch類,發現為Url的別名引用,如下圖所示:

跟蹤Url類,發現繼承於抽象類Dispatch,再由魔術方法__construct在方法被實現時調用,觀察此方法,如下圖所示:

此方法用偽變量this將dispatch對象賦值為$dispatch,返回觀察Url類,如下圖所示:

init方法返回到新對象Module的init方法中,也就是Module.php中parent::init(),其中dispatch通過parseUrl函數賦值給$result,觀察parseUrl,如下圖所示:

變量module由getConfig函數獲取app_multi_module的值,觀察得知app_multi_module為真,得到刪除第一個數組的變量$path,最後返回一個封裝路由route,包含變量module、controller和action,並傳遞給變量result。

通過以上分析得到變量result的生成結果,當使用explode分割字符串時,輸入/index/\think\request/cache,得到如圖所示:

通過上述刪除第一個數組,賦值給module.php中的變量module,如下圖所示:

此時變量module為index,繼續觀察找到控制器變量controller,如下圖所示:

此時變量controller為\think\request,繼續觀察找到操作名變量actionName,如下圖所示:

此時變量actionName為cache,最後進入請求操作,跟蹤到操作器controller文件中,找到cache方法,如下圖所示:

通過特殊構造達到執行phpinfo的效果,將變量key設置為1|phpinfo,跳過判斷是否存在於匿名類中,並通過true===1,進入list函數將變量key和fun分別賦值為1和phpinfo(根據php-7.0.12-nts環境,list賦值為從右向左),從而達到運行phpinfo函數。

第二個poc為:

/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();'

也等同於:

/index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=php%20-r%20'phpinfo();』

跟蹤到invokefunction函數,如下圖所示:

通過將function設置為call_user_func_array,vars[0]=system,即可生成system()函數,通過vars[1][]對上述call_user_func_array返回的回調函數system設置參數變量,達到運行系統命令。

參考連結:

http://www.vulnspy.com/cn-thinkphp-5.x-rce/thinkphp_5.x_(v5.0.23%E5%8F%8Av5.1.31%E4%BB%A5%E4%B8%8B%E7%89%88%E6%9C%AC)_%E8%BF%9C%E7%A8%8B%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%A9%E7%94%A8%EF%BC%88getshell%EF%BC%89/

https://www.jianshu.com/p/73ed6e42d389

↙↙↙ 點擊 」閱讀原文「 與作者展開話題探討,直面交流

相關焦點

  • ThinkPHP框架爆致命漏洞 360建議網站快打補丁
    ThinkPHP框架爆致命漏洞 360建議網站快打補丁 4月13日消息,日前烏雲漏洞報告平臺爆料稱,ThinkPHP框架存在「URI取值任意代碼執行」漏洞(https://zone.wooyun.org
  • ThinkPHP v5.1.x POP 鏈分析
    composer 部署composer create-project topthink/think=5.1.38 tp5.1.38利用鏈全局搜索函數 __destruct來到 /thinkphpstring $filename ) : bool如果傳入的 $filename 是個反序列化的對象,在被 file_exists 當作字符串處理的時候就會觸發其 __toString 方法(如果有的話)所以下面就是找含 __toString 方法的類來到 /thinkphp
  • 二手筆記本thinkphp T440S,用了3個月賺了150元
    IT雜誌社電腦幹貨分享小編說一下,全段時間購買的一臺二手電腦,thinkphp T440S使用了3個月之後竟然賺了150元。由於前兩款分別是950和1400元搞點,在搞一臺主要是辦公的生產力的電腦,小編最終花了1500元購買了thinkphp T440S。想當年這也是1萬多元的筆記本。
  • thinkphp如何使用vue進行web開發
    vue可以說是近幾年最火最流行的前端js框架,而thinkphp也是國內挺流行的後端框架。看到網上很多朋友的教程都是前端開發者寫的,難免對像自己一樣的後端程式設計師是一種打擊。「怎麼就沒有從後臺出發講講如何使用前端vue框架呢?」我時常這樣想。
  • 基於thinkphp配置資料庫連接及同時訪問多個不同資料庫
    1 準備工作下載thinkphp框架,並搭建一個php項目,可參考之前寫的其他文章。已部署好的php項目如下圖。2 配置資料庫連接在項目application目錄下,找到database.php文件,輸入資料庫類型,伺服器地址資料庫名稱,資料庫用戶名,密碼,埠號。如下圖。
  • 如何使用閉包函數在thinkphp模型中操作資料庫的增刪更查
    在thinkphp中使用MVC編程思維裡的模型操作資料庫是很方便的一件事情,也非常有利於後期代碼的維護,下面小菌為大家介紹如何使用閉包函數在thinkphp模型中操作資料庫的增刪更查,用閉包函數來操作,既可展示出功能的多樣性也可有利於代碼維護
  • 常用的MySql在ThinkPHP中增刪改查的五種寫法方式
    -> update(['name' => 'thinkphp']);select查 Db::table('think_user') -> where('id',?)-> update(['name' => 'thinkphp']);select查 Db::name('user') -> where('id',?) -> select();四、通過db助手函數,很簡潔的寫法insert增 db('user') -> insert('id' => '?')
  • Thinkphp 5.1 多用戶商城系統 WSTMart 2.0.3 發布
    商淘軟體WSTMart電子商務系統是一款基於THINKPHP 5.1框架打造的B2B2C電商平臺,是目前基於thinkphp 5
  • H2Miner木馬利用SaltStack新漏洞發動攻擊,已獲利370萬元
    很多網絡安全事件均由安全漏洞引發。日前,騰訊安全威脅情報中心檢測到H2Miner黑產團夥利用SaltStack遠程命令執行漏洞入侵企業主機、控制伺服器進行門羅幣挖礦,已非法獲利370萬元,給企業正常業務造成重大影響。
  • 關於ThinkPHP 6.0存在任意文件寫入高危漏洞的預警通報
    近日,奇安信補天漏洞響應平臺收到ThinkPHP 6.0任意文件創建漏洞。該漏洞源於ThinkPHP 6.0的某個邏輯漏洞,成功利用此漏洞的攻擊者可以實現「任意」文件創建,在特殊場景下可能會導致GetShell。
  • 深入解讀:Windows HTTP.sys遠程代碼執行漏洞跟蹤進展
    下面對此漏洞的原理進行分析,以便大家更好的理解和防禦這一高危安全漏洞。這至少應該包含如下環節:首先,應該第一時間獲取漏洞通告及相關信息,了解此次漏洞的影響範圍及深度。,這樣的情況在相當多的0day事件中屢見不鮮;另外,還需要漏洞相關廠商與安全廠商通力協作,互相溝通漏洞原理和利用過程,進行較深層次的解讀,才能夠促進漏洞相關廠商的開發人員深入了解這個漏洞並根據其自身情況進行代碼層面的整改;然後,在加固階段性或整體完成後,需要再次進行完整掃描和人工驗證整改加固結果,在技術投入允許的條件下
  • 漏洞威脅周報(2018/8/25-2018/8/31)
    函數,該函數正是本次漏洞利用到的函數。ThinkPHP官方的github下載補丁:https://github.com/top-think/請使用ThinkPHP v5.1.x的用戶及時到ThinkPHP官方的github下載補丁:https://github.com/top-think/framework參考連結:http://www.thinkphp.cn
  • ThinkPHP V5.0.11 暨 5.1.0 RC1 版本發布: 包含安全更新
    5.1完全開發手冊:https://www.kancloud.cn/manual/thinkphp5_1/353946V5.0.11版本主要為BUG修正和改進,並且包含一個安全更新,可以從5.0.10無縫升級,推薦更新,主要改進如下:主要更新完善緩存驅動;改進資料庫查詢;改進URL生成類;緩存有效期支持指定過期時間
  • 谷歌研究人員披露蘋果瀏覽器多個安全漏洞
    網易科技訊1月23日消息,據外媒報導,谷歌的研究人員日前披露了蘋果瀏覽器Safari存在的「多個安全漏洞」。這些漏洞是在Safari「智能跟蹤預防功能」中發現的,該功能旨在保護用戶不受跨站點跟蹤和其他在線隱私問題的影響。
  • 《絕密跟蹤》韓國電影
    《絕密跟蹤》這部電影是根據港片《跟蹤》這部電影改編而來的。這部電影主要講的是警察部門裡邊有一個組叫做跟蹤組,專門負責跟蹤犯罪嫌疑人的。這些人在觀察力,記憶力,跟蹤能力等方面都有著特殊的天賦。《絕密跟蹤》的主角這個剛剛睡醒,一臉懵逼的男子是跟蹤組的組長。是由韓國演員薛景求主演的,他的演技非常棒,給我印象最深的是他在《不可饒恕》這部電影裡飾演的法官兼父親。
  • Laravel和Thinkphp你喜歡哪個框架?Thinkphp5號稱為API開發的框架
    首先來說下來thinkphp,採用mvc思想開發,它活動範圍主要是國內,而且完全免費開源,學習資料非常豐富,對於新手來說是學習php框架最佳的選擇,主要還是都是中文文檔。從5.0版本開始,號稱為API開發而設計的高性能框架。配置開發也是非常簡單,一般下載框架就可以直接開發,開發代碼風格也符合國人思想,所以簡單,快捷,適合新手的php框架。
  • 網站漏洞測試 乾貨學習經驗分享
    但是對新人來說,在無人指導的情況下,明確目標這一步會比較迷茫,所以個人建議如下:根據OWASPTOP10文件中所總結的漏洞類型來設定目標。但其中一些項目還比較雜糅需要在這一點上繼續分化下去,分化的問題放在下一部分來解釋,二是培訓機構的白嫖課程大綱。
  • 2019 年開源軟體漏洞增長近 50%,C 語言漏洞佔比最高
    WhiteSource 通過對 650 多個開發人員進行了調查,並從 NVD(Nartional Vulnerability Database)、安全公告、經過同行評審的漏洞資料庫、問題跟蹤程序等渠道收集了數據之後
  • php常見攻擊手法之ThinkPHP篇
    在數組這層,ThinkPHP對數據的過濾不夠嚴謹,導致的字符串拼接,從而sql注入在$data = M('user')->find(I('GET.id'));中下斷點,跟蹤到ThinkPHP/Library/Think/Model.class.php:720的select函數中列出兩條比較重要的語句
  • 應用程式漏洞讓智慧型手機成為監控器
    德國弗勞恩霍夫安全信息技術研究所專家對安卓手機的跟蹤應用程式進行檢測發現,幾乎所有Google Play商店提供的應用程式都有安全漏洞,攻擊者可以利用它們來創建用戶活動蹤跡文件、閱讀用戶聊天和簡訊記錄,以及查看圖像。特別嚴重的是,攻擊者不必監視單臺智慧型手機,但可以同時攻擊數百萬臺已安裝這些應用程式的智慧型手機用戶。