【网络安全】「漏洞原理」(一)SQL 注入漏洞之概念介绍

前言

本篇博文是《从0到1学习安全测试》中漏洞原理 系列的第 篇博文,主要内容是研究 SQL 注入原理,了解 SQL 语法和特性 ,往期系列文章请访问博主的 安全测试 专栏;

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

SQL 注入介绍

SQL 注入(SQL Injection) 是一种常见的网络攻击技术,它利用应用程序对用户输入数据的处理不当,向数据库中注入恶意代码,从而达到攻击数据库的目的。

通常情况下,应用程序接收用户输入数据,将其作为参数传递给数据库执行 SQL 查询语句。如果应用程序没有正确地过滤和验证用户的输入,攻击者就可以通过构造恶意输入,将 SQL 代码注入到查询语句中,从而执行恶意操作,比如删除、修改或者泄露数据库中的敏感信息。

例如,假设一个应用程序接收用户输入的用户名和密码,然后通过以下 SQL 查询语句验证用户是否存在:

sql 复制代码
SELECT * FROM users WHERE username = '$username' AND password = '$password'

如果应用程序没有对用户输入进行过滤和验证,那么攻击者可以通过构造恶意输入,将 SQL 代码注入到查询语句中,例如:

ini 复制代码
username = 'admin' OR 1=1 --'

这个恶意输入将查询语句变为:

sql 复制代码
SELECT * FROM users WHERE username = 'admin' OR 1=1 --' AND password = '$password'

这个查询语句中的 OR 1=1 将始终返回 True,因此该查询将返回所有用户的信息,而不仅仅是管理员账户信息。攻击者可以利用这种方式来绕过身份验证、获取敏感信息或者进行其他恶意操作。

运行结果:

注入漏洞分类

常见的 SQL 注入类型包括:数字型和字符型。但不管注入类型如何,攻击者的目的只有一个,那就是绕过程序限制,使用户输入的数据带入数据库执行,利用数据库的特殊性获取更多的信息或者更大的权限。

数字型注入

数字型 SQL 注入发生在应用程序将用户输入作为数值类型(如整数、浮点数)直接插入到 SQL 查询语句中时,攻击者可以通过在用户输入中添加特定的SQL语法来修改查询。例如,考虑以下示例的查询:

sql 复制代码
SELECT * FROM users WHERE id = $user_id;

如果应用程序没有正确验证和过滤用户提供的 $user_id 值,攻击者可以在输入中注入额外的 SQL 代码,如下所示:

  1. $user_id = 1'

    SQL 语句为 SELECT * FROM users WHERE id = 1',这样的语句肯定会报错,导致脚本程序无法从数据库中正常获取数据,从而使得原来的页面出现异常;

  2. $user_id = 1 and 1 = 1

    SQL 语句为 SELECT * FROM users WHERE id = 1 and 1 = 1,语句正常执行,返回数据与原始请求无差异;

  3. $user_id = 1 and 1 = 2

    SQL 语句为 SELECT * FROM users WHERE id = 1 and 1 = 2,语句正常执行,但却无法查询出数据,因为 and 1 = 2 始终为假,所以返回数据与原始请求存在差异;

如果以上三个步骤全部满足,则程序就可能存在 SQL 注入漏洞;

不过,也不需要过于担心,因为这种数字型注入最多出现在 ASP、PHP 等弱类型语言中,弱类型语言会自动推导变量类型;而对于 Java、C# 这类强类型语言,如果试图把一个字符串转换为 int 类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

字符型注入

数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般使用单引号来闭合。

例句如下所示:

sql 复制代码
SELECT * FROM users WHERE username = 'admin';

字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。

当攻击者进行 SQL 注入时,如果输入 admin and 1=1,则无法进行注入,因为 admin and 1=1 会被数据库当做查询的字符串,SQL 语句如下所示:

sql 复制代码
SELECT * FROM users WHERE username = 'admin and 1=1';

运行结果:

这时候想要进行注入,则必须注意字符串闭合问题。如果输入 admin' and 1=1 -- 就可以继续输入,SQL 语句如下:

