前言
最近在学习怎么绕WAF,遇到某网站的登录框存在注入,我们现在来看一下。
0x01判断注入点
使用burp进行抓包,发送到repeater模式,对数据包进行重放。
正常请求
一个单引号
两个单引号
三个、四个、……呈现周期性的变化,说明此时后端数据库可直接识别用户输入的单引号 (程序未对用户输入的数据进行过滤、或过滤不严导致用户数据被后端数据库当作代码执行)。
0x02 Bypass过程
构造可行的轮子,方便后续变形:admin’) or (‘a’='a) #
阿这,居然有WAF,接下来开始绕WAF之旅
这个时候我们猜测一下拦截了哪些字符
1)、括号()
2)、or
3)、空格
4)、=
然后便进行尝试,首先尝试发送 or 看是否被拦截
逐个发送进行尝试,发现都没有被拦截
但是只要用 = 与其他字符连接就会被拦截
尝试使用select ,发现没有被过滤
构造POC:admin’) or (select+1=1)
发现为真时返回-2000
当他为假时,返回-1000
轮子已经构造好,接下来开始构造POC
尝试查询 user() 、database() 等内容
经过一番尝试,user()、database()、version()等等函数 都waf拦截了
难道是正则匹配到了user? 还是()?Fuzz ‘user’将user作为字符串进行传递测试一波
POC : admin’) or (select + ‘user’ = ‘a’)#
页面恢复正常,如果是正则匹配到user进行拦截,那么这个包应该会WAF拦截
POC:admin’) or (select + ‘()’ = ‘a’)#
单引号内使用(),页面也恢复正常,说明()也不会拦截
发现l*!jzf*/ 、 /!Ljzf/ 、/!29440user/,%0a,%0b等绕过方式,但都进行尝试了无果。那么换位思考,我不要括号行不行?
发现语法报错了,不能这样使用,尝试使用current_user试一下。
页面返回正常,接下来使用 _ 和 like 进行模糊查询 。
使用_ 代表一个字符去跑 ,得到current_user的长度为:6位
POC:admin’) or (select + current_user+like+’__’)
接下来发送到Intruder模块去进行爆破
因为其中有一个%,不是特别确定,接下来使用 = 去验证一下
发现返回-2000
最终成功爆出用户名,提交,完成。