新聞中心
本篇文章給大家?guī)砹岁P(guān)于php的相關(guān)知識,其中主要介紹了關(guān)于反序列化字符逃逸的相關(guān)問題,php序列化后的字符串經(jīng)過替換或修改,導(dǎo)致字符串長度變化,總是先序列化,在進(jìn)行替換修改操作,下面一起來看一下,希望對大家有幫助。

推薦學(xué)習(xí):《PHP視頻教程》
本質(zhì):閉合
分類:字符變多、字符變少
共同點(diǎn):
- php序列化后的字符串經(jīng)過替換或修改,導(dǎo)致字符串長度變化
- 總是先序列化,在進(jìn)行替換修改操作
字符增多
- 思路:
根據(jù)序列化后字符串格式與特點(diǎn),字符個(gè)數(shù)標(biāo)識了后面要識別的長度
要修改某個(gè)屬性就要將其替換,可通過傳入的字符串控制
要將前面的雙引號閉合,再傳入后面要構(gòu)造的字符
但是此時(shí)與前面字符串長度不匹配,構(gòu)造無效
解決:根據(jù)替換字符長度變化,將構(gòu)造的字符串?dāng)D出長度范圍,成為下一部分
(要用替換時(shí)的長度變換填補(bǔ)注入字符串的空缺) - tips:
- 判斷每個(gè)字符過濾后會(huì)比原字符多出x個(gè)
- 確定要注入的目標(biāo)子串的長度n
- 注入字符重復(fù)n/x遍,并帶上注入字符 (構(gòu)造代碼的長度÷多出的字符數(shù))
- 例:
目標(biāo):修改對象中一個(gè)數(shù)值,如age要改為20
"; $r = filter(serialize($user)); var_dump($r); var_dump(unserialize($r)); ?>
下面部分可以記作模板,做題時(shí)先輸出看一下
var_dump(serialize($user)); # 序列化 echo ""; $r = filter(serialize($user)); # 替換后序列化 var_dump($r); var_dump(unserialize($r)); # 打印反序列化可以觀察到,每次替換將p改為ww,即每次都多出一個(gè)字符
這就導(dǎo)致反序列化時(shí)長度分配讀取錯(cuò)誤而輸出錯(cuò)誤
所以考慮通過其長度讀取的性質(zhì)來構(gòu)造字符逃逸要將10改為20,先確定后面要構(gòu)造的字符串:
原字符串:";i:1;s:2:"10";} 目標(biāo)子串:";i:1;s:2:"20";}確定長度:16(即傳入的字符串需要多出16個(gè)字符來將這些字符放到下一個(gè)屬性的位置上去)
每次多1個(gè)字符,故需要16個(gè)p
故傳入:
結(jié)果輸出:字符減少
值逃逸
值過濾,前值包后鍵與值(左括號為止)
- 例
目標(biāo):age改為20
"; $r = filter(serialize($user)); # 替換后序列化 var_dump ($r); var_dump (unserialize($r)); # 打印反序列 ?>
與上面代碼相似,只是此時(shí)是將2個(gè)p替換為一個(gè)w,字符減少
同樣數(shù)值不對應(yīng)會(huì)反序列化失敗
A后面是傳入的age字符串,計(jì)算構(gòu)造長度
即要占位這13個(gè)字符
每2個(gè)p變1個(gè)w,相當(dāng)于逃逸一位,故輸入13*2=26個(gè)p,字符長度標(biāo)識為26,變?yōu)?3個(gè)w,后面13個(gè)字符占余下13位
payload:
username='pppppppppppppppppppppppppp' age=A";i:1;s:2:"20";}
總結(jié)
- 字符增多
- 看第一個(gè)參數(shù)結(jié)尾后的引號到最后右括號的長度(目標(biāo)字符串)n
- 看每次替換增量x
- 用n/x個(gè)替換字符和構(gòu)造代碼構(gòu)造,傳入序列化對象
- 字符減少
- 用第二個(gè)參數(shù)構(gòu)造
- 開頭設(shè)置閉合:A"(后面再考慮怎么構(gòu)造)
- 看第一個(gè)參數(shù)后的右引號到A有多少個(gè)字符n
- 替換減少x個(gè)字符
- 創(chuàng)建對象:
第一個(gè)參數(shù)傳入n*(x+1)個(gè)替換字符
第二個(gè)參數(shù)傳入構(gòu)造的字符串
本文題目:PHP反序列化詳細(xì)解析之字符逃逸
標(biāo)題鏈接:http://www.dlmjj.cn/article/dhppgpe.html


咨詢
建站咨詢
