bypass即绕过,一般绕过是绕过防火墙,绕过waf,绕过本地的360,绕过网站的看门狗等
waf检测机制其实很简单,核心就是正则匹配,虽然说还有字符串强行匹配,还有什么语义解析,但是实际上还是正则居多
所有的网站都会与数据库交互,但不一定所有的网站都存在SQL注入漏洞,因为可以对输入的内容进行过滤特殊字符,关键字,空格等,一般都可以使用别的字符代替
过滤空格时的绕过
- #绕过空格——注释时可以使用#,但在hackbar里面执行可能会不成功,因为#是URL里面的特殊字符,代表注释,是给浏览器用了,不会到服务端去,此时应当使用其URL编码%23,GET类型下,浏览器会现对GET请求进行一次解码,服务端对POST不会进行URL解码,URL和POST没有关系——因为此时不是地址栏
- /**/绕过空格——在逻辑语句and 1=1 时,使用的就是单纯的空格,此时不能使用#了,而要在其中使用 /**/ ——MySQL自定义的注释符,可以代替空格,此时语句会正常执行
- 括号绕过空格——把需要加空格的地方是用括号括起来,也就是说,把注入的逻辑语句当作一个函数,如and(1=2),但使用中,如果语句很长的话,加小括号的过程会非常麻烦,也有些语法是不支持小括号的,加了的话可能会影响执行
- 双写绕过空格——使用两个空格(双写)绕过对空格的过滤
- %09绕过空格——php语言支持把%09当作一个小括号来执行,URL解码之后是一串空格,大概相当于一个tab
- %0a绕过空格——换行,使用中有可能可以代替空格,MySQL语句也支持解析换行
- + 绕过空格——在某些特殊场景下,也可以代替空格,可以一试——在URL里面代表空格,或者%2B
- %a0绕过空格 —— 不可见字符串,就是菱方块里面一个问号
URL编码——防止歧义,因为浏览器会编码,服务端会进行解码
过滤引号时的绕过
使用hex编码进行绕过,MySQL支持解析16进制,可使用引号的hex编码绕过对引号的过滤——但使用时,要将引号及其内部的所有内容一起转化为16进制
过滤逗号时的绕过
- 盲注中使用 “substr(0,1),” 时使用from...for绕过——可以使用 substr(from 0 for 1) 进行绕过
- limit的逗号被过滤时,可以使用offset关键字——limit 2,1 等价于 limit 1 offset 2
- 使用join关键字来绕过——union select 1,2,3 等价于 union select * from (select 1)a join (select 2)b join(select 3)c
过滤大小于符号时的过滤
- 盲注时,< > 被过滤时,可以使用 = 来注入——如 and ascii(substr(database(),1,1)=64 等价于 and greatest(ascii(substr(database(),0,1)),64)=64,least() 函数同理
- 也可使用between a and b —— 范围在a-b之间(id between 1 and 1 与 id = 1 效果相同)
过滤注释符时的绕过
注释符的绕过,可以通过使用单引号闭合原本传参的后引号,使前引号与注入的引号正常传参,后引号作为一个普通字符串,中间注入所需的语句进行查询及提权
单引号必须是在逻辑语句的中间————and 1='1
如:id=1' union select 1,2,'3
http://192.168.138.98/sqlilabs/Less-1/?id=1' and 1='1
单引号必须是在逻辑语句的中间————and 1='1,也可以套娃id=1' and 1=1 and '1
使用 order by 的时候,则不能这样使用单引号注释掉
但是可以使用Union联合盲猜
如:?id=1' union select 1,2,'3————猜一下有没有3列
00截断也可以直接断开后面的内容
http://192.168.138.98/sqlilabs/Less-1/?id=1' and 1=1;%00
过滤等号时的绕过
- 可以使用 like 代替 = 直接绕过——MySQL查询语句的模糊查询
- 使用大小于号来绕过,id > 1 and id < 3 与 id = 1 效果一样
- <>等价于!= 所以在前面加一个!结果就是等号 !(id<>1) 与 id = 1 效果一样
还可以使用正则匹配来绕过
过滤关键字的绕过
- 正则匹配到关键字之后置空,乱序双写即可—— 如过滤的是and关键字,可以使用anandd来绕过
- 大小写绕过——使用大小写混写绕过
- 中间加/**/绕过——如an/**/d绕过,极少情况下可以成功绕过
过滤使用的函数为preg_replace(pattern:'xxx/i',replacement:"xxxx")函数——用于作正则匹配和过滤限制,当检测的特征对象参数中含有 i 时,则会检测大小写
过滤函数的原理
按照顺序一个字母一个字母的查询,然后匹配,如果遇到and,就换为空格,前两个字母连查,没有遇见and,放过,然后遇见完整的and,置为空,然后查到d——不是and,所以放过,此时的d和前两个连查的an一起组成了注入关键字and————在cipe考试中较为常见
此外还可以进行堆叠查询:攻击者可以尝试通过在一个SQL注入点执行多个查询语句,从而执行多个查询操作或执行恶意操作。