浅谈XXE攻击

一、介绍

现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、paypal等等。 举个例子,我们扫一眼这些网站最近奖励的漏洞,充分证实了前面的说法。尽管XXE漏洞已经存在了很多年,但是它从来没有获得它应得的关注度。很多XML的解析器默认是含有XXE漏洞的,这意味着开发人员有责任确保这些程序不受此漏洞的影响。

[[184002]]

本文主要讨论什么是XML外部实体,这些外部实体是如何被攻击的。

二、什么是XML外部实体?

如果你了解XML,你可以把XML理解为一个用来定义数据的东东。因此,两个采用不同技术的系统可以通过XML进行通信和交换数据。 比如,下图就是一个用来描述一个职工的XML文档样本,其中的’name’,’salary’,’address’ 被称为XML的元素。

有些XML文档包含system标识符定义的“实体”,这些XML文档会在DOCTYPE头部标签中呈现。这些定义的’实体’能够访问本地或者远程的内容。比如,下面的XML文档样例就包含了XML ‘实体’。

在上面的代码中, XML外部实体 ‘entityex’ 被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体’entityex’的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。 关键字’SYSTEM’会告诉XML解析器,’entityex’实体的值将从其后的URI中读取。因此,XML实体被使用的次数越多,越有帮助。

三、什么是XML外部实体攻击?

有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。比如,下面的代码将获取系统上folder/file的内容并呈献给用户。

四、怎么甄别一个XML实体攻击漏洞?

最直接的回答就是: 甄别那些接受XML作为输入内容的端点。 但是有时候,这些端点可能并不是那么明显(比如,一些仅使用JSON去访问服务的客户端)。在这种情况下,渗透测试人员就必须尝试不同的测试方式,比如修改HTTP的请求方法,修改Content-Type头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有XXE攻击漏洞。

五、如何确认XXE漏洞?

出于演示的目的,我们将用到一个Acunetix维护的demo站点,这个站点就是: http://testhtml5.vulnweb.com/。这个站点可用于测试Acunetix web扫描器的功能。 访问 http://testhtml5.vulnweb.com/ 站点,点击 ‘Login’下面的 ‘Forgot Password’ 链接。注意观察应用程序怎样使用XML传输数据,过程如下图所示:

请求:

响应:

观察上面的请求与响应,我们可以看到,应用程序正在解析XML内容,接受特定的输入,然后将其呈现给用户。为了测试验证XML解析器确实正在解析和执行我们自定义的XML内容,我们发送如下的请求

修改后的请求和响应:

如上图所示,我们在上面的请求中定义了一个名为myentity、值为’testing’的实体。 响应报文清晰地展示了解析器已经解析了我们发送的XML实体,然后并将实体内容呈现出来了。 由此,我们可以确认,这个应用程序存在XXE漏洞。

六、如何进行XXE攻击?

  1. Code 1: 
  2.  
  3.      
  4.  
  5.     1. To read files on same server: 
  6.  
  7.      
  8.  
  9.      <?xml version="1.0" encoding="ISO-8859-1"?> 
  10.  
  11.      
  12.  
  13.      <!DOCTYPE foo [  
  14.  
  15.      
  16.  
  17.      <!ENTITY myentity SYSTEM "file:///location/anyfile" >]> 
  18.  
  19.      
  20.  
  21.      <abc>&myentity;</abc> 
  22.  
  23.      
  24.  
  25.     2. To crash the server / Cause denial of service: 
  26.  
  27.      
  28.  
  29.      <?xml version="1.0"?> 
  30.  
  31.      
  32.  
  33.      <!DOCTYPE lolz [ 
  34.  
  35.      
  36.  
  37.      <!ENTITY lol "lol"> 
  38.  
  39.      
  40.  
  41.      <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> 
  42.  
  43.      
  44.  
  45.      <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> 
  46.  
  47.      
  48.  
  49.      <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> 
  50.  
  51.      
  52.  
  53.      <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> 
  54.  
  55.      
  56.  
  57.      <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> 
  58.  
  59.      
  60.  
  61.      <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> 
  62.  
  63.      
  64.  
  65.      <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> 
  66.  
  67.      
  68.  
  69.      <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;"> 
  70.  
  71.      
  72.  
  73.      ]> 
  74.  
  75.      
  76.  
  77.      <lolz>&lol9;</lolz> 

