这题比起实验吧的那个WAF要复杂一点,然后write up我还没搜过,先自己写一写。
题目链接
解题思路
寻找注入点
首先管他什么题,点开就查看页面源码总是不亏的,果然这道题的flag——不是,hint就在页面源码的最下面:
也就是说这道题虽然是需要账号密码,但实际上我们只需要拿到密码就ok,重点是不需要爆破数据库的各种名字,感觉工作量少了一大半。
接下来就用用户名admin和随便填的弱口令去试探一下,发现这题两个参数:uname和pwd,均使用post方法发送,直接上burpsuite。
然后在uname和pwd两个参数后面分别加’试一试,发现uname参数后加’时回显有明显变化,而pwd参数后加’时回显无变化,确定注入点在uname参数上。
uname的回显信息如下:
- 数据库查询到数据:password error!
- 数据库没有查询到数据或sql语句出错:no such user!
- 触发WAF:naive(呵呵)
绕过WAF
很明显,又是一道布尔型盲注,那就先惯例上基本的注入语句试探一下WAF。
既然知道了目标字段是pwd,那就简单粗暴点:
输入
1 | uname=admin' and length(pwd)>10;#&pwd=admin |
输出
预料中的结果,接下来就换不同的输入试探WAF,发现以下输入被WAF过滤了:
- and
- 空格
- mid
- substr
- substring
- sleep
- select
and被过滤掉了比较不好办,于是尝试替换成%26%26(&&),发现是可行的:
空格虽然被过滤了,但是所幸括号没有被过滤,所以空格被过滤无关紧要。
可以看到盲注中重要的函数mid\substr\substring全被WAF挡下来了,但是还有两个函数被忽略了,strcmp和left是可以使用的:
到这里就WAF就被我们成功绕过了,接下来就是愉快的代码时间~
编写脚本
首先要说明一点,pwd的长度是我手工注入得出的,这里就没有写进代码里。
还需要注意的是构造post方法的data时,不要使用url编码。
1 | #author: sinex8 |
总结
其实后来想了一下,strcmp和left函数没有必要一起用,只用left函数也是可以的。
这道题比实验吧的那道要复杂一点,WAF过滤了常用的函数,足以吓到我这样的菜鸡,不过还不算变态,反正多学习了解sql中的函数是很有必要的!