考點:
php反序列化
原始碼:
<?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))
}
漏洞原理
php7對類屬性型別不敏感。檢視原始碼可以看出,get方式傳入變數str,會經過反序列化得到乙個類的物件php
===
和==
的比較繞過。
$obj
。
再看類filehandler
,在read()
函式中發現了敏感函式file_get_contenst()
、在write()
函式裡面發現了file_put_contents
。
而這兩個函式在process
函式中,被呼叫了,當op==『1』
時,呼叫寫函式,當op==『2』
時,呼叫讀函式。而process
函式在__destruct()
中被呼叫了。
__destruct
函式中對op使用了===
比較,在process()
函式中使用了==
比較,此時可以用數字op=1
繞過,===
會比較函式兩邊點的型別是否一致,而==
不會。
再傳入str的時候,發現對str進行了過濾,is_valid
對傳入的引數進行了檢查,只允許ascii為32-125
的字元傳入。
而protected許可權的變數經過序列化後會產生%00*%00
,%00
的ascii碼為0
。
此時可以將屬性型別改為public
來繞過。因為php7對類屬性型別不敏感。
那麼此時有兩種思路:
第一種思路:寫一句話進去
構造乙個filehandler 類的例項的序列化字串傳入str,str被反序列化得到$obj,就是filehandler類的例項。
在這個程式結束時,例項obj
被銷毀會呼叫__destruct()
函式。此時如果obj->op==1
,就能將$content
寫入到$filename
裡面去。
構造payload:
報錯,沒有寫檔案的許可權。
第二種思路:直接讀flag.php。
<?php
class
filehandler$a=
newfilehandler()
;$b=serialize($a
);echo
$b;
payload:
?str=o:11:"filehandler":3:
get flag。 網鼎盃 2020 青龍組 AreUSerialz
知識點 php強型別比較,可以通過 不同型別 達到繞過目的 php7.1以上版本 對類的型別定義不敏感 file get contents 偽協議檔案讀取 include flag.php highlight file file class filehandler public function p...
網鼎盃 2020 青龍組 notes wp
人生艱難,做了兩天。學到不少。給了js 第一次做js題,賊難受。var express require express var path require path const undefsafe require undefsafe const require child process expres...
網鼎盃 2020 青龍組 AreUSerialz
include flag.php highlight file file class filehandler public function process else if this op 2 else private function write res file put contents thi...