上面样例代码1中的XXE漏洞攻击就是著名的’billion laughs’(https://en.wikipedia.org/wiki/Billion_laughs)攻击,该攻击通过创建一项递归的 XML 定义,在内存中生成十亿个”Ha!”字符串,从而导致 DDoS 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。除了这些,攻击者还可以读取服务器上的敏感数据,还能通过端口扫描,获取后端系统的开放端口。

影响:

此漏洞非常危险, 因为此漏洞会造成服务器上敏感数据的泄露,和潜在的服务器拒绝服务攻击。

补救措施:

上面讨论的主要问题就是XML解析器解析了用户发送的不可信数据。然而,要去校验DTD(document type definition)中SYSTEM标识符定义的数据,并不容易,也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此,最好的解决办法就是配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD。

比如下面的Java代码,通过设置相应的属性值为false,XML外部实体攻击就能够被阻止。因此,可将外部实体、参数实体和内联DTD 都被设置为false,从而避免基于XXE漏洞的攻击。

以下是代码的第二段

  1. import javax.xml.parsers.DocumentBuilderFactory; 
  2.  
  3.      
  4.  
  5.     import javax.xml.parsers.ParserConfigurationException; // catching unsupported features 
  6.  
  7.      
  8.  
  9.     ... 
  10.  
  11.      
  12.  
  13.      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
  14.  
  15.      
  16.  
  17.      try { 
  18.  
  19.      
  20.  
  21.      // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities 
  22.  
  23.      
  24.  
  25.      // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities 
  26.  
  27.      
  28.  
  29.      String FEATURE = "http://xml.org/sax/features/external-general-entities"
  30.  
  31.      
  32.  
  33.      dbf.setFeature(FEATURE, false); 
  34.  
  35.      
  36.  
  37.      // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities 
  38.  
  39.      
  40.  
  41.      // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities 
  42.  
  43.      
  44.  
  45.      FEATURE = "http://xml.org/sax/features/external-parameter-entities"
  46.  
  47.      
  48.  
  49.      dbf.setFeature(FEATURE, false); 
  50.  
  51.      
  52.  
  53.      // Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl 
  54.  
  55.      
  56.  
  57.      FEATURE = "http://apache.org/xml/features/disallow-doctype-decl"
  58.  
  59.      
  60.  
  61.      dbf.setFeature(FEATURE, true); 
  62.  
  63.      
  64.  
  65.      // remaining parser logic 
  66.  
  67.      
  68.  
  69.      ... 
  70.  
  71.      
  72.  
  73.      catch (ParserConfigurationException e) { 
  74.  
  75.      
  76.  
  77.      // This should catch a failed setFeature feature 
  78.  
  79.      
  80.  
  81.      logger.info("ParserConfigurationException was thrown. The feature '" + 
  82.  
  83.      
  84.  
  85.      FEATURE + 
  86.  
  87.      
  88.  
  89.      "' is probably not supported by your XML processor."); 
  90.  
  91.      
  92.  
  93.      ... 
  94.  
  95.      
  96.  
  97.      } 
  98.  
  99.      
  100.  
  101.      catch (SAXException e) { 
  102.  
  103.      
  104.  
  105.      // On Apache, this should be thrown when disallowing DOCTYPE 
  106.  
  107.      
  108.  
  109.      logger.warning("A DOCTYPE was passed into the XML document"); 
  110.  
  111.      
  112.  
  113.      ... 
  114.  
  115.      
  116.  
  117.      } 
  118.  
  119.      
  120.  
  121.      catch (IOException e) { 
  122.  
  123.      
  124.  
  125.      // XXE that points to a file that doesn't exist 
  126.  
  127.      
  128.  
  129.      logger.error("IOException occurred, XXE may still possible: " + e.getMessage());.. } 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/124197.html<

(0)
管理的头像管理
上一篇2025-02-23 04:13
下一篇 2025-02-23 04:14

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注