[FBCTF2019]RCEService
buu上的题,最近打工开始划水,又要搞网鼎杯了,赶紧报一下佛脚
json文件格式
我太菜了,json属性字段一定要用双引号括起来,单引号是不可以的,为此我一开始试了半天,为什么输入什么东西都显示上了waf。。。
题解
这个题,buu上什么都没给,后来去查wp,才知道题目描述是只允许使用ls,然后顺便还翻到了源码,一开始设置了一句putenv('PATH=/home/rceservice/jail');
,这个文件夹下面就放了一个ls的二进制文件。这样子就能让我们只能使用这个文件夹下的命令了吗?显然我们可以用绝对路径的方法去使用需要的命令,/bin/ls之类的就可以了
然后是一个超级禁用,用preg_match函数ban掉了各种各样的东西,能ban的都ban了。但是preg_match这个函数本身是存在缺陷的,有两点,分别导致了预期解和非预期解
正则匹配回溯上限
正则匹配是通过不断回溯的方式去寻找字符串的,如果字符串听特别特别长,就可能导致回溯过多消耗大量资源,所以php设置有正则迭代上限,默认100w,如果我们的数据超过回溯上限,那个preg_match函数会返回false,表示匹配失败(找没找到返回的是1和0),所以preg_match的判断失当会导致绕过
在json中加一项无关紧要的项整个100w长的字符串就可以了,不过这里有一个点,buu上这个题是通过GET传参的,而url长度是存在上限的,受不同浏览器限制,http协议并未限制url长度,根据网上的说法大部分浏览器大概在7-8k字节左右,显然不能传一个这么长的字符串,源码中接受的数据是用的$_REQUEST,也许要自己发一个post包过去才行
GET请求长度相关连接
http://blog.chinaunix.net/uid-26602509-id-4495786.html
具体正则是怎么匹配的可以看P神的文章
https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.html
preg_match匹配第一行
正则匹配是以换行符为结尾的,如果要匹配包括换行符的整个字符,需要设置一个正则的flag,因此我们把payload换行藏起来就可以了。
%0a换行符,用绝对路径调用命令{%0a"cmd":"/bin/cat /home/rceservice/flag"%0a}