Web安全学院
Web安全学院
  • 首页
  • 译序
  • 学习路线
  • 前篇
    • Web应用程序安全测试
    • 动态应用程序安全测试(DAST)
    • 带外应用程序安全测试(OAST)
  • 服务器端主题
    • SQL注入
      • SQL注入
      • SQL注入UNION攻击
      • 在SQL注入攻击中检索数据库
      • SQL盲注
      • SQL注入速查表
    • 认证
      • 认证漏洞
      • 基于密码登录中的漏洞
      • 多因素认证中的漏洞
      • 其他认证机制中的漏洞
      • 如何保护你的认证机制
    • 目录遍历
      • 目录遍历
    • 命令注入
      • OS命令注入
    • 业务逻辑漏洞
      • 业务逻辑漏洞
      • 业务逻辑漏洞示例
    • 信息泄露
      • 信息泄露漏洞
      • 如何发现并利用信息泄露漏洞
    • 访问控制
      • 访问控制漏洞与权限提升
      • 不安全的直接对象引用(IDOR)
      • 访问控制安全模型
    • 文件上传漏洞
      • 文件上传漏洞
    • 条件竞争
      • 条件竞争
    • 服务器端请求伪造(SSRF)
      • 服务器端请求伪造(SSRF)
      • 盲SSRF漏洞
    • XXE注入
      • XML外部实体(XXE)注入
      • XML实体
      • 发现并利用盲XXE漏洞
  • 客户端主题
    • 跨站脚本(XSS)
      • 跨站脚本
      • 反射型XSS
      • 存储型XSS
      • 基于DOM的XSS
      • XSS上下文
        • 跨站脚本上下文
        • 客户端模版注入
      • 利用跨站脚本漏洞
      • 内容安全策略
      • 悬空标记注入
      • 如何防范XSS漏洞
      • 跨站脚本(XSS)速查表
    • 跨站请求伪造(CSRF)
      • 跨站请求伪造(CSRF)
      • XSS与CSRF
      • 绕过CSRF令牌验证
      • 绕过SameSite Cookie限制
      • 绕过基于Referer的CSRF防御
      • 如何防范CSRF漏洞
    • 跨域资源共享(CORS)
      • 跨域资源共享(CORS)
      • 同源策略(SOP)
      • CORS和Access-Control-Allow-Origin响应标头
    • 点击劫持
      • 点击劫持(UI伪装)
    • 基于DOM的漏洞
      • 基于DOM的漏洞
      • 控制Web消息源
      • 基于DOM的开放重定向
      • 基于DOM的Cookie操纵
      • 基于DOM的JavaScript注入
      • 基于DOM的document-domain操纵
      • 基于DOM的WebSocket URL投毒
      • 基于DOM的链接操纵
      • Web消息操纵
      • 基于DOM的Ajax请求标头操纵
      • 基于DOM的本地文件路径操纵
      • 基于DOM的客户端SQL注入
      • 基于DOM的HTML5 Storage操纵
      • 基于DOM的客户端XPath注入
      • 基于DOM的客户端JSON注入
      • DOM-data操纵
      • 基于DOM的拒绝服务
      • DOM破坏
    • WebSocket
      • 测试WebSocket安全漏洞
      • 什么是WebSocket?
      • 跨站WebSocket劫持
  • 进阶主题
    • 不安全的反序列化
      • 不安全的反序列化
      • 利用不安全的反序列化漏洞
    • 测试GraphQL API
      • 测试GraphQL API
      • 什么是GraphQL?
    • 服务器端模板注入
      • 服务器端模板注入
      • 利用服务器端模板注入漏洞
    • Web缓存投毒
      • Web缓存投毒
      • 缓存设计缺陷的利用
      • 缓存实现缺陷的利用
    • HTTP Host标头攻击
      • HTTP Host标头攻击
      • 如何识别和利用HTTP Host头的漏洞
      • 密码重置投毒
    • HTTP请求走私
      • HTTP请求走私
      • 查找HTTP请求走私漏洞
      • 利用HTTP请求走私漏洞
      • 高级请求走私
        • 高级请求走私
        • HTTP/2降级
        • 响应队列投毒
        • HTTP/2专属载体
        • HTTP请求隧道
      • 浏览器驱动的请求伪造
        • 浏览器驱动的请求伪造
        • CL.0请求走私
        • 客户端异步攻击
        • 基于暂停的异步攻击
    • OAuth认证
      • OAuth 2.0认证漏洞
      • OAuth授权类型
      • OpenID Connect
      • 如何防范OAuth认证漏洞
    • JWT攻击
      • JWT攻击
      • 在Burp Suite中使用JWT
      • 算法混淆攻击
    • 原型污染
      • 什么是原型污染?
      • JavaScript原型和继承
      • 客户端
        • 客户端原型污染漏洞
        • 通过浏览器API进行原型污染
      • 服务器端
        • 服务器端原型污染
      • 预防原型污染漏洞
    • 基本技能
      • 基本技能
      • 使用编码混淆攻击
      • 在手动测试中使用Burp Scanner