sql 复制代码
SELECT * FROM users WHERE username = 'admin' and 1=1 --';

运行结果:

只要是字符串类型注入,都必须闭合单引号以及注释多余的代码。

SQLMap

SQLMap 是一款开源的自动化 SQL 注入工具。它可以用来检测和利用 Web 应用程序中的 SQL 注入漏洞。

SQLMap 可以自动进行漏洞检测、漏洞利用和数据库提权等操作,它支持各种不同类型的数据库,并且具有强大的功能和灵活的配置选项。


下面是使用 SQLMap 的一些步骤:

步骤1:收集目标信息。

在进行安全检查之前,需要收集目标 Web 应用程序的相关信息,如 URL、参数等。这些信息将在后续的步骤中使用。

步骤2:进行漏洞扫描。

使用以下命令启动 SQLMap 并进行漏洞扫描:

xml 复制代码
sqlmap -u <target_url>

运行结果:

步骤3:获取数据库。

css 复制代码
sqlmap -u <target_url> --dbs

使用 --dbs 参数读取数据库。

步骤4:选择数据库。

根据漏洞扫描的结果,选择一个数据库进行深入检查。假设选择数据库名为 db_name

步骤5:探测数据库信息。

运行以下命令来收集有关选定数据库的信息:

css 复制代码
sqlmap -u <target_url> -D db_name --tables

命令将列出目标数据库中的所有表。

步骤6:选择一个表。

选择要进一步探测的表。假设选择表名为 table_name

步骤7:提取表数据。

运行以下命令来提取选定表的数据:

css 复制代码
sqlmap -u <target_url> -D db_name -T table_name --dump

命令将提取并显示选定表的所有数据。


要获得更多输出并了解 SQLMap 正在做什么,可以使用 -v 标志增加详细级别 0-6(默认 1)。

sql 复制代码
0: Show only Python tracebacks, error and critical messages.
1: Show also information and warning messages.
2: Show also debug messages.
3: Show also payloads injected.
4: Show also HTTP requests.
5: Show also HTTP responses' headers.
6: Show also HTTP responses' page content.

防止措施

SQL 注入攻击的问题最终归于用户可以控制输入,有输入的地方,就可能存在风险。

要防止SQL注入,可以采取以下措施:

  1. 使用参数化查询或预编译语句:使用参数化查询或预编译语句可以将用户输入作为参数传递给数据库,而不是将其直接拼接到 SQL 查询语句中,这样可以防止恶意用户通过输入特殊字符来修改原始查询。
  2. 输入验证和过滤:对于用户输入的数据,进行验证和过滤,确保只接受预期的数据类型和格式,使用正则表达式、白名单过滤或黑名单过滤等方法来限制输入的内容。
  3. 最小权限原则:为数据库用户分配最小的权限,避免给用户过多的权限,限制用户的操作范围。
  4. 定期更新和修复漏洞:及时关注数据库和应用程序的安全公告,及时更新和修复已知的漏洞。
  5. 强化安全意识培训:通过培训和教育,提高开发人员和相关人员对 SQL 注入漏洞的认识和理解,及时更新和运行常规的安全检查工具。

后记

本文介绍了 SQL 注入的概念,划分了数字型和字符型注入两种类型,并介绍了 SQLMap 工具的使用。同时,提出了防止 SQL 注入的措施,通过综合采取这些措施,我们可以建立更安全的应用程序,并保护数据的安全性。

以上就是 SQL 注入漏洞之概念介绍 的所有内容了,希望本篇博文对大家有所帮助!

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

📝 上篇精讲:这是第一篇,没有上一篇喔~

💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注,创作不易,请多多支持;

👍 公众号:sidiot的技术驿站

🔥 系列专栏:安全测试工具和技术:从漏洞扫描到渗透测试

相关推荐
想用offer打牌4 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX5 小时前
服务异步通信
开发语言·后端·微服务·ruby
Hello.Reader5 小时前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
智驱力人工智能6 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
数据与后端架构提升之路6 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
Cobyte7 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
麦聪聊数据7 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构