web 安全之 XXE 漏洞

06-01 1797阅读

在现代Web应用和数据交换中,XML(可扩展标记语言)以其灵活性和跨平台性成为不可或缺的技术标准。然而,这种灵活性的背后也埋藏着安全隐患,其中最“臭名昭著”的便是XXE(XML外部实体注入)漏洞。XXE能够让攻击者读取敏感文件、探测内部网络,甚至执行远程代码,威胁范围从数据泄露到系统瘫痪无所不包。

本文将从XML和DTD的基础知识入手,循序渐进地剖析XXE漏洞的原理、利用方式及其危害。


一、XML基础知识

1. 什么是XML

XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言,由W3C(World Wide Web Consortium,万维网联盟)制定并推荐为标准。与HTML不同,XML并不关注数据的显示,而是专注于数据的结构化和跨平台传输。XML的设计目标是提供一种通用的、灵活的数据格式,广泛应用于Web服务、配置文件、数据交换等领域。

XML的主要特点包括:

  • 可扩展性:用户可以自定义标签和结构。
  • 结构化:通过嵌套元素清晰表达数据层次。
  • 跨平台性:与编程语言和系统无关,易于解析和处理。

    2. XML的基本格式

    XML文档通常以一个可选的XML声明(XML Prolog)开头,用于指定版本和字符编码。例如:

     
    
    • version:XML的版本号,常用值为1.0。
    • encoding:字符编码,常见为UTF-8或ISO-8859-1。

      XML的基本语法规则如下:

      • 闭合标签:所有元素必须有开始和结束标签,例如content。
      • 大小写敏感:和被视为不同标签。
      • 正确嵌套:元素不能交叉,例如是合法的,而是非法的。
      • 根元素:每个XML文档必须有一个唯一的根元素包裹所有内容。
      • 属性引号:属性值必须用单引号或双引号包裹,例如。

        示例:

        
            Alice
            25
        
        

        3. XML中的实体引用

        XML中某些特殊字符(如、&等)具有特殊含义,直接使用会导致解析错误。为解决这个问题,XML引入了实体引用(Entity Reference)来转义这些字符。XML预定义了以下五种实体引用:

        特殊字符实体引用描述
        >大于号
        &&和号
        ''单引号
        ""双引号

        示例:

        This is a test <example">>
        

        解析后显示为:This is a test 。

        实体引用不仅限于预定义字符,用户还可以通过DTD自定义实体,这为XXE漏洞的利用提供了基础。


        二、DTD基础知识

        1. 什么是DTD

        DTD(Document Type Definition,文档类型定义)是XML的格式规范,用于定义XML文档的结构和语义约束。它规定了哪些元素、属性是合法的,以及它们之间的嵌套关系。DTD可以嵌入在XML文档中(内部DTD),也可以存储在外部文件中并通过引用引入(外部DTD)。

        DTD的主要作用:

        • 验证XML文档的合法性。
        • 定义可重用的实体(如字符串或外部资源)。
        • 提供结构化的约束,确保数据符合预期格式。

          2. DTD的声明方式

          (1) 内部DTD

          内部DTD直接定义在XML文档的标签内,适用于小型或独立文档。

          语法:

          web 安全之 XXE 漏洞
          (图片来源网络,侵删)
           
          

          示例:

          
              
              
              
          ]>
          
              Alice
              Bob
              Hello
              How are you?
          
          
          • :定义元素的名称和内容类型。
          • #PCDATA:表示“可解析的字符数据”(Parsed Character Data)。
            (2) 外部DTD

            外部DTD将定义存储在独立文件中,通过SYSTEM或PUBLIC关键字引入。

            web 安全之 XXE 漏洞
            (图片来源网络,侵删)
            • SYSTEM引用:指向自定义的本地或远程DTD文件。

              语法:

               

              示例:

              
              
                  Alice
              
              

              note.dtd内容:

              
              
            • PUBLIC引用:引用标准化的公开DTD(如HTML的DTD)。

              语法:

               

              示例:

              
                  Test
                  

              Hello

              3. DTD中的核心概念

              (1) 元素声明

              定义XML文档中允许的元素及其内容类型。

              语法:

               
              

              类别值:

              • (#PCDATA):字符数据。
              • EMPTY:空元素,无内容。
              • ANY:任意内容。
              • (child1, child2):指定子元素的顺序和结构。

                示例:

                
                
                
                (2) 实体(Entity)

                实体是DTD中用于定义可重用内容的机制,分为一般实体和参数实体。

                • 一般实体

                  用于在XML内容中引用,语法为&实体名称;。

                  • 内部定义:
                     示例:
                    
                    &demo;
                    
                    输出:Hello, World。
                  • 外部定义:
                     示例:
                    
                    &file;
                    
                    如果解析器支持外部实体,可能会读取/etc/passwd文件内容。
                  • 参数实体

                    用于在DTD内部引用,语法为%实体名称;。只能在DTD中使用。

                    • 内部定义:
                       示例:
                      
                      ]>
                      &content;
                      
                      输出:Hello World。
                    • 外部定义:
                       
                      

                      三、什么是XXE漏洞

                      1. XXE定义

                      XXE(XML External Entity Injection,XML外部实体注入)是一种安全漏洞,发生在应用程序解析用户提交的XML输入时,未正确禁用或限制外部实体的加载。攻击者通过构造恶意的XML payloads,利用外部实体读取服务器文件、发起网络请求,甚至执行更复杂的攻击。

                      2. XXE的成因

                      XXE漏洞的根本原因在于XML解析器支持DTD和外部实体,且未妥善配置安全选项。常见触发条件:

                      • 应用程序接受用户输入的XML数据。
                      • XML解析器启用了外部实体解析(默认行为)。
                      • 缺乏输入验证或过滤。

                        例如,PHP的libxml库在默认情况下支持外部实体解析:

                        $xml = simplexml_load_string($user_input, LIBXML_NOENT);
                        

                        如果未设置LIBXML_NOENT,外部实体将被解析。

                        3. XXE的基本利用

                        (1) 读取本地文件

                        攻击者通过外部实体读取服务器上的敏感文件。

                        Payload:

                        
                        &xxe;
                        

                        如果服务器解析此XML,可能会返回/etc/passwd的内容。

                        (2) 发起网络请求

                        利用外部实体向攻击者控制的服务器发送请求。

                        Payload:

                        
                        &xxe;
                        

                        服务器会请求evil.dtd,攻击者可通过日志捕获请求。


                        四、XXE进阶利用

                        1. 使用参数实体实现复杂攻击

                        参数实体可以嵌套定义,常用于盲XXE(Blind XXE)场景,即服务器不直接回显数据。

                        示例:盲XXE数据外带

                        Payload:

                        
                            %dtd;
                            %send;
                        ]>
                        &xxe;
                        

                        evil.dtd内容:

                         
                        

                        服务器解析后,会将/etc/passwd内容通过URL参数发送到attacker.com。

                        2. 使用伪协议

                        在某些环境中(如PHP),支持伪协议(如php://filter)读取文件。

                        Payload:

                        
                        &xxe;
                        

                        返回的内容将是/etc/passwd的Base64编码,避免直接暴露不可解析字符。

                        3. XXE的DoS攻击

                        构造递归实体定义,导致解析器耗尽资源。

                        Payload:

                        
                            
                            
                            
                        ]>
                        &xxe3;
                        

                        此攻击称为“亿笑攻击”(Billion Laughs),会迅速耗尽内存。


                        五、XXE的危害

                        1. 敏感数据泄露

                          XXE允许攻击者读取服务器上的任意文件,例如配置文件、源代码、用户凭据或系统密码文件(如/etc/passwd)。这种能力使得敏感信息暴露的风险急剧增加,可能导致身份盗用、业务逻辑泄露等严重后果。

                        2. 内部网络探测

                          通过构造特定的外部实体,攻击者能够扫描服务器所在内部网络,探测未公开的服务、端口或应用。这种信息搜集为后续的定向攻击奠定了基础,显著提升了攻击的成功率。

                        3. 服务器端请求伪造(SSRF)

                          XXE可迫使服务器向内部系统或外部资源发起请求。攻击者利用这一点,可能触发未授权的数据交互,甚至通过与内部服务的通信窃取更多机密信息。

                        4. 远程代码或命令执行

                          在某些极端情况下,当XML解析器支持特定扩展功能(如某些Java库的特性)时,XXE可能被用于加载恶意资源,进而执行远程代码或系统命令。这种攻击一旦成功,服务器可能被完全控制。

                        5. 拒绝服务攻击(DoS)

                          XXE的经典利用方式之一是构造递归实体(如“亿笑攻击”),通过无限扩展实体引用耗尽服务器的内存和CPU资源。此外,指向大型外部资源或恶意构造的XML文档也能显著降低系统可用性。

                        6. 绕过防火墙限制

                          XXE允许攻击者利用服务器作为代理,向内部网络资源发送请求,从而绕过外部防火墙的访问限制。这使得原本无法直接接触的敏感系统暴露在威胁之下。

                        7. 植入恶意内容

                          在特定场景中,攻击者可能通过XXE将恶意数据注入系统,例如篡改日志文件或数据库内容,破坏数据的完整性,甚至为后续攻击埋下伏笔。


                        六、XXE的检测与防御

                        1. 检测方法

                        • 手动测试:提交包含外部实体的XML,观察响应。
                        • 自动化工具:Burp Suite、XXEinjector等。
                        • 特征检查:服务器是否回显文件内容或发起外部请求。

                          2. 防御措施

                          • 禁用外部实体:
                            • PHP:
                              libxml_disable_entity_loader(true);
                              
                            • Java(SAXParser):
                              saxParserFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);
                              saxParserFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
                              
                            • 输入过滤:禁止用户输入或。
                            • 使用JSON替代XML:JSON不支持实体,天然免疫XXE。
                            • 升级库版本:确保使用最新、安全的XML解析器。

                              七、总结

                              XXE漏洞是一种高危漏洞,利用门槛低但破坏力强。从基础的文件读取到进阶的盲注和DoS攻击,XXE展示了XML灵活性背后的安全隐患。开发者应深入理解XML和DTD的工作原理,采取严格的防御措施,确保应用程序安全。

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码