Web安全:SQL注入漏洞详解,SQL注入常见功能、危害、分类、判断注入点、注入方式

发布于:2024-05-07 ⋅ 阅读:(25) ⋅ 点赞:(0)

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。

这一章节我们需要知道SQL注入常出现在那些功能,如何判断注入点,注入的分类有哪些以及具体的注入方式。

在这里插入图片描述

SQL注入的原理其实很简单:在传给后端的「参数」中构造「SQL语句」,改变原有的「SQL语法结构」,实现对数据库的操作。

1、SQL注入常出现在哪些功能?

凡是涉及「数据库操作的功能」,都有可能存在SQL注入,比如:

  1. 搜索框等查询功能。
  2. 用户注册/用户登录功能。
  3. 密码找回功能。
  4. 用户资料修改功能。
  5. 以及其他同质化功能。

「流量」的角度来看,SQL注入经常出现在:

  1. Get请求传递的参数
  2. Post请求的表单里
  3. Cookie
  4. HTTP请求头的 User-Agent、X-Forworded-For、以及其他传递数据的字段。

2、SQL注入危害

SQL注入的危害主要取决于对数据的操作。

1)首先是数据的查询操作,也就是脱库,对应的危害是敏感信息泄露。

2)其次是数据的修改操作,比如把字段的值改为改成网页链接,对应的危害是网页篡改和挂马。

3)再就是数据的删除操作,删掉数据库的数据,导致系统瘫痪。

4)再就是写入后门文件,拿服务器的权限,远程控制。

3、SQL注入分类

根据输入的 「参数」类型,可以把SQL注入分为:「数值型」注入、 「字符型」注入。

  • 数值型注入:数值+括号型
  • 字符型注入:单引号字符型、双引号字符型、单引号字符串+括号型、双引号字符串+括号型

1)比如下面这个根据ID查询用户的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xw240yvV-1645149522105)(E:\data\TyporaPages\image-20220212164303912.png)]
后台对应的SQL如下,「字段类型」是数值型,这种就是数值型注入。

select * from user where id = 1;

2)比如下面这个登录功能,输入的用户名和密码是字符串。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FF5m4MCS-1645149253353)(E:\data\TyporaPages\image-20220212164911231.png)]
后台对应的SQL如下,「字段类型」是字符型,这种就是字符型注入。

select * from user 
where username = 'zhangsan' and password = '123abc';

因为值可以用单双引号、括号包裹,所以在数值型注入和字符型注入的基础上,还存在以下变种:

1)值使用「单引号」包裹时,叫做单引号字符型注入:

select * from user where username = 'zhangsan';

2)值使用「双引号」包裹时,叫做双引号字符型注入:

select * from user where username = "zhangsan";

3)值使用括号包裹数值型,叫数值+括号型注入:

select * from user where id = (1);
select * from user where id = ((1));
包裹多个括号……

4)值使用括号和单引号包包裹,叫单引号字符串+括号型注入:

select * from user where username = ('zhangsan');
select * from user where username = (('zhangsan'));
包裹多个括号……

值使用括号和双引号包裹,叫双引号字符串+括号型注入;

select * from user where username = ("zhangsan");
select * from user where username = (("zhangsan"));
包裹多个括号……

4、判断是否存在SQL注入

在参数中输入「单/双引号」,页面有报错就有可能存在注入点:

  • 输入单引号报错:数值型注入 或 单引号字符型注入
  • 输入双引号报错:数值型注入 或 双引号字符型注入

1)对于「数值型」注入,在参数中添加单、双引号都会报错。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xkJShOct-1645349676655)(E:\data\TyporaPages\image-20220212171335494.png)]
在这里插入图片描述

2)对于「单引号字符型」注入,在参数中添加单引号会报错,而添加双引号时不会报错。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGCfOzyU-1645349676664)(E:\data\TyporaPages\image-20220212170231652.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QuGDhppn-1645349676666)(E:\data\TyporaPages\image-20220212170944397.png)]

3)对于「双引号字符型」注入,在参数中添加单引号不会报错,而添加双引号时会报错。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G95sRyQa-1645349676669)(E:\data\TyporaPages\image-20220212171608874.png)]
在这里插入图片描述

在数值型、字符型注入的基础上,尝试不同的引号+括号组合,判断出注入点类型,就可以构造SQL语句测试了。

SQL恒成立时页面正常显示,SQL恒不成立时页面异常显示,就说明存在注入:

  • ?id=1 and true – a 页面正常显示
  • ?id=1 and false – a 页面异常(空)显示

5、SQL注入方式

根据利用方式可以分为:

  • 联合注入:使用union关键字拼接多条查询语句。
  • 报错注入:使用报错函数执行SQL语句。
  • 布尔盲注:改变SQL的恒等条件,根据页面响应判断SQL执行结果。
  • 时间盲注:使用延时函数,根据页面响应时间判断SQL执行结果。

6、SQL注入防御

SQL注入的防御分为三个方面::参数过滤 , 预编译 以及 限制权限和报错

  1. 「参数过滤」以各种厂商的WAF以及代码逻辑为主,比如替换空格、关键字、双写、大小写、特殊字符转义等。
  2. 「预编译」主要依赖各种框架,比如Java的mybatis框架 和 PHP的 thinkphp框架
  3. 限制「权限」「报错」是指限制数据库的权限,以及控制数据库的报错信息,报错信息不要对外展示

6.1、预编译

SQL注入的核心是用户输入的参数改变了SQL的语法结构。而预编译,可以防止语法结构被改变。
SQL在执行前,需要先进行语法结构编译,正常情况下,用户输入的参数会参与语法结构编译,如果参数中包含SQL语法关键词,就会改变SQL的语法结构。

预编译的逻辑是先编译完SQL语法结构,再拼接用户的参数。用户输入的参数不参与语法编译过程,就无法改变语法结构,从而防止SQL注入。

详细原理可以查看我的另一篇文章: 预编译防止SQL注入的原理