SQL Server注入 - STUFF与XML Path
2020-3-2|2023-6-22

倾旋
type
status
date
slug
summary
tags
category
icon
password
URL
背景
某次XX,发现一处SQL Server注入点
报错注入
SQL Server注入,一般也是先找库、再找表、再查字段、最终查询数据。
查库
1.查第一个:
2.NOT IN
其中,NOT IN的集合会不断增加,最终无法查出其他结果,那么这个集合就是所有的数据库名称。
查表
在这一步,我们就可以自动化实现了:
当取得第16个的时候,还是没有出现用户表、管理员表等,而且网站抛出了错误,无法继续取,突然没有其他办法了。

先来分析一下语句:
这是第一次请求的Payload,集合这里我写个空,不管怎样,集合都可以取得第一个表名。第二个、第三个表名都会向集合增加,以此类推,通过SQLMAP判断,有146个表。
到第16个因为原始语句有干扰,不能继续取得后续的表名,但我不想放弃。
于是,又想到通过FUZZ的方式:

Hsoft_
为前缀
- sc 500 只匹配错误页面(报错注入)
但是字典貌似不够强大,我就去查询SQL Server有没有类似将多行数据合并为一行的办法。
我知道MySQL中有GroupConcat类似的函数,但SQL Server没有,这点很遗憾~ 没有继续使用SQL Map是因为SQLMAP根本无法取得任何一个表名,期间我也分析了SQL MAP的Payload,请求实在是多,就放弃了这条线。
STUFF与XML Path
STUFF字符串函数是将字符串插入到另一个字符串中。它会删除开始位置第一个字符串中的指定长度的字符,然后将第二个字符串插入到开始位置的第一个字符串中,语法如下。
参数是给定的字符串数据,可以是字符或二进制数据的常量,变量或列。
<start>
参数是一个整数值,指定开始删除和插入的位置,可以是BIGINT类型。如果<开始>
或<长度>
参数为负数,则返回NULL字符串。如果<start>
参数比第一个<character_expression>
长,则返回一个NULL字符串。 参数可以是BIGINT类型,它是一个整数,指定要删除的字符数。如果比第一个<character_expression>
长,则删除发生到最后一个<character_expression>
中的最后一个字符。STUFF最常见的用途莫过于结合FOR XML PATH对返回JSON字符串的拼接。首先利用FOR XML PATH则返回XML格式的字符串,我们将FOR XML PATH添加到查询的末尾,此时允许我们将查询的结果作为XML元素输出,元素名称包含在PATH参数中。
如:
类似的SQL可能会返回多行数据,因此可以通过STUFF与XML PATH集合使用:
- 将查询到的数据转换成行,以逗号隔开,以
[]
包裹
直接套用到注入场景:
在sql shell中直接执行即可返回所有表名:

所有表名以
[表名],
分割。通过这个办法,我们可以套用很多需要多次请求注入的需求,如:
- 取得某个表10个用户名
- 取得所有数据库名
其他场景自行想象!