"SQL手工注入公开课资料(2).md"
这篇资料主要讲述了SQL手工注入的相关知识,特别是针对MySQL数据库。SQL手工注入是一种常见的安全漏洞,攻击者通过构造恶意的SQL语句来获取、修改、删除数据库中的敏感信息。以下是详细的解释:
### 1. 信息收集
在进行SQL注入攻击时,首先需要收集数据库的信息。`SHOW DATABASES;` 命令用于显示所有的数据库名称,`USE 数据库名;` 切换到指定的数据库,`SHOW TABLES;` 则用来查看当前数据库中的所有表。
### 2. SQL语句基础
基础查询包括查询所有数据库名称、选择数据库、显示所有表以及查询表中的数据。`SELECT * FROM 表名 WHERE 条件;` 是一种常用的查询方式,`*` 代表所有字段。`IF` 和 `SELECT` 结合可以进行条件判断。`UNION` 用于合并两个或多个`SELECT`语句的结果集,但要求字段数量相同。
### 3. MYSQL手工注入流程
1. **判断注入点**:通过输入如 `And 1=1 And 1=2` 的测试语句,观察页面返回结果的变化,确认是否存在注入点。
2. **猜解列名数量**:利用 `ORDER BY` 字段编号,比较错误和正常的响应,推测列的数量。
3. **报错猜解**:例如 `Id=-1 UNION SELECT 1,2,3,4`,尝试通过报错信息来获取列数。
4. **判断回显点**:找到注入后能反馈信息的位置。
5. **信息收集**:获取数据库版本、数据库名、数据库用户和操作系统等信息,如 `version()`, `database()`, `user()` 和 `@@version_compile_os`。
### 4. MYSQL系统库释义
从 MySQL 5.0 版本开始,有一个名为 `information_schema` 的内置数据库,它包含了许多元数据表,如:
- `information_schema.TABLES` 存储所有表名信息,`Table_name` 是表名,`Table_schema` 是数据库名。
- `information_schema.COLUMNS` 记录所有列名信息,`Column_name` 是列名。
攻击者可以通过以下语句来获取信息:
- 查询指定数据库名下的所有表名:
```
SELECT 1, GROUP_CONCAT(table_name), 3, 4
FROM information_schema.tables
WHERE table_schema = database();
```
- 查询指定表名下的所有列信息:
```
SELECT 1, GROUP_CONCAT(column_name), 3, 4
FROM information_schema.columns
WHERE table_name = '指定表名';
```
了解这些SQL手工注入技术和MySQL系统库的使用,对于数据库安全防护和渗透测试至关重要。为了防止SQL注入攻击,应当确保应用程序对用户输入进行充分的验证和转义,同时定期更新数据库系统,修补已知的安全漏洞。