在sql注入中,通常会将某些关键的字符过滤掉,以此来达到预防sql注入的目的。这时我们就可以通过某些技巧来绕过。
绕过技巧1:
这个是在某个比赛中出现的,当时并没有多少人成功绕过。
如下:
如下图:在php中写了一个正则表达式,过滤用户输入的数据。
这里的正则表达式表示当用户输入中存在: select * from时就报错。(过滤了该语句)
我们继续使用sql语句注入的话就会报错,导致sql注入失败。
在这里给大家推荐一个网站:
regex101: build, test, and debug regex :它可以将正则表达式输入,将语句输入后可以看到匹配到了语句中的哪一些部分:清楚看到过滤了select * from这部分语句。
- 如上:\b匹配from的单词边界。
思考:要是匹配的单词边界不是from但是同时具备from的功能不就可以绕过正则表达式的过滤了。是否存在一个东西加在from的前面和不加在from一样我们就可以绕过了。
存在一个方法:科学计数法。(mysql支持科学计数法)
使用科学计数法进行绕过:
如下图所示:当我们在1e1前面不加逗号时查不出来,加了逗号后查出来了,同时又会多出一列数据。看到这里我们就可以知道怎么绕过了。
使用下面进行绕过:
id=-1' union select 1,group_concat(username,0x3a,password),1e1from users--+
select 1,group_concat(username,0x3a,password),1e1from users -------因为会多出一列所以我们需要将3删掉。此时我们就绕过正则表达式查询出来了数据。
绕过技巧2:
当使用正则表达式过滤了infromation后,我们有什么办法绕过。
解决方法:我们只需要找到与information库有类似作用的库就可以。
注意:以sys开头的只有root才能访问。不过一般情况下为root的可能性很小。
总结:这两个技巧是我们常用的技巧,当某一个我们需要使用的东西被过滤后我们就需要去思考是否可以去找个替代它。