搜尋
首頁php框架ThinkPHPThinkPHP6.0.13反序列化漏洞分析

ThinkPHP6.0.13反序列化漏洞分析

Oct 09, 2022 pm 06:47 PM
phpthinkphp

最近有點閒下來了,不找點事幹比較難受,打算找點漏洞分析一下,於是就打算看看TP的一些漏洞,ThinkPHP6.0.13是TP的最新版,八月份有師傅提交了一個issue指出TP有反序列化問題,網路上也有些師傅分析了一波,不過斷點下的比較多,而且部分方法沒有闡明其用途,所以我也嘗試詳細的分析一波。以下先給POC

ThinkPHP6.0.13反序列化漏洞分析

分析

先看看POC的起始點

ThinkPHP6.0.13反序列化漏洞分析

ThinkPHP6.0.13反序列化漏洞分析

發現起始點在Psr6Cache這個類,我們進入這個類,不過沒有發現__destruct或__wakeup等常見的反序列化起始魔術方法,推測應該在其父類別AbstractCache這個抽象類別中。跟入AbstractCache類別

ThinkPHP6.0.13反序列化漏洞分析

如圖,成功發現本次反序列化鍊子的起始類別。這裡我們可以控制autosave這個屬性為false,從而進入save方法。

回到Psr6Cache類別看這個方法

ThinkPHP6.0.13反序列化漏洞分析

可以發現,pool屬性和key屬性我們都可以控制。因此可能存在兩種路線,呼叫不同類別的同名方法(getItem)。或是直接嘗試觸發__call方法。我們來看看POC作者是怎麼讓反序列化進行下去的。

ThinkPHP6.0.13反序列化漏洞分析

作者用建構法傳入了exp,exp其實是在實例化Channel類別。我們進入Channel類別查看

ThinkPHP6.0.13反序列化漏洞分析

Channel類別中有一個__call方法,那麼作者是選擇觸發__call來讓鍊子繼續下去。這個call方法接受了兩個參數,method是寫死的(getItem),parameters是可控的(即前面可控的key屬性)

ThinkPHP6.0.13反序列化漏洞分析

跟入log方法查看,其接受三個傳參(但其實對後續的鍊子沒啥用),傳入record方法

ThinkPHP6.0.13反序列化漏洞分析

##跟入record方法

ThinkPHP6.0.13反序列化漏洞分析

#再回傳查看作者的POC,發現其控制lazy屬性為false,讓函數進入最後一個if分支執行save方法

1ThinkPHP6.0.13反序列化漏洞分析##那麼save方法應該是比較關鍵的方法了,跟入save方法,這裡面有三個可能被利用的點,作者選擇了哪一個呢?

1ThinkPHP6.0.13反序列化漏洞分析根據POC不難發現作者選擇了控制logger屬性,利用建構子對其賦值,令其為Socket類別的物件

1ThinkPHP6.0.13反序列化漏洞分析

1ThinkPHP6.0.13反序列化漏洞分析在這個類別中,我們找到了一個複雜的同名方法,其中有大量的操作。

1ThinkPHP6.0.13反序列化漏洞分析我們繼續來看作者是怎麼建構的,作者控制config屬性,給其賦值為陣列。陣列有以下內容

1ThinkPHP6.0.13反序列化漏洞分析關鍵在於這兩個鍵值,作者控制config,讓程式執行到呼叫invoke方法的分支

1ThinkPHP6.0.13反序列化漏洞分析同時,app屬性可控,作者令app屬性為App類別的對象,我們進入App類別

1ThinkPHP6.0.13反序列化漏洞分析這裡先看看App類別的的exists方法的情況,在其父類別中找到了這個方法

繼續往後,這裡對App類別進行了唯一一個操作,控制了instances屬性的值。這裡控制其值是為了進入Request類,並且執行url方法

ThinkPHP6.0.13反序列化漏洞分析

2ThinkPHP6.0.13反序列化漏洞分析

#作者在這裡對Request類別做出唯一的操縱,就是控制url屬性的值。可以看出,如果url屬性存在,那麼就會進入第一個分支,其值等於本身。

2ThinkPHP6.0.13反序列化漏洞分析

同時又注意到,complete我們之前傳入的是true。因此最終回傳的結果就是$this->domain().$url,url我們已經控制了,那麼domain方法回傳什麼呢?

2ThinkPHP6.0.13反序列化漏洞分析

#OK,這點我們就不用看了。分析了這麼多,我們得到了$currentUri最後的值,就是:

http://localhost/

2ThinkPHP6.0.13反序列化漏洞分析

currentUri作為一個陣列被傳入invoke了,根據鍊子的長度,達到invoke,我們的反序列化之旅就快結束了

2ThinkPHP6.0.13反序列化漏洞分析

#查看invoke,App類別找不到這個方法,在他的父類別裡找到了這個方法

2ThinkPHP6.0.13反序列化漏洞分析

這裡可以看到。這個函數內有三個分支走向,那麼最後會走向哪裡呢?根據我們先前$config['format_head']的傳入, 首先我們傳入的這個物件不是Closure的實例或子類,也不符合第二個分支的條件

2ThinkPHP6.0.13反序列化漏洞分析

因此進入到第三個分支。我們跟進invokeMethod()方法。這裡傳入的$callabel就是[new \think\view\driver\Php,'display']、而$vars就是['http://localhost/']

