sql注入绕过方法总结

  • 3
  • 78 views
  • A+
所属分类:安全文章


前言
   SQL在CTF每一次比赛中基本上都会出现,所以有了这一篇总结,防忘,最后更新于2018/10/11。

      简而言之:SQL注入用户输入的数据变成了代码被执行

sql注入绕过方法总结

我们希望用户输入的 id 的值,仅仅是一个字符串,传入数据库执行,但是当输入了:2 or 1=1 时,其中的 or 1=1 是作为了 sql语句 来执行的。

sql注入绕过

以下绕过方式可自己在虚拟机搭建一个mysql数据库环境,实际操作练习;


注释符号绕过

常用的注释符有

sql注入绕过方法总结

实例

sql注入绕过方法总结

sql注入绕过方法总结

sql注入绕过方法总结


大小写绕过

常用于 waf的正则对大小写不敏感的情况,一般都是题目自己故意这样设计。
例如:waf过滤了关键字
select,可以尝试使用Select等绕过。

sql注入绕过方法总结


内联注释绕过

内联注释就是把一些特有的仅在MYSQL上的语句放在 /*!...*/ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。

sql注入绕过方法总结


双写关键字绕过

在某一些简单的waf中,将关键字select等只使用replace()函数置换为空,这时候可以使用双写关键字绕过。例如select变成seleselectct,在经过waf的处理之后又变成select,达到绕过的要求。


特殊编码绕过

十六进制绕过

sql注入绕过方法总结

ascii编码绕过
Test 等价于
CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)
tip:好像新版mysql不能用了


空格过滤绕过

一般绕过空格过滤的方法有以下几种方法来取代空格

sql注入绕过方法总结

实例

sql注入绕过方法总结

sql注入绕过方法总结

sql注入绕过方法总结

sql注入绕过方法总结


过滤or and xor not 绕过

sql注入绕过方法总结

过滤等号=绕过

不加通配符like执行的效果和=一致,所以可以用来绕过。
正常加上通配符的like

sql注入绕过方法总结

不加上通配符的like可以用来取代=

sql注入绕过方法总结

rlike:模糊匹配,只要字段的值中存在要查找的 部分 就会被选择出来
用来取代
=时,rlike的用法和上面的like一样,没有通配符效果和=一样

sql注入绕过方法总结

regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配

sql注入绕过方法总结

使用大小于号来绕过

sql注入绕过方法总结

<> 等价于 !=
所以在前面再加一个
!结果就是等号了

sql注入绕过方法总结

等号绕过也可以使用strcmp(str1,str2)函数、between关键字等,具体可以参考后面的过滤大小于号绕过


过滤大小于号绕过

在sql盲注中,一般使用大小于号来判断ascii码值的大小来达到爆破的效果。但是如果过滤了大小于号的话,那就凉凉。怎么会呢,可以使用以下的关键字来绕过

  • greatest(n1, n2, n3…):返回n中的最大值

sql注入绕过方法总结

  • least(n1,n2,n3…):返回n中的最小值

  • strcmp(str1,str2):若所有的字符串均相同,则返回STRCMP(),若根据当前分类次序,第一个参数小于第二个,则返回  -1,其它情况返回 1

sql注入绕过方法总结

in关键字

sql注入绕过方法总结

between a and b:范围在a-b之间

sql注入绕过方法总结

使用between a and b判等

sql注入绕过方法总结


过滤引号绕过

  • 使用十六进制

sql注入绕过方法总结

  • 宽字节

常用在web应用使用的字符集为GBK时,并且过滤了引号,就可以试试宽字节。

sql注入绕过方法总结


过滤逗号绕过

sql盲注时常用到以下的函数:

    substr()
        substr(string, pos, len):从pos开始,取长度为len的子串
        substr(string, pos):从pos开始,取到string的最后


    substring()
        用法和substr()一样


    mid()
        用法和substr()一样,但是mid()是为了向下兼容VB6.0,已经过时,以上的几个函数的pos都是从1开始的


    left()和right()
        left(string, len)和right(string, len):分别是从左或从右取string中长度为len的子串


    limit
        limit pos len:在返回项中从pos开始去len个返回值,pos的从0开始


    ascii()和char()
        ascii(char):把char这个字符转为ascii码
        char(ascii_int):和ascii()的作用相反,将ascii码转字符


回到正题,如果waf过滤了逗号,并且只能盲注(盲注基本离不开逗号啊喂),在取子串的几个函数中,有一个替代逗号的方法就是使用from pos for len,其中pos代表从pos个开始读取len长度的子串
例如在
substr()等函数中,常规的写法是

sql注入绕过方法总结

如果过滤了逗号,可以这样使用from pos for len来取代

sql注入绕过方法总结

在sql盲注中,如果过滤逗号,以下参考下面的写法绕过

sql注入绕过方法总结

也可使用join关键字来绕过

sql注入绕过方法总结

其中的

sql注入绕过方法总结

等价于

sql注入绕过方法总结

使用like关键字
适用于
substr()等提取子串的函数中的逗号

sql注入绕过方法总结

使用offset关键字
适用于
limit中的逗号被过滤的情况
limit 2,1等价于limit 1 offset 2

sql注入绕过方法总结


过滤函数绕过

  • sleep() -->benchmark()

sql注入绕过方法总结

sql注入绕过方法总结

  • ascii()–>hex()、bin()
    替代之后再使用对应的进制转string即可

  • group_concat()–>concat_ws()

sql注入绕过方法总结

  • substr(),substring(),mid()可以相互取代, 取子串的函数还有left(),right()

  • user() --> @@user、datadir–>@@datadir

  • ord()–>ascii():这两个函数在处理英文时效果一样,但是处理中文等时不一致。




转载自:https://blog.csdn.net/huanghelouzi/article/details/82995313

本文始发于微信公众号(LemonSec):sql注入绕过方法总结

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:3   其中:访客  0   博主  0

    • bowman 3

      收藏了

        • admin Admin

          @bowman 你不会是机器人吧

        • bowman 3

          收藏了,