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

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


咨詢
建站咨詢
