首页
社区
课程
招聘
[翻译]XSLT 服务端注入攻击
发表于: 2017-11-23 17:30 5657

[翻译]XSLT 服务端注入攻击

2017-11-23 17:30
5657

前言


 

XSLT(扩展样式表转换语言)漏洞可能会给那些受到影响的应用带来严重的后果,经常会导致远程代码执行。

 

举几个已被公开的 XSLT 远程代码执行漏洞的例子,CVE-2012-5357 影响了 .NET Ektron CMS;CVE-2012-1592 影响了Apache Struts 2.0;CVE-2005-3757 影响了 Google 搜索应用。

 

从上面的例子可以看出,XSLT 漏洞可谓是由来已久,但是它并不像一些类似的漏洞(例如 XML 漏洞)那样常见。尽管我们经常在我们的安全评估中看到它的身影,但是有关该漏洞及其相关利用技术的文章却并不多见。

 

本文将通过展示一些经过精心挑选的 XSLT 攻击来说明这种技术以不安全的方式使用时所存在的风险。例如:远程执行任意代码、窃取远程系统数据、执行网络端口扫描以及获取受害者内部网络资源。本文还会提供一个简单的易受攻击的 .NET 应用,可用于练习本文中所展示攻击,最后提供几条规避 XSLT 漏洞的建议。

什么是 XSLT ?


 

XSLT(扩展样式表转换语言)是一种对 XML 文档进行转化的语言。XML 文档通过 XSLT 转化后可以变成为另一份不同的 XML 文档,或者其他类型的文档,例如 HTML 文档、 CSV 文件、纯文本文件等。

 

XSLT 通常用于转换被不同应用加工过的文件格式,还有就是作为一个模板引擎。许多企业级应用广泛地使用了 XSLT ,例如一个多租户发票应用可能会允许客户使用 XSLT 来高度定制他们的发票,比如根据自己的特殊需要来改变发票内容和发票格式。

 

其他一些常见的 XSLT 应用场景:

  • 报道

  • 将数据以不同的格式导出

  • 打印

  • 发邮件

在展示攻击之前,我们不妨先通过一个简单的例子看看这个转化到底是怎么回事。以下面这段包含了一些水果名及相关介绍的 XML 文档为例。



  
    Lemon
    Yellow and sour
  
  
    Watermelon
    Round, green outside, red inside
  

为了将该 XML 文档转化为纯文本文档,可使用如下 XSL 文档:


127K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5g2)9J5c8W2S2e0e0q4)9J5c8W2c8J5j5h3&6K6k6X3!0J5L8b7`.`.">
  
    Fruits:
    
    
      
      - : 
    
  

转换结果如下:

Fruits:

      - Lemon: Yellow and sour
      - Watermelon: Round, green outside, red inside

(译注:可参考XSLT - 转换

XSLT 服务端注入攻击


 

本部分会展示一套测试应用是否存在 XSLT 漏洞的方法,覆盖了从发现到利用的全过程。例子是一个使用微软 System.Xml XSLT 实现的易受攻击的应用。类似的技术同样可应用于一些其他的常见的库,如 Libxslt 、 Saxon 、 Xalan 。

找到切入点

第一步是定位应用可能存在漏洞的地方。

 

最简单的情景就是应用允许用户上传任意 XSLT 文件。如果上述情景不存在,一个易受攻击的应用可能会使用不可信的用户输入动态地生成 XSLT 文档。例如,该应用可能会生成如下的 XSLT 文档,字符串"Your Company Name Here"这里对应的就是不可信的用户输入。


931K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5g2)9J5c8W2S2e0e0q4)9J5c8W2c8J5j5h3&6K6k6X3!0J5L8b7`.`.">
  
    Your Company Name Here
    Fruits:
    
    
      
      - : 
    
  
  

