sql int 转 string_sql注入绕过方法总结

前言   SQL在CTF每一次比赛中基本上都会出现,所以有了这一篇总结,防忘,最后更新于2018/10/11。      简而言之:SQL注入用户输入的数据变成了代码被执行

e991ff9a3b8b8423f093b82203272be3.png

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

sql注入绕过

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

注释符号绕过

常用的注释符有

8e664bad32f5aae6d8264d4e3719df4c.png

实例

d7c4a95a328c1f66b03b6e990c7ac100.png

7086a62231789031781f3fc718b6dac2.png

615b7b8d1bdb426addca53de9c5140f9.png

大小写绕过

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

392e3c0f590f11bc73e7fd398a2c2184.png

内联注释绕过

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

d5790ef39782ec619385c43a3ce72123.png

双写关键字绕过

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

特殊编码绕过

十六进制绕过

f69ea0734b084ed4f2af9215a00d4a25.png

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

空格过滤绕过

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

1f18815f112cceb3250270e2e5000d12.png

实例

06d601d7a931ed14b812c456d9c7fc0f.png

7a62a0724a8853c43add30e9c0d8e308.png

befb47357bcd0c761b9cfcbc47a84a1b.png

8b143661d7870b0ab31873ebb10864eb.png

过滤or and xor not 绕过

ca75da44466263bfb542ad76b54997c2.png

过滤等号=绕过

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

59308b9255744a36ab48ab045caed236.png

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

caf5116c0e2c38962e41d74bc7076493.png

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

3aa36a24cba5d0885f60849ce8f56c74.png

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

77ef7ccb7243db74b0751ec7a8a80e4d.png

使用大小于号来绕过

e05e9649270b7d5dbae849d747d46215.png

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

962bc14fcbad00efd199878b240e5092.png

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

过滤大小于号绕过

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

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

e0adc08b7270432a7260930a2707b447.png

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

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

d0935edd76c0098d8a5de6f945649fed.png

in关键字

b656995fe93bd6ecede28586c3f05c9d.png

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

0913f7692398cfadf0d94a8f8c42f17b.png

使用between a and b判等

8dea4a2b2a59ecd4bdbd2ec8ae761d8f.png

过滤引号绕过

  • 使用十六进制

a1afa459becbd69184672ad4634a579a.png

  • 宽字节

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

cd59ea749c45602e0ed05297e25cf33d.png

过滤逗号绕过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() 等函数中,常规的写法是

958044fa92fedd3e937fc916768096ba.png

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

5d789fd95fb9c2dec3805348b024af23.png

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

b196fc0a29051243cc71f5444857b4dc.png

也可使用 join 关键字来绕过

08a3a8858fc72e44be370f95e490baa9.png

其中的

d7cca622f2a16a708af340bd032c20ca.png

等价于

7dccdba738e1ab89765d415aecb1fe7f.png

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

229717d3ad68c1c99850fd00d1556cf1.png

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

7259ad358ac7a03992997aeac8e45dd5.png

过滤函数绕过

  • sleep() -->benchmark()

a47e0c9a4669454f23efc5fa8fc272c5.png

05d7dc08e6e5a4a403ffe56c08d89526.png

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

  • group_concat()–>concat_ws()

6c017559993cbaabc389f901294de3ce.png

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值