一.sql注入绕过概念
1.为什么要绕过? 因为有时候存在注入,但是很多符号被过滤掉, 所以我们不的不使用绕过手段。
2.绕过就是虽然我们注入时使用的字符串或者符号被过滤,但我们依然可以使他报错,并且报出他的数据库表名等
二.sql注入绕过手段
1.注释符
通常是用来注释掉id=1’ 这个单引号,或者字符串
2.单行注释
- -+(通常直接在浏览器拼接) 或 --空格(通常在插件中使用) 或#
列1:
?id=1’ --+ 就起到注释单引号的作用
同理,–空格和#也是一样
演变1:
?id=-1’ union select 1,2,3 --+ 同样是起到闭合前面单引号的作用
演变2:
如果过滤了注释符怎么办了?
答案:我们可以使用单引号闭合前面的单引号,这样就不会报错
可以使用‘ or 1=’1
?id=1’ or 1=’1 返回正常
?id=1’ or 1=’2 返回报错
3.这时候我们知道了
哦!!!
注释符在sql注入中多是起到闭合单引号,和注释单引号的作用
如下图1,2总结
设想如果程序员过滤了
and or 和select等我们注入的字符怎么办?
方法
1.MySQL大小写不铭感
所以我们可以大小写绕过
比如:sELEct
2.吧值或参数转为16进制,或者url编码
3.吧and 替换为 && ,吧or替换为 ||
4.内联注释和多行注释
可以插入字符串等
如下图总结
5.双写绕过
比如:
oorr
当过滤了or时
中间那个or就不在了
但是还是剩下一个or
哈哈,所以依然可以绕过
如下图总结
当发现过滤一些参数时
我们可以用sqlma --hex
可以绕过部分
6.最后我们来看看一个过滤函数
第一个参数:过滤的变量值
第二个参数:需要替换成为的变量
第三个参数:在此参数中只要涵有第一个参数的值都过滤为第二参数我们改变的值
可以看到
在id中吧含有# ,-- ,“”的全部过滤为空
三.sql绕过演示
打开less-11
id=1返回正常
加’ 报错并且推出sql语句
使用–空格
发现无法注释掉前面的单引号,说明过滤了-- 和空格
使用or 1=‘1 闭合前面的单引号返回正常
再次证明他确实过滤了-- 空格
因为空格别过滤
但是我们用+代替
但是要注意+和url编码字符要在浏览器中使用,不要在插件,容易出错
如下图
的到了数据库名
我们来看看源码
确实–被过滤了
难怪
接着下一个案例
less-25
直接单引号报错,分析出SQL语句
输入and 1=‘1
发现没有显示
说明and和or肯定被过滤了
使用||绕过
成功
也可以双写绕过
同样成功
看看源码,
确实过滤了and
和or
使用联合查询
爆他字段
接着就可以进行其他爆破,就不演示了,因为sql注入发现注入点,就可以使用sqlmap直接探测或使用脚本探测的。
打开less-26
加”
报错,推出SQL语句
如图操作
发现原语句空格不在了
由此推断过滤了空格
我们使用%0a代替空格
返回正常
四.总结
1.双写绕过
2.大小写混合绕过
3.|| 和&&绕过
4.空格绕过(%0a)
5.内联绕过
6.注释符(or 1=’1)
7.注意:当使用url编码和+时在浏览器导航使用,不要在插件使用