Powered by GitBook
On this page
  • 什么是XML外部实体注入?
  • XXE漏洞是如何产生的?
  • XXE攻击有哪些类型?
  • 利用XXE检索文件
  • 利用XXE实施SSRF攻击
  • 盲XXE漏洞
  • 发现XXE注入的隐藏攻击面
  • XInclude攻击
  • 通过文件上传进行XXE攻击
  • 通过修改内容类型进行XXE攻击
  • 如何发现和测试XXE漏洞
  • 如何防范XXE漏洞
  1. 服务器端主题
  2. XXE注入

XML外部实体(XXE)注入

PreviousXXE注入NextXML实体

Last updated 1 year ago

在本节中,我们将讲解什么是XML外部实体注入,描述一些常见示例,解释如何发现和利用各种XXE注入,并总结如何防范XXE注入攻击。

什么是XML外部实体注入?

XML外部实体注入(也称为XXE)是一种Web安全漏洞,允许攻击者干扰应用程序对XML数据的处理。它通常允许攻击者查看应用服务器文件系统上的文件,并与应用程序本身可以访问的任何后端或外部系统进行交互。

在某些情况下,攻击者可以利用XXE漏洞将XXE攻击升级,从而威胁底层服务器或其他后端基础设施,并实施服务器端请求伪造(SSRF)攻击。

Labs

如果你已经熟悉XXE漏洞背后的基本概念,并且只想在一些真实的、故意易受攻击的目标上练习利用它们,你可以从下面的链接访问本主题中的所有实验。

XXE漏洞是如何产生的?

一些应用程序使用XML格式在浏览器和服务器之间传输数据。这样的应用程序基本都是使用标准库或平台API来处理服务器上的XML数据。XXE漏洞之所以产生,是因为XML规范包含各种潜在的危险特性,而标准解析器也支持这些特性,即使应用程序通常不使用这些特性。

阅读更多

XML外部实体是一种自定义的XML实体,其定义的值是从声明它们的DTD之外加载。从安全角度来看,外部实体尤其有趣,因为它们允许根据文件路径或URL的内容定义实体。

XXE攻击有哪些类型?

XXE攻击有多种类型:

  • 利用XXE检索文件,其中定义了一个包含文件内容的外部实体,并在应用程序的响应中返回。

  • 利用XXE实施SSRF攻击,其中外部实体是基于后端系统的URL定义的。

  • 利用盲XXE带外渗出数据,即将敏感数据从应用服务器传输到攻击者控制的系统。

  • 利用盲XXE通过错误信息检索数据,攻击者可以触发一个包含敏感数据的解析错误信息。

利用XXE检索文件

要实施从服务器文件系统检索任意文件的XXE注入攻击,你需要以两种方式修改提交的XML:

  • 引入(或编辑)一个DOCTYPE元素,该元素定义了一个包含文件路径的外部实体。

  • 编辑应用程序响应中返回的XML中的数据值,以使用定义的外部实体。

例如,假设一个购物应用程序通过向服务器提交以下XML来检查产品的库存水平:

<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>

该应用程序对XXE攻击没有特别的防御措施,因此你可以提交以下XXE有效负载,利用XXE漏洞来检索/etc/passwd文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>

这个XXE有效负载定义了一个外部实体&xxe;,其值为/etc/passwd文件的内容,并在productId值中使用了该实体。这将导致应用程序的响应包含文件的内容:

Invalid product ID: 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
...

注意

在真实的XXE漏洞中,提交的XML中通常会有大量的数据值,其中任何一个都可能会在应用程序的响应中使用。为了系统地测试XXE漏洞,通常需要分别测试XML中的每个数据节点,通过使用你定义的实体并查看它是否出现在响应中。

LAB

利用XXE实施SSRF攻击

除了检索敏感数据外,XXE攻击的另一个主要影响是,它们可以被用来实施服务器端请求伪造(SSRF)。这是一个潜在的严重漏洞,可诱使服务器端应用程序向服务器可以访问的任何URL发起HTTP请求。

要利用XXE漏洞实施SSRF攻击,你需要使用你想攻击的URL定义一个外部XML实体,并在数据值中使用该实体。如果可以在应用程序响应中返回的数据值内使用已定义的实体,那么你就能够在应用程序响应中查看来自URL的响应,从而获得与后端系统的双向交互。否则,就只能实施盲SSRF攻击(仍有可能造成严重后果)。

