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

devtools/2024/10/18 16:50:51/

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

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

在这里插入图片描述

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

SQL注入

  • 1、SQL注入常出现在哪些功能?
  • 2、SQL注入危害
  • 3、SQL注入分类
  • 4、判断是否存在SQL注入
  • 5、SQL注入方式
  • 6、SQL注入防御
    • 6.1、预编译

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如下,「字段类型」是数值型,这种就是数值型注入。

sql">select * from user where id = 1;

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

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

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

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

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

sql">select * from user where username = 'zhangsan';

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

sql">select * from user where username = "zhangsan";

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

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

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

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

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

sql">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注入的原理


http://www.ppmy.cn/devtools/34433.html

相关文章

go mod

常用命令 初始化模块 go mod init 模块名下载 go.mod 文件中指明的所有依赖 go mod download github.com/gin-gonic/ginv1.9.(依赖路径)依赖对其(使引用的都是所依赖的) go mod tidy编辑go.mod go mod edit go mod edit -require"github.com/g…

【Python项目】基于时间序列的【大气污染预测系统】

技术简介:使用Python技术、B/S架构、MYSQL数据库等实现。 系统简介:本系统的主要使用角色为普通用户和管理员用户,两者的功能几乎是一致的,但管理员用户比普通用户多了用户管理的功能,可以对系统内的用户进行管理。普通…

stylus详解与引入

Stylus 是一个富有表现力的、动态的、健壳的 CSS 预处理器,它允许开发者使用更加高级的技术来编写 CSS,使得 CSS 代码更加简洁和强大。Stylus 可以帮助开发者使用变量、混合(mixins)、函数等功能来创建更加模块化和可重用的 CSS。…

CMakeLists.txt语法规则:部分常用命令说明四

一. 简介 前面几篇文章学习了CMakeLists.txt语法中前面几篇文章学习了CMakeLists.txt语法中部分常用命令。文章如下: CMakeLists.txt语法规则:部分常用命令说明一-CSDN博客 CMakeLists.txt语法规则:部分常用命令说明二-CSDN博客 CMakeLi…

C# 中 object.ReferenceEquals 方法

在 C# 中,object.ReferenceEquals 方法用于确定两个对象是否引用同一个内存地址。它是一个静态方法,可以通过 object.ReferenceEquals(obj1, obj2) 的方式调用。 以下是对 object.ReferenceEquals 的详细解释和示例说明: object.ReferenceEq…

Devuan增加硬盘无法启动

/boot/grub/grub.cfg linux /vmlinuz root/dev/sda4 改为: linux /vmlinuz rootUUID*

MySQL安装和启停

上一篇文章介绍了数据库的一些基本概念,以及MySQL的数据模型,并在文章末尾附上了MySQL的下载地址,但是对于安装过程并没有进行详细的介绍,所以这篇文章主要介绍一下MySQL的安装和启停。 MySQL安装 0.安装说明 一个主机上安装多个…

docker-本地私有仓库、harbor私有仓库部署与管理

一、本地私有仓库: 1、本地私有仓库简介: docker本地仓库,存放镜像,本地的机器上传和下载,pull/push。 使用私有仓库有许多优点: 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下…