业务讲堂
技术研究
最新文章
技术分享 | 记一次Bypass SQL 注入
作者:UGUARDSEC 发表日期:2021/08/18 来源:原创

前言

最近在学习怎么绕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模块去进行爆破


因为其中有一个%,不是特别确定,接下来使用 = 去验证一下


上一篇:技术分享 | mimikatz的常见使用方法
下一篇:已经是最后一篇