HTB 笔记 | SQL 注入基础 + 实操小练习 P2
1. 数据库类型
数据库分为两类:
-
关系型数据库(Relational Databases)
- 使用表格存储数据(行和列)。
- 数据通过“键”连接,形成逻辑关系。
- 示例:MySQL、PostgreSQL、SQL Server。
- 特点:结构化、高效、适合清晰的数据模型。
-
非关系型数据库(NoSQL Databases)
- 不使用表格,而是以灵活的格式存储数据(如 JSON、XML)。
- 示例:MongoDB。
- 特点:灵活、适合非结构化数据。
2. 关系型数据库的核心概念
-
表格(Tables)
表格是数据存储的基本单位,类似于电子表格。每一列表示一个字段(如id
、username
),每一行表示一条记录。 -
键(Keys)
- 主键(Primary Key):唯一标识每条记录(如
id
列)。 - 外键(Foreign Key):用于连接不同表格(如
user_id
连接到users
表)。
- 主键(Primary Key):唯一标识每条记录(如
-
模式(Schema)
数据库的设计蓝图,定义了表格之间的关系。 -
查询语言(SQL)
用于与数据库交互的语言。例如:SELECT * FROM users WHERE id = 1;
查询
users
表中id
为 1 的所有记录。
3. SQL 注入是什么?
SQL 注入是一种攻击手段,黑客通过在输入字段中插入恶意代码,欺骗数据库执行未经授权的操作。
- 常见场景
假设有一个登录表单:
后端代码可能如下:<input type="text" name="username"> <input type="password" name="password">
如果用户输入以下内容:SELECT * FROM users WHERE username = '$username' AND password = '$password';
最终生成的 SQL 查询会变成:username: admin' -- password: [任意值]
这会导致绕过密码验证,直接登录为SELECT * FROM users WHERE username = 'admin' --' AND password = '[任意值]';
admin
用户。
4. 非关系型数据库(NoSQL)注入
- NoSQL 数据库不使用 SQL 语言,但也有类似的漏洞。
- 示例(MongoDB):
如果用户输入:db.users.find({ username: req.body.username, password: req.body.password });
查询会变成:username: {"$ne": null} password: {"$ne": null}
这会匹配所有用户,导致绕过认证。db.users.find({ username: { "$ne": null }, password: { "$ne": null } });
解题思路
1. 理解目标
- 目标:找到 SQL 注入漏洞并利用它获取敏感信息(如管理员账户、隐藏数据)。
- 步骤:
- 分析输入字段是否被正确过滤。
- 尝试构造恶意输入,观察数据库的行为。
- 根据返回结果调整输入,逐步深入。
2. 常见测试方法
-
布尔盲注(Boolean-based Blind Injection)
测试数据库是否对特定条件返回不同的结果。例如:SELECT * FROM users WHERE id = 1 AND 1=1; SELECT * FROM users WHERE id = 1 AND 1=2;
如果第一个查询成功,第二个失败,则可能存在漏洞。
-
时间盲注(Time-based Blind Injection)
测试数据库是否会因特定条件延迟响应。例如:SELECT * FROM users WHERE id = 1 AND SLEEP(5);
如果页面加载延迟了 5 秒,则可能存在漏洞。
-
联合查询(Union-based Injection)
尝试将恶意查询结果附加到正常查询中。例如:SELECT * FROM users WHERE id = 1 UNION SELECT username, password FROM users;
实操练习