XSLT简介
XSL(可扩展样式表语言)是一种用于转换XML文档的语言,XSLT表示的就是XSL转换,转换后得到的一般都是不同的XML文档或其他类型文档,例如HTML文档、CSV文件以及明文文本文件等等。
一般来说,应用程序或模板引擎在处理不同文件类型时需要使用XSLT来进行数据转换。很多企业级应用比较喜欢使用XSLT,比如说,多用户发票应用程序可以使用XSLT来允许客户自定义它们的发票,客户可以根据自己的需求来修改发票信息以及格式。
其他常见应用:
个人理解,就是给XML美化生成其他文档的东西
- xsl文件(可以理解为美化模板)
- xml文件(待美化的内容)
- 结合
- 最终美化效果
判断漏洞
可以通过注入导致错误XML语法的字符(比如双引号、单引号、尖括号)的方法。如果服务器返回了错误,那么应用则可能易受攻击。总的来说,这种识别技术和XML注入漏洞识别技术是相同的。
攻击
XSLT注入,就是XLS
模版文件内容可控,从而操作一些函数导致可以造成其他的危害
system-property()函数和指纹
我们可以通过system-property()
函数来获取库发布者的名字,该函数是XSLT v1.0d的标准,所以所有的库都实现了这一点。
正确有效的参数是:
- xsl: vendor
- xsl: vendor-url
- xsl: version
```
<?xml version=”1.0” encoding=”utf-8”?>
### 使用document()进行XML文件读取+端口扫描
`document()`函数允许XSLT转换获取存储在除了主数据源以外的外部XML文档中的数据。(注意:返回的格式必须是XML才行)<br />攻击者可以滥用`document函数`来读取远程系统的文件,通常是以转换结果的整个内容进行拷贝为手段。**但这种攻击要求文件是格式工整的XML文档**,但这并不总是个问题,因为大多数时候敏感信息总是存储在XML文件中。比如在一个asp.net web应用中,web.config文件就是个很好的例子因为它包含了数据库认证信息。
<?xml version=”1.0” encoding=”utf-8”?>
- <xsl:value-of select="name"/>: <xsl:value-of select="description"/>
</xsl:for-each>
`document()`函数可以用于获取远程系统的文档并且能通过UNC路径或如下所示URL来进行基本的网络扫描:
<?xml version=”1.0” encoding=”utf-8”?>
- <xsl:value-of select="name"/>: <xsl:value-of select="description"/>
</xsl:for-each>
### 嵌入脚本区块执行远程代码
嵌入的脚本区块是专有的XSLT扩展,可以直接在XSLT文档中包含代码。在微软的实现中,可以包含C#代码。当文档被解析,远程服务器会编译然后执行代码。
<?xml version=”1.0” encoding=”UTF-8”?>
### JAVA RCE
xslt处理器如果不禁用,能将本机的java语言方法暴露为XSLT函数,导致任意代码执行漏洞
<?xml version=”1.0” encoding=”utf-8”?>
### import和incldue
前面都是考虑到可以完全控制XSL文件的情况,但如果只能控制其中的一部分内容的话,又该怎么利用呢?<br />攻击者通过将XSLT文档和外部文档组合来打破这种限制,`import`和`incldue`函数可以达到这样的效果。在加载外部文件时,整个文档将被解析。如果攻击者可以控制这个过程,那么他们可以使用XXE和在外部文件中使用内嵌脚本这两种攻击方式。<br />外部文件可能是之前上传到服务器上的文件,或者从外部通过URL引用的文件,只要文件内容是XML格式即可。<br />当`xsl:include`在其他地方使用时,`xsl:import`标签只能作为`xsl:stylesheet`标签的第一个子标签。<br />利用前需要闭合之前的标签,然后再插入我们注入的语句<br />比如
插入后构造出的XSL
<?xml version=”1.0” encoding=”utf-8”?>
- <xsl:value-of select="name"/>: <xsl:value-of select="description"/>
</xsl:for-each>
```