網鼎盃 2020 青龍組 AreUSerialz

2021-10-24 05:24:58 字數 2722 閱讀 7136

考點:

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對類屬性型別不敏感。

php=====的比較繞過。

檢視原始碼可以看出,get方式傳入變數str,會經過反序列化得到乙個類的物件$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...