SQL注入:SQL注入防御

本文详细介绍了SQL注入的防御方法,包括过滤关键字符、编码/转义特殊符号和语义分析拦截,并讨论了靶机防御绕过技巧,如大小写、双写关键字、十六进制和空格绕过等。同时,提到了使用burpsuite工具进行测试的场景,以及常见的防御绕过策略,如使用特殊字符组合规避过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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() #

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值