yii2反序列化0day後續

2021-10-09 16:13:19 字數 2347 閱讀 9721

在我前幾天發文過後,我看了其它師傅們挖的利用鏈,其中有乙個是我之前忽略了的

這是一條利用__wakeup魔術方法作為入口的利用鏈,然後我就去看了看,有所收穫,所以簡單和大家分享一下

問題出在symfony\component\string\unicodestring,我們看下它的wakeup方法:

public function __wakeup()

這裡呼叫了normalizer_is_normalized,我一開始沒有想到這個函式也會把引數當做字串處理,也就是說這裡也可以利用__tostring進一步利用

結合前文,我們可以很輕鬆的構造一條利用鏈出來:

symfony\component\string\unicodestring::__wakeup()->phpdocumentor\reflection\docblock\tags\see::__tostring()-> faker\generator::__call() -> yii\rest\indexaction::run()

但是,當我用我生成的payload去測試的時候,直接報錯了

我當時也沒有去搜這個錯誤是啥意思,以為是normalizer_is_normalized內部還有其他機制,然後我就去找了一下其他的__tostring方法,但是都報這個錯(其它利用鏈我會在後面提到)

後來去查了一下,原來是php版本問題,preg_unmatched_as_null這個靜態變數只在php7.2以上才有,而我用的是php7.1,所以公升級一下,然後測試,結果

又報錯了…如下

我去查了一下,這個應該是yii的檢視報錯了導致無法回顯命令執行的結果,所以,我利用dnslog來驗證命令是否執行,如下:

可以看到命令成功執行了

<?php 

namespace yii\rest

}}namespace faker

}}namespace phpdocumentor\reflection\docblock\tags

}}namespace symfony\component\string

}}namespace

?>

yii2真是乙個練習反序列化連挖掘的好靶場,我們可以通過它來練習各種魔術方法在反序列化鏈構造中的使用

php所有的魔術方法如下:

這裡我本打算再利用__invoke構造乙個,我的想法如下:

symfony\component\string\unicodestring::__wakeup()->symfony\component\string\lazystring::__tostring()-> \swift_streamcollector::__invoke()->phpdocumentor\reflection\docblock\tags\see::__tostring()->faker\generator::__call() -> yii\rest\indexaction::run()

你看到這個鏈可能覺得我這是脫褲子放屁,但是在前面那個鏈報錯的情況下,我才想出了這麼乙個鏈,以為可以不報錯

我們看下lazystring的tostring方法:

public function __tostring()

try catch (\throwable $e)

}

可以看到上面**中有($this->value)(),我一開始以為這裡不就可以利用__invoke進行利用嗎,但是後來發現我天真了,這報錯給我安排的明明白白

可以看到,($this->value)()這種形式是利用不了__invoke

簡單記錄下這個錯誤,也算是給大家排個坑吧

我是阿信,乙個想要活得不平凡的普通人,我們下次見

序列化反序列化

只要用到網路開發啊,就一定會用到序列化反序列化。1,自定義結構體 struct test int len int type char data 10 test data test buffer.缺點 明文,只支援基本型別,不支援變長結構 2,在1的基礎上,自定義乙個緩衝類,存放乙個訊息。把訊息寫入緩...

序列化反序列化

using system using system.collections.generic using system.io using system.linq using system.text using system.threading.tasks namespace 序列化反序列化 syste...

序列化和反序列化 C 序列化與反序列化。

序列化介紹 把物件用一種新的格式來表示。系列化只序列化資料。序列化不建議使用自動屬性 為什麼要序列化 將乙個複雜的物件轉換流,方便儲存與資訊交換。class program class person public int age 二進位制序列化 就是將物件變成流的過程,把物件變成byte class...