在下面的XXE示例中,外部实体将导致服务器向组织基础设施内的内部系统发起后端HTTP请求:

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>

LAB

盲XXE漏洞

很多XXE漏洞都是不可见的。这意味着应用程序在其响应中不返回任何已定义的外部实体的值,因此无法直接检索服务器端文件。

尽管如此,盲XXE漏洞仍然可以被检测和利用,只是需要更高级的技术。有时,你可以使用带外技术发现漏洞并利用它们来外泄数据。有时还可以触发XML解析错误,从而导致在错误信息中泄漏敏感数据。

阅读更多

发现XXE注入的隐藏攻击面

在很多情况下,XXE注入漏洞的攻击面是显而易见的,因为应用程序的正常HTTP流量包括包含XML格式数据的请求。在其他情况中,攻击面则不那么明显。不过,只要在正确的地方寻找,你就能在不包含任何XML的请求中发现XXE攻击面。

XInclude攻击

一些应用程序接收客户端提交的数据,在服务器端将其嵌入到XML文档中,然后解析该文档。一个例子是当客户端提交的数据被放入到后端SOAP请求,然后由后端SOAP服务进行处理。

在这种情况下,你无法实现一个典型的XXE攻击,因为你无法控制整个XML文档,不能定义或修改DOCTYPE元素。不过,你也许可以使用XInclude。XInclude是XML规范的一部分,它允许从子文档构建XML文档。你可以在XML文档的任何数据值中植入XInclude攻击,因此在你仅控制一个被放置到服务器端XML文档中的数据项的情况下,也可以实施攻击。

要实施XInclude攻击,你需要引用XInclude命名空间,并提供你希望包含的文件的路径。例如:

<<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

LAB

通过文件上传进行XXE攻击

一些应用程序允许用户上传文件,这些文件随后在服务器端被处理。有些常见的文件格式使用XML或包含XML子组件。基于XML格式的示例包括DOCX办公文档格式和SVG图像格式。

例如,一个应用程序可能允许用户上传图像,并在上传后在服务器上处理或验证这些图像。即使应用程序期望接收的是PNG或JPEG的格式,但所使用的图像处理库可能支持SVG图像。由于SVG格式使用XML,攻击者可以提交恶意SVG图像,从而达到XXE漏洞的隐藏攻击面。

LAB

通过修改内容类型进行XXE攻击

大多数POST请求使用由HTML表单生成的默认内容类型,如application/x-www-form-urlencoded。有些网站期望接收这种格式的请求,但也允许接受其他内容类型,包括XML。

如果一个正常的请求包含以下内容:

POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar

那么你可以提交以下请求,得到同样的结果:

POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>

如果应用程序允许在消息正文中包含XML的请求,并解析消息正文内容为XML,那么你只需将请求重新格式化为XML格式,就能达到隐藏的XXE攻击面。

如何发现和测试XXE漏洞

绝大多数XXE漏洞都可以通过Burp Suite的Web漏洞扫描器快速可靠地找到。

手动测试XXE漏洞一般包括:

  • 通过定义一个基于已知操作系统文件的外部实体,并将该实体用于应用程序响应返回的数据中,从而测试文件检索。

  • 测试盲XXE漏洞可以根据你所控制的系统的URL定义一个外部实体,并监视与该系统的交互。Burp Collaborator对此非常适合。

  • 通过使用XInclude攻击尝试检索已知的操作系统文件,测试服务器端XML文档中是否容易包含用户提供的非XML数据。

注意

请记住,XML只是一个数据传输格式。确保还测试了任何基于XML的功能是否存在其他漏洞,如XSS和SQL注入。你可能需要使用XML转义序列对有效载荷进行编码,以避免破坏语法,但你也可以使用这种方式来混淆你的攻击,以绕过薄弱的防御。

如何防范XXE漏洞

几乎所有的XXE漏洞都是因为应用程序的XML解析库支持了一些可能带来危险的XML特性,而应用程序本身并不需要或打算使用这些特性。防范XXE攻击最简单有效的方法就是禁用这些特性。

通常,禁用外部实体的解析和禁用对XInclude的支持就足够了。一般可以通过配置选项或编程方式覆盖默认行为来实现。有关如何禁用不必要功能的细节,请参阅你的XML解析库或API的文档。

阅读更多

查看所有XXE实验
了解XML格式,DTD和外部实体
使用外部实体利用XXE来检索文件
利用XXE实施SSRF攻击
发现和利用盲XXE漏洞
利用XInclude检索文件
通过图片文件上传利用XXE
使用Burp Suite的Web漏洞扫描器发现XXE漏洞