通八洲科技

C# XML解析中的安全漏洞 XXE攻击的原理与防范措施

日期:2025-11-29 00:00 / 作者:小老鼠
XXE攻击通过XML外部实体注入读取敏感文件或发起SSRF,C#中使用XmlReaderSettings需设置DtdProcessing.Prohibit且XmlResolver=null以禁用外部实体,避免XDocument.Load或DataSet.ReadXml等不安全解析方式。

在C#开发中,处理XML数据是常见需求,但若未正确配置XML解析器,可能引发严重的安全漏洞——XXE(XML External Entity)攻击。攻击者可利用该漏洞读取服务器本地文件、执行远程请求,甚至导致拒绝服务。理解其原理并采取有效防范措施至关重要。

XXE攻击的原理

XXE(XML External Entity Injection)即“XML外部实体注入”,攻击者通过在XML文档中定义恶意外部实体,诱导解析器加载危险资源。

例如,构造如下XML:



win.ini">
]>
&xxe;

当使用默认配置的XmlReaderXDocument解析时,实体&xxe;会被替换为系统文件内容,导致敏感信息泄露。

攻击还可结合其他技术实现SSRF(服务器端请求伪造),访问内网服务或探测防火墙策略。

常见的易受攻击的C#代码场景

以下写法存在风险:

DataSet.ReadXml() 特别危险,因其默认启用DTD处理且难以完全控制,应避免用于不可信输入。

防范XXE攻击的有效措施

核心原则:禁用外部实体和DTD处理,使用最小权限解析XML。

推荐做法如下:

var settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
settings.XmlResolver = null;
using var reader = XmlReader.Create(stream, settings);
XDocument doc = XDocument.Load(reader);
var doc = new XmlDocument();
doc.XmlResolver = null;
doc.Load(inputStream); // 确保外部解析器已置空

总结

XXE漏洞源于XML解析器对外部实体的默认信任行为。在C#中,只要正确配置XmlReaderSettings,将DtdProcessing设为ProhibitIgnore,并置空XmlResolver,即可有效防御此类攻击。关键在于不依赖默认设置,始终以安全优先的方式解析不可信XML。

基本上就这些。