SQL注入漏洞学习笔记(第一部分:数据库基础)
1. 数据库基础
1.1 什么是数据库?
- 定义:数据库是一个电子仓库,用于存储和管理数据。用户可以对数据进行新增、查询、更新、删除等操作。
- 示例:通讯录是一个简单的数据库,存储姓名和电话号码。
1.2 查询语句(SELECT)
功能:从数据库中检索数据。
示例与原理:
SELECT * FROM users;
*
表示所有列。- 执行后返回
users
表中所有用户的信息。
SELECT name, email FROM users WHERE gender = 'male';
- 仅返回
name
和email
列,且筛选条件为gender = 'male'
。
SELECT COUNT(*) FROM users;
COUNT(*)
统计表中的总行数。
1.3 UNION 查询
功能:合并多个 SELECT
的结果集,并自动去重。
语法规则:
- 每个
SELECT
的列数必须相同。 - 列的数据类型必须兼容。
示例:
SELECT name FROM students UNION SELECT name FROM teachers;
- 合并
students
和teachers
表的name
列,并去重。
UNION vs UNION ALL:
UNION
去重,UNION ALL
保留所有记录(效率更高)。
1.4 information_schema 数据库
功能:存储数据库的元数据(如库名、表名、列名等)。
核心表:
- schemata:存储所有数据库名(
schema_name
)。 - tables:存储所有表信息(
table_schema
表所属数据库,table_name
表名)。 - columns:存储所有列信息(
column_name
列名)。
示例:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'test_db';
- 查询
test_db
数据库中的所有表名。
1.5 SQL 高级操作
1.5.1 排序(ORDER BY)
SELECT * FROM users ORDER BY name ASC;
ASC
表示升序,DESC
表示降序。
利用 ORDER BY 判断列数(SQL注入关键步骤):
SELECT user, password FROM users ORDER BY 2;
- 按第2列(
password
)排序。若改为ORDER BY 3
报错,则说明表中只有2列。
1.5.2 限定行数(LIMIT)
SELECT * FROM users LIMIT 2;
- 返回前2行数据。
SELECT user, password FROM users LIMIT 0,1;
- 从第0行开始,返回1行数据(常用于分页)。
1.6 字符连接函数
-
CONCAT(str1, str2, …):无分隔符连接。
SELECT CONCAT(user_id, username) FROM users;