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个的时候,还是没有出现用户表、管理员表等,而且网站抛出了错误,无法继续取,突然没有其他办法了。
notion image
先来分析一下语句:
这是第一次请求的Payload,集合这里我写个空,不管怎样,集合都可以取得第一个表名。第二个、第三个表名都会向集合增加,以此类推,通过SQLMAP判断,有146个表。
到第16个因为原始语句有干扰,不能继续取得后续的表名,但我不想放弃。
于是,又想到通过FUZZ的方式:
notion image
  • 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中直接执行即可返回所有表名:
notion image
所有表名以[表名],分割。
通过这个办法,我们可以套用很多需要多次请求注入的需求,如:
  • 取得某个表10个用户名
  • 取得所有数据库名
其他场景自行想象!
 
©2021-2024 倾旋. All rights reserved.