5-1〔OSCP ◈ 研记〕❘ SQL注入攻击▸SQL注入理论基础
郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。
💥👉点赞❤️ 关注🔔 收藏⭐️ 评论💬💥
更多文章戳👉Whoami!-CSDN博客🚀
𖤐 让我们开启SQL注入的新世界吧,走起 !
𖤐 𝓛𝓮𝓽'𝓼 𝓸𝓹𝓮𝓷 𝓾𝓹 𝓪 𝓷𝓮𝔀 𝔀𝓸𝓻𝓵𝓭 𝓸𝓯 𝓢𝓠𝓛 𝓲𝓷𝓳𝓮𝓬𝓽𝓲𝓸𝓷,𝓱𝓮𝓻𝓮 𝔀𝓮 𝓰𝓸 !
→ 信息收集
→ 漏洞检测
→ 初始立足点
→ 权限提升 ▸SQL注入攻击▸SQL注入理论基础-----我们在这儿~ 🔥🔥🔥
→ 横向移动
→ 报告/分析
→ 教训/修复
目录
1.SQL注入攻击
1.1SQL理论与数据库基础
1.1.1 SQL理论基础
1.1.1.1 SQL语言分类
1. 数据查询语言(DQL)
2. 数据操作语言(DML)
3. 数据定义语言(DDL)
4. 数据控制语言(DCL)
5. 事务控制语言(TCL)
1.1.1.2 高级SQL特性
1.事务处理与ACID属性
2.索引优化
3.视图与安全
4.数据库对象关系
1.1.2 Web应用架构组件
1.1.3 主流数据库类型
1.1.3.1 SQL查询示例
1.1.3.2 在Web应用程序嵌入SQL查询
1.1.4 SQL注入攻击
1.1.4.1 SQL注入攻击原理
1.1.4.2 攻击流程解析
1.1.4.3 漏洞根本原因分析
1.1.5 常见SQL分类
1.1.5.1 主要分类概览
1.1.5.2 按技术原理分类
1. 基于错误的注入 (Error-Based)
2. 布尔盲注 (Boolean-Based Blind)
3. 时间盲注 (Time-Based Blind)
4. 联合查询注入 (Union-Based)
5. 堆叠查询注入 (Stacked Queries)
1.1.5.3 按数据传递方式分类
1. 一阶注入 (First-Order)
2. 二阶注入 (Second-Order)
1.1.5.4 按参数类型分类
1. 数字型注入 (Numeric)
2. 字符型注入 (String)
3. 搜索型注入 (Like)
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
1.SQL注入攻击
SQL注入(SQLi) 是当前最严重的Web应用安全威胁之一,在OWASP Top 10应用安全风险中排名第三。这种漏洞允许攻击者干预应用程序与数据库之间的SQL查询,访问未授权的敏感数据。
⚡SQL注入(SQLi) 核心风险
干预SQL查询执行
访问受限数据库表
潜在的系统命令执行
数据泄露和篡改
1.1SQL理论
1.1.1 SQL理论基础
结构化查询语言(SQL) 是专门用于管理和交互关系数据库中数据的标准语言。
SQL主要功能:
✅ 查询数据
✅ 插入新数据
✅ 修改现有数据
✅ 删除数据
⚠️ 在某些情况下执行操作系统命令
1.1.1.1 SQL语言分类
五大子语言体系:
1. 数据查询语言(DQL)
核心命令: SELECT
-- 基础查询结构 SELECT 列名1, 列名2 FROM 表名 WHERE 条件 GROUP BY 分组列 HAVING 分组条件 ORDER BY 排序列;
高级查询功能:
-
🔍 子查询:嵌套查询语句
-
🔗 连接查询:多表关联
-
📈 聚合函数:COUNT, SUM, AVG, MAX, MIN
-
🎯 条件表达式:CASE WHEN
2. 数据操作语言(DML)
核心功能: 操作表中的数据
操作 | 语法示例 | 功能描述 |
---|---|---|
INSERT | INSERT INTO users VALUES (1, 'John') | 插入新记录 |
UPDATE | UPDATE users SET name='Mike' WHERE id=1 | 更新现有记录 |
DELETE | DELETE FROM users WHERE id=1 | 删除记录 |
3. 数据定义语言(DDL)
核心功能: 定义和管理数据库结构
-- 创建表 CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );-- 修改表结构 ALTER TABLE users ADD COLUMN age INT;-- 删除表 DROP TABLE users;
主要对象:
-
📋 表(Table)
-
🎯 索引(Index)
-
👁️ 视图(View)
-
🗄️ 模式(Schema)
4. 数据控制语言(DCL)
核心功能: 权限管理
-- 授予权限 GRANT SELECT, INSERT ON users TO user1;-- 撤销权限 REVOKE DELETE ON users FROM user1;
5. 事务控制语言(TCL)
核心功能: 管理数据库事务
START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; COMMIT; -- 或 ROLLBACK;
1.1.1.2 高级SQL特性
1.事务处理与ACID属性
属性 | 描述 | 实现机制 |
---|---|---|
原子性 (Atomicity) | 事务全部完成或全部回滚 | 事务日志 |
一致性 (Consistency) | 保持数据完整性约束 | 约束检查 |
隔离性 (Isolation) | 并发事务互不干扰 | 锁机制 |
持久性 (Durability) | 提交后数据永久保存 | 重做日志 |
2.索引优化
索引类型:
-
🔑 主键索引:唯一标识记录
-
🎯 唯一索引:确保列值唯一
-
📊 复合索引:多列组合索引
-
🔍 全文索引:文本内容搜索
-- 创建索引 CREATE INDEX idx_user_email ON users(email); CREATE UNIQUE INDEX idx_product_sku ON products(sku);
3.视图与安全
-- 创建视图隐藏敏感数据 CREATE VIEW user_public_info AS SELECT user_id, username, created_at FROM users WHERE active = true; -- 使用视图 SELECT * FROM user_public_info;
4.数据库对象关系
1.1.2 Web应用架构组件
组件 | 技术栈 | 功能描述 |
---|---|---|
前端 | HTML, CSS, JavaScript | 用户界面交互:使用HTML、CSS和JavaScript编写不同的代码块创建。 |
后端 | PHP, Java, Python等 | 业务逻辑处理:在客户端与前端交互之后,它将数据发送到运行在服务器上的后端应用层。使用多种不同的框架来构建后端应用程序. |
数据库 | MySQL, SQL Server等 | 数据存储管理:后端代码以各种方式与数据库中的数据进行交互,例如:检索与给定用户名相关联的密码。 |
1.1.3 主流数据库类型
数据库 | 特点 | 使用场景 |
---|---|---|
MySQL | 开源、流行 | Web应用 |
Microsoft SQL Server | 企业级、Windows生态 | 企业应用 |
PostgreSQL | 高级特性、开源 | 复杂应用 |
Oracle | 企业级、高性能 | 大型企业 |
1.1.3.1 SQL查询示例
SELECT * FROM users WHERE username='leon'
部分 | 功能说明 |
---|---|
SELECT * | 选择所有字段 |
FROM users | 从users表 |
WHERE username='leon' | 条件筛选 |
1.1.3.2 在Web应用程序嵌入SQL查询
为了自动化功能,Web应用程序通常在其源代码中嵌入SQL查询。
通过检查以下后端PHP代码部分,该部分负责在登录期间验证用户提交的凭据:
<?php
// 数据库连接
$con = mysqli_connect("localhost", "root", "password", "database_name");// 从POST请求获取用户输入
$uname = $_POST['username'];
$passwd = $_POST['password'];// 🚨 危险:直接拼接用户输入到SQL查询!
$sql_query = "SELECT * FROM users WHERE username='" . $uname . "' AND password='" . $passwd . "'";// 执行查询
$result = mysqli_query($con, $sql_query);// 关闭连接
mysqli_close($con);
?>
🔧 数据库连接说明
-
$con
变量存储数据库连接资源 -
使用
mysqli_connect()
建立连接。注意:mysqli_query()PHP函数中的 i 代表改进,并且不应与漏洞(因为SQLi中的i代表注入)混淆。 -
连接参数:服务器、用户名、密码、数据库名
-
操作完成后用
mysqli_close()
关闭连接
1.1.4 SQL注入攻击
1.1.4.1 SQL注入攻击原理
【攻击原理】审查上述代码片段,uname和 passwd变量都是从用户的POST请求中检索并直接插入到sql_query字符串中,没有进行任何先前的检查。
这意味着攻击者可以在SQL语句执行之前修改最终的SQL语句。攻击者可以在 user或password字段中插入一个SQL语句,以破坏预期的应用程序逻辑,来查询非授权的数据。
🎯 正常场景
用户输入:
leon
生成SQL:SELECT * FROM users WHERE username='
leon'
解析
:
上面蓝色字体是输入框输入的值leon,黑色部分是网页源代码,正常输出查询结果。
⚠️ 攻击场景
恶意输入:
leon' +!@#$
被篡改的SQL:SELECT * FROM users WHERE username='
leon' +!@#$解析
:
原先输入的是蓝色部分leon;后来红色部分内容leon' +!@#$,leon后带一个' ,先把leon形成一个闭环,然后又拼接了特殊字符。我们的代码块中没有检查这些特殊字符,导致被执行,这就是一个SQL注入漏洞。
1.1.4.2 攻击流程解析
1.1.4.3 漏洞根本原因分析
问题环节 | 具体问题 | 后果 |
---|---|---|
输入验证 | 无用户输入检查 | 任意SQL代码执行 |
查询构建 | 直接字符串拼接 | SQL逻辑被破坏 |
参数处理 | 未使用参数化查询 | 注入漏洞产生 |
1.1.5 常见SQL分类
1.1.5.1 主要分类概览
分类维度 | 主要类型 | 特点说明 |
---|---|---|
技术原理 | 基于错误、布尔盲注、时间盲注、联合查询、堆叠查询 | 根据利用方式和技术手段分类 |
数据传递 | 一阶注入、二阶注入(下次触发) | 根据攻击触发时机分类 |
参数类型 | 数字型、字符型、搜索型 | 根据注入点数据类型分类 |
1.1.5.2 按技术原理分类
1. 基于错误的注入 (Error-Based)
说明:利用数据库错误信息直接获取数据
-- 示例:通过错误信息获取数据库名, ' AND 1=CAST((SELECT database()) AS INT) --备注:因为数据库名通常是非数字字符串,CAST(... AS INT) 很可能失败或返回 0,从而使该比较为假,或者在某些数据库/配置下触发类型转换错误并输出错误信息。
2. 布尔盲注 (Boolean-Based Blind)
说明:通过页面响应差异判断条件真假
-- 示例:判断用户名第一个字符 ' AND SUBSTRING((SELECT username FROM users LIMIT 1),1,1)='a' --备注:
LIMIT 1
表示只取查询结果中的第一条记录。SUBSTRING(..., 1, 1):这个函数提取上面查询结果的第一个字符,即从第一个用户名中取出第一个字母。然后和a比,如果结果是ture说明是a,反之说明不是a。
这样一直猜测,从
LIMIT 1
、2、3.。。。一直盲目的猜测用户名,最终得到用户名的过程。
3. 时间盲注 (Time-Based Blind)
说明:通过数据库延迟判断条件真假
-- 示例:MySQL时间盲注 ' AND IF(1=1,SLEEP(5),0) --备注:观察页面的反应是否是5s后才执行,来说明语句是否被执行。
4. 联合查询注入 (Union-Based)
说明:利用UNION操作符合并查询结果
-- 示例:获取用户数据 ' UNION SELECT username, password FROM users --备注:UNION后面跟着要查询的非授权内容。
5. 堆叠查询注入 (Stacked Queries)
说明:执行多个用分号分隔的SQL语句
-- 示例:添加管理员账户 '; INSERT INTO admin_users VALUES ('hacker','pass123') --备注:用分号来分隔并执行多个SQL语句。
1.1.5.3 按数据传递方式分类
1. 一阶注入 (First-Order)
说明:用户输入立即在SQL查询中执行
-- 示例:直接登录绕过 ' OR '1'='1' --备注:立即注入
2. 二阶注入 (Second-Order)
说明:恶意数据先存储,后续操作时触发
-- 示例:注册恶意用户名 用户名:admin' -- 后续查询:UPDATE users SET password='new' WHERE username='admin' --'备注:分阶段注入
1.1.5.4 按参数类型分类
1. 数字型注入 (Numeric)
说明:注入点为数字参数,无需引号
-- 示例:产品ID参数 ?id=1 OR 1=1
2. 字符型注入 (String)
说明:注入点为字符串参数,需要引号闭合
-- 示例:用户名参数 ?user=admin' OR '1'='1
3. 搜索型注入 (Like)
说明:注入点在LIKE查询中
-- 示例:搜索功能 %' AND 1=1 --
🎯 简要示例汇总
攻击类型 | 简单示例 | 效果 |
---|---|---|
登录绕过 | ' OR '1'='1' -- | 绕过认证 |
数据提取 | ' UNION SELECT 1,2,3 -- | 显示额外数据 |
盲注探测 | ' AND 1=1 -- / ' AND 1=2 -- | 判断注入点 |
时间探测 | '; WAITFOR DELAY '0:0:5' -- | 确认注入存在 |
系统命令 | '; EXEC xp_cmdshell 'dir' -- | 执行系统命令 |
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
您的支持是我创作最大的动力!