小水一篇,也记录一下对笔者而言难得才做一次的CTF。
题目
简简单单的ping注入。
尝试命令执行
尝试读文件
后台执行ping命令,很容易想到拼接命令进行RCE。
尝试使用1.1.1.1|ls进行注入,成功:
再试一些常用命令:
可以看到只有cat被拦截了,但对于这种类型的拦截我一开始想的是大小写,但转念一想bash哪来的大小写绕过。不过读文件的函数肯定绝不止cat一个,换用其它参数试试。
试了几个less/tail/more/uniq,居然都不拦,看来这道ctf还是比较简单。不过这里我犯了个错,这个错误导致我后面花了大概半个小时走弯路......
黑色幽灵
既然能读文件,那肯定先读一读flag。不过我对这道题的源码有点兴趣,还是决定先读读源码。
使用1.1.1.1|more index.php,尝试读取源码,失败:
这是拦截了啥?想半天没想明白,平常做的题太少,现在第一时间怀疑的竟然是拦截了cat|uniq|more|less [^ ]{1,})。
那难道要继续找不被拦截的命令?想着试一下其它命令,居然都被拦,最后敲了个不是命令的字符串都拦截。
这,这不对吧,难道拦的是([a-z]{1,} [^ ]{1,})?于是我终于恍然大悟——拦的是空格啊- -。
空格绕过
这下看一看源码:
<?php
error_reporting(0);
echo "POST my ip and I will ping it! or ping myselfn";
echo "Note: you should base64 ip!";
$target = isset($_REQUEST['ip']) ? base64_decode($_REQUEST['ip']) : '127.0.0.1';
$blacklist = [' ', '&', ';', 'cat', 'flag', 'bin', 'ca?'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $target)) {
die('Hacker!');
}
}
$cmd = shell_exec( 'ping -c 4 ' . $target );
echo "<pre>$cmd</pre>";
?></pre>
一共就ban了空格、cat和flag这三个比较重要的内容,题目远比我想象中的要简单。
字符串绕过
到这一步其实已经有很多很多办法了,但是人总爱钻牛角尖研究自最不擅长的部分。
这里我又犯了个错误,一直想用base64解码来绕过flag的拦截,不过靶机上貌似没有base64这个命令,总执行不成功。
还好快下班了,想下班的心情阻止我在歪门邪道上一去不复返,直接使用常见的几个绕过手段,flag:
成功flag。
原文始发于微信公众号(重生之成为赛博女保安):记一次简简单单CTF
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论