为了验证该应用是否是易受攻击的,我们通常会插入一些会导致 XML 文件语法错误的字符,例如双引号、单引号和尖括号{", ', <, >}。如果服务器会返回错误,那么这个应用就有可能是易受攻击的。一般而言,这种定位技术与定位 XML 注入漏洞的技术类似。

 

后面将要提到的攻击中有一些仅在文件的特定区域注入时才有效。不过别担心,本文也会展示一种利用 import 和 include 功能来绕开这种限制的技术。

 

为了使文章简单易懂,除非另有说明,在接下来的例子中我们将假设我们可以向应用提交任意的 XSLT 文档。

使用 system-property() 函数提取指纹

一旦找到了攻击切入点,接下来提取系统指纹和明确应用正在使用的 XSLT 库是非常有必要的。

 

在进行攻击之前,如果知晓了应用所使用的 XSLT 库是十分有用地。因为不同的库支持的 XSLT 功能不同,所以可能存在这样的情况,一个功能在这个库中是可以使用的,但是换成另一个库中却无法使用了。专有扩展通常都不支持库间兼容。此外,不同的库的默认设置可能存在较大差异,通常来说,旧的库会默认启用一些存在风险的功能,但是新的库则要求开发者在需要时手动开启这些功能。

 

使用 system-property() 函数可以查出一个库的供应商名称,这是 XSLT v1.0 标准的一部分,所有的库都支持该功能。该函数有效的参数有:

  • xsl:vendor

  • xsl:vendor-url

  • xsl:version

下面的 XSL 文档可用于查出库的供应商:


a3bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5g2)9J5c8W2S2e0e0q4)9J5c8W2c8J5j5h3&6K6k6X3!0J5L8b7`.`.">
  
    
  

由于本文的被测试应用使用的是 .NET System.xml ,因此返回值是 Microsoft 。

Microsoft

使用 XML 外部实体(XXE)窃取信息、扫描端口

由于 XSLT 所使用的文件格式是 XML ,那么常见的针对 XML 的攻击,例如十亿笑攻击(也称 XML 炸弹)和 XML 外部实体攻击,也会影响到 XSLT 就不足为奇了。十亿笑攻击是一种拒绝服务攻击,其目的在于耗尽服务器的内存资源。为了更契合主题,本文采用的是 XML 外部实体攻击。

 

在下面的例子中,我们使用了一个外部实体读取 "C:\secretfruit.txt" 文件中的内容。


]>
08fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5g2)9J5c8W2S2e0e0q4)9J5c8W2c8J5j5h3&6K6k6X3!0J5L8b7`.`.">
  
    Fruits &ext_file;:
    
    
      
      - : 
    
  


ENTITY 元素放置的是 "ext_file" 所引用的文件中的内容,也就是我们接下来使用语法 "&ext_file" 打印到主文档中的内容。从输出结果可以看出该文件中的秘密内容就是 "Golden Apple" :

Fruits Golden Apple:

      - Lemon: Yellow and sour
      - Watermelon: Round, green outside, red inside

这项技术可被用来取出存储在 Web 服务器上的文件,或者那些正常情况下攻击者无法访问的内部网络的网页,而这些文件有可能是包含身份信息的配置文件或者包含其他敏感信息的文件。

 

对于那些可以从受害者内部网络中的其他系统中取出的文件,攻击者也可以使用 UNC 路径 {\\servername\share\file} 或者 URL {03cK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4W2M7Y4k6W2M7X3&6S2L8h3g2Q4x3V1k6X3K9h3I4W2i4K6N6p5 来代替文件路径。

 

使用一些 IP 地址和端口号或许还能查出一个远程端口是打开状态还是关闭状态,不过这一点取决于应用是如何应答的,比方说应用可以返回不同种类的错误信息或者在应答中显示时延信息。

 

下面的 XSLT 文档使用了 URL 0a4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5%4x3W2)9J5k6e0p5$3i4K6u0W2x3e0x3J5i4K6u0W2x3g2)9K6b7e0t1#2


5ebK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5%4x3W2)9J5k6e0p5$3i4K6u0W2x3e0x3J5i4K6u0W2x3g2)9K6b7e0t1#2">]>
231K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4M7K6i4K6u0W2L8%4u0Y4i4K6u0r3x3e0V1&6z5g2)9J5c8W2S2e0e0q4)9J5c8W2c8J5j5h3&6K6k6X3!0J5L8b7`.`.">
  
    Fruits &ext_file;:
    
    
      
      - : 
    
  


下图展示了当我们试图连接到该 URL 时,应用返回的错误信息。透过该错误信息不难推断出25号端口处于关闭状态。

 


[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回