2ThinkPHP6.0.13反序列化漏洞分析

注意,我們傳入的$method是數組,因此進入第一個分支。把new \think\view\driver\Php (即物件)賦值給$class,’display’(即方法名稱)賦值給新的$method。

然後下面進行了一個判斷,如果$class是對象,那麼其值就為它本身,因為我們傳入的是對象,所以這裡沒什麼變化。然後進入最關鍵的程式碼

可以看到,把物件new \think\view\driver\Php 以及方法 display傳入了ReflectionMethod。

2ThinkPHP6.0.13反序列化漏洞分析

在最後,呼叫invokeArgs方法,傳入了new \think\view\driver\Php對象,同時傳入了$args

ThinkPHP6.0.13反序列化漏洞分析

#那麼args是什麼呢?

3ThinkPHP6.0.13反序列化漏洞分析

我們跟入之後發現是一個處理函數,因為本人比較懶,而且到這都快分析完了,就不去硬讀了,直接給結論,總之我們傳入的$vars ,也即['http://localhost/'] 其中的關鍵部分保留了下來,並且進入了後續的傳參中

3ThinkPHP6.0.13反序列化漏洞分析

##繼續往後看,對於這個函數(invokeArgs),可以簡單的類比call_user_func(),因此最後的關鍵程式碼其實只有這兩行

3ThinkPHP6.0.13反序列化漏洞分析

#也即

$reflect = new ReflectionMethod(new \think\view\driver\Php,’display’);
return $reflect->invokeArgs(new \think\view\driver\Php,’ ’)

常看tp反序列化的朋友就知道,已經結束咧嘴!畢竟呼叫display方法了。但是上述這個呼叫ReflectionMethod類別的操作到底是什麼呢?我們可以藉助如下實例來示範。所以說這玩意和call_user_func很像

3ThinkPHP6.0.13反序列化漏洞分析

最後是display方法,沒什麼好說的了,content傳入display方法中,eval執行指令了

3ThinkPHP6.0.13反序列化漏洞分析

#結語

TP的鍊子一如既往的有意思(以及復雜),特別是最後的ReflectionMethod類別的用法上,如果不了解這個類別以及類別中的方法組合可以實現類似call_user_func函數的作用的話,那麼就很容易錯過這樣一個精彩的漏洞。

【相關教學推薦:thinkphp框架

以上是ThinkPHP6.0.13反序列化漏洞分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:公众号--合天网安实验室。如有侵權,請聯絡admin@php.cn刪除
ThinkPHP內置測試框架的關鍵功能是什麼?ThinkPHP內置測試框架的關鍵功能是什麼?Mar 18, 2025 pm 05:01 PM

本文討論了ThinkPHP的內置測試框架,突出了其關鍵功能(例如單元和集成測試),以及它如何通過早期的錯誤檢測和改進的代碼質量來增強應用程序可靠性。

如何使用ThinkPHP來構建實時股票市場數據源?如何使用ThinkPHP來構建實時股票市場數據源?Mar 18, 2025 pm 04:57 PM

文章討論了使用ThinkPHP進行實時股票市場數據提要,重點是設置,數據準確性,優化和安全措施。

在無服務器體系結構中使用ThinkPHP的關鍵注意事項是什麼?在無服務器體系結構中使用ThinkPHP的關鍵注意事項是什麼?Mar 18, 2025 pm 04:54 PM

本文討論了在無服務器體系結構中使用ThinkPHP的關鍵注意事項,專注於性能優化,無狀態設計和安全性。它突出了諸如成本效率和可擴展性之類的收益,但也應對挑戰

如何在ThinkPHP微服務中實現服務發現和負載平衡?如何在ThinkPHP微服務中實現服務發現和負載平衡?Mar 18, 2025 pm 04:51 PM

本文討論了在ThinkPHP微服務中實施服務發現和負載平衡,重點是設置,最佳實踐,集成方法和推薦工具。[159個字符]

ThinkPHP依賴性注入容器的高級功能是什麼?ThinkPHP依賴性注入容器的高級功能是什麼?Mar 18, 2025 pm 04:50 PM

ThinkPHP的IOC容器提供了高級功能,例如懶惰加載,上下文綁定和方法注入PHP App中有效依賴性管理的方法。Character計數:159

如何使用ThinkPHP來構建實時協作工具?如何使用ThinkPHP來構建實時協作工具?Mar 18, 2025 pm 04:49 PM

本文討論了使用ThinkPHP來構建實時協作工具,重點關注設置,Websocket集成和安全性最佳實踐。

使用ThinkPHP來構建SaaS應用程序的主要好處是什麼?使用ThinkPHP來構建SaaS應用程序的主要好處是什麼?Mar 18, 2025 pm 04:46 PM

ThinkPHP具有輕巧的設計,MVC架構和可擴展性。它通過各種功能提高可擴展性,加快開發並提高安全性。

如何使用ThinkPHP和RabbitMQ構建分佈式任務隊列系統?如何使用ThinkPHP和RabbitMQ構建分佈式任務隊列系統?Mar 18, 2025 pm 04:45 PM

本文概述了使用ThinkPhp和RabbitMQ構建分佈式任務隊列系統,重點是安裝,配置,任務管理和可擴展性。關鍵問題包括確保高可用性,避免常見的陷阱,例如不當

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。