傻瓜式 XSLT 注入

admin 2023年4月20日02:39:35评论110 views字数 3284阅读10分56秒阅读模式

XML 是一种广为人知的格式,我相信你一定听说过很多关于XXE(XML 外部实体)的信息,它甚至是Web 应用程序安全的OWASP 前 10 名列表的一部分。

但是你听说过XSLT吗?

它代表可扩展样式表语言转换,是一种用于将 XML 文档转换为 XML 或其他格式(如 HTML、SVG、SVG、纯文本等)的语言……

如XSLT 的维基百科页面中所列

尽管 XSLT 被设计为一种用于 XML 转换的专用语言,但该语言是图灵完备的,理论上可以进行任意计算。

这听起来一定很有趣。

XSLT 提供循环、if、switch-case 等结构和子字符串等其他函数来对 XML 文档执行操作。不仅如此,它甚至允许你定义函数并调用它们,很惊人。

它使用 XPath 定位 XML 文档树的不同子集,然后可用于对它们执行操作:检查它们的值、对内容执行函数等等。

关于XSLT 和 XPath有一个非常棒的教程如果你想了解有关 XSLT 和 XPath 的更多信息https://www.youtube.com/watch?v=WggVR4YI5oI,强烈推荐但就本文的范围而言,我们讨论的内容就足够了。

XSLT 注入

现在让我们谈谈有趣的部分。

当盲目信任用户输入而不考虑后果时,就会发生注入问题。如果设置了正确的条件,那么这可能会导致数据泄露、RCE、XSS 等等。

如果用户能够提供他们自己的 XSLT 文件或注入 XSLT 标签,那么这可能会导致 XSLT 注入。你可以使用的构造在很大程度上取决于所使用的处理器和 XSLT 规范的版本。版本 1 得到最广泛的使用和支持,因为较新的版本:2 和 3 向后兼容,也因为浏览器支持版本 1,因此很受欢迎。

与版本 1 相比,版本 2 和版本 3 具有更多的功能,因此使用更高版本的漏洞利用变得更加容易。但是,使用 1,你仍然可以完成很多工作。以下是一些有趣的问题:

  • RCE

  • 读取本地文件(通过报错信息)

  • XXE

  • SSRF 和端口扫描

在 XSLT 生态系统中,我们有不同数量的处理器,包括:

傻瓜式 XSLT 注入资料来源:https: //repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20IO%20Active.pdf

正如你已经注意到的,libxslt非常常见,而且大多数情况下,版本是 1,除了 Saxonica 的 Saxon,它功能非常丰富,同时支持版本 1 和 2。

因此,对于我们的讨论,我们将讨论libxslt它是为 GNOME 项目开发的 C 库。你可以使用xsltproc命令在 Linux 上的 CLI 上试用它

现在让我们关注攻击。这不应该是关于该主题的详尽指南(我在本文末尾链接了更多资源以进行更深入的研究)。我们将只涉及基础知识,我将向你展示使用 XSLT 注入的 RCE 和本地文件读取。

考虑一个接受任意 XSLT 文件然后解析其内容的应用程序。你认为会发生什么?

探测

你可能会认为知道所有这些都很好,但你怎么知道正在使用的是什么处理器。因为否则这将是一种“盲注”攻击,而且更加痛苦和嘈杂,对吧?别担心,你可以使用一些标签来执行扫描和探测。

下面这些是可以返回版本、供应商和供应商 URL 的 3 个标签:

<xsl:value-of select="system-property('xsl:version')"/> <xsl:value-of select="system-property('xsl:vendor')"/> <xsl:value-of select="system-property('xsl:vendor-url')"/>

因此,你现在应该知道处理器支持的所有功能,然后进入开发部分。

RCE

如果应用程序易受攻击(如果启用了registerPHPFunctions ) ,像这样的 XSLT 文件可能会导致 RCE :


傻瓜式 XSLT 注入

傻瓜式 XSLT 注入

读取本地文件

不仅如此,你甚至可以通过报告的错误消息读取本地文件的内容(至少 1 行):


傻瓜式 XSLT 注入包含要读取/etc/passwd文件的负载的 XSLT 文件

傻瓜式 XSLT 注入处理 XLST 文件导致泄漏/etc/passwd文件的第一行

请注意,应用程序报出了一个错误,但第一行仍然显示漏洞结果出来,发生这种情况是因为文档(甚至包含导入函数)会尝试解析指定的文件,并且由于 passwd 文件不是有效的 XML 文件,这些函数会出错并显示文件的第一行。

现在你可能认为这是相当有限的,但是等一下,如果应用程序以 root 身份运行,你可以通过读取shadow file的第一行来获取 root 用户的密码哈希你甚至可以读取.htpasswd文件的内容来获取管理员或其他用户的密码哈希。

所以这一切都没有白费。

XXE

你甚至可以执行 XXE,但这应该是显而易见的。考虑这个例子:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE dtd_sample[<!ENTITY ext_file SYSTEM "path/to/file">]><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:template match="/events">    Events &ext_file;:    <xsl:for-each select="event">      <xsl:value-of select="name"/>: <xsl:value-of select="value"/>    </xsl:for-each>  </xsl:template>
</xsl:stylesheet>

SSRF 和端口扫描

使用像这样的payload(为了简洁省略了额外的东西):

<xsl:copy-of select=" document(' http://10.10.10.10:22 ') "/>

你可以看到这将向指定的 IP 发出请求。现在你可以想象,使用这个原语,你可以利用针对不同场景(端口操作、关闭、无效主机等)返回的不同错误消息来执行 SSRF 甚至端口扫描。

更多资源分享

我只经历了一些可以执行的攻击,但还有更多!为此,我建议你阅读以下更深入的资源:

  1. 滥用 XSLT 进行实际攻击

    https://www.youtube.com/watch?v=j4vCGtF3a64

  2. XSLT 注入

    https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection

  3. XSLT 服务器端注入攻击

    https://www.contextis.com/en/blog/xslt-server-side-injection-attacks

  4. XSLT 安全和服务器端请求伪造

    https://blog.compass-security.com/2015/06/xslt-security-and-server-side-request-forgery/

  5. XSLTProcessor的隐患——远程XSL注入

    https://www.acunetix.com/blog/articles/the-hidden-dangers-of-xsltprocessor-remote-xsl-injection/

  6. XSLT 注入基础 — Saxon

    https://blog.hunniccyber.com/ektron-cms-remote-code-execution-xslt-transform-injection-java/

  7. 意想不到的旅程:从 XSLT 注入到 shell

    https://www.hek.si/documents/An_unxpected_journey-_from_XSLT_injection_to_a_shell_Jusic_Infigo_IS.pdf

结束语

我希望你喜欢这篇文章并学到一些有趣的内容。如果想涵盖更高级别的 XSLT 注入并展示可能的不同攻击。还有很多东西需要学习,我给出了更多资源应该会让你有更深入的了解。


原文始发于微信公众号(军机故阁):傻瓜式 XSLT 注入

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月20日02:39:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   傻瓜式 XSLT 注入http://cn-sec.com/archives/1680913.html

发表评论

匿名网友 填写信息