临睡前刷公众号看见四叶草网络安全学院的命令执行漏洞演习第二弹活动,解出题目就赠送一张Web知识体系的鼠标垫,作为热爱挑(白)战(嫖)的Web划水成员,自然要挑战一下。
进入题目看到一个输入框:
先ls
列出文件看看:flag.php index.php start.sh
那么目标很明确,是需要读取flag.php文件
简单fuzz一下发现过滤了cat flag { } ( ) / &
等关键词
这样一来取反、绕过、变量拼接、编码绕过的办法就无法使用了,这个时候想起WUST-CTF 2020中的一道RCE题目(朴实无华 具体可见https://buuoj.cn/challenges#[WUSTCTF2020]%E6%9C%B4%E5%AE%9E%E6%97%A0%E5%8D%8E)
在那道题目中,除了可以利用/
来绕过对cat
关键词的检测外,还可以通过 more `ls`
命令来读取该目录下所有文件的内容
先来学习一下more命令:
Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似)。
那么more `ls`
的意思就是将ls返回的内容当作参数来让more执行,最终也就等同于more flag.php index.php start.sh
做到这里不得不再说一个老生常谈的问题:PHP代码不能被浏览器解析,因此读取php文件时一定要查看源代码
查看源代码得到Flag:
最后再看一看题目是怎么写的:
<?php
$cmd=$_POST['cmd'];
$blacklist="cat|/|cd|flag|curl|{|(|'|"|echo|\\|&|grep|base64";
$arr=explode('|',$blacklist);
foreach ($arr as $key => $value) {
#var_dump($value);
if (preg_match("/$value/i", $cmd)) {
exit('hacker~~~');
}
}
system($cmd);
?>
可以看到题目过滤了一些字符以及命令,那么除了more `ls`
外,还有很多命令可以绕过这里的过滤,列举几个常见的可以替代cat的命令:
less
、tac
、vi
、head
、tail
、nl
、sed
、sort
等
同时more `ls`
中的 `ls`
也可以用*
通配符来代替,这道题至少有十种以上的解法,算是比较基础的一道题了,正好也趁此机会对RCE的bypass做一个小小的总结