一、SQL注入防御方法
1、过滤关键字符
对一些sql语句中可能出现的关键词进行过滤
2、编码/转义特殊符号
对用户输入的编码进行编码或转义,使其无法产生原有效果
3、语义分析拦截 (比如Python中的libinjection)
对用户输入进行判断,保证不存在于任意可执行的sql语句的片段中
https://github.com/client9/libinjection
二、靶机简单的防御绕过以及burpsuite工具使用
1、medium 级别
2、burpsuite工具使用
三、其他常见的简单防御绕过
1、大小写绕过
如果waf
的正则对大小写不敏感,则可以考虑大小写绕过,比如waf过滤了关键字select、union
,可以尝试使用Select、Union
等绕过
2、双写关键字绕过
如果waf
将关键字select
等只使用replace()
函数置换为空,这时候可以使用双写关键字绕过。例如select
变成seleselectct
,在经过waf
的处理之后又变成select
,达到绕过的要求。
3、十六进制绕过
会使用到引号的地方一般是在最后的where子句中。如下面的一条sql语句,这条语句就是一个简单的用来查选得到users表中所有字段的一条语句:
select column_name from information_schema.tables where table_name="users"
这个时候如果引号被过滤了,那么上面的where子句就无法使用了。那么遇到这样的问题就要使用十六进制来处理这个问题了。
users的十六进制的字符串是7573657273。那么最后的sql语句就变为了:
select column_name from information_schema.tables where table_name=0x7573657273
4、空格绕过
①两个空格、tab、回车(url编码中的%0a)r码中的%0a)回车(url编码中的%0a)回车(url编码中的%0a)回车(url编码中的%0a)
②/**/ select/**/*/**/from/**/;
③() select(id)from(users);
④`(tap键上面的按钮) select`id`from`users`where`id`=1;
5、or and xor not 绕过
①and = &&
②or = ||
③xor = | # 异或
④not = !
6、等号=绕过
不加通配符的like执行的效果和=一致,所以可以用来绕过(某些情况也可以使用><绕过)
7、宽字节绕过
如果过滤 ' 的时候往往利用的思路是将 ' 转换为 \' 。
在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字,所以思路是:%df 吃掉 \ 具体的方法是 urlencode(\') = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(')符号在外面:
id=6%df%5c%27union select 1,user() #