CS.XXE.READER
可能的 XML 外部实体 (XXE) 攻击
CS.XXE.READER 检查器会标记 XML 输入的由配置较弱的 XmlReader 分析程序处理的实例。
漏洞与风险
XML 外部实体攻击是一种针对解析 XML 输入的应用程序的攻击。当包含对外部实体进行引用的 XML 输入由配置较弱的 XML 分析程序处理时,会发生此攻击。这种攻击可能导致机密数据泄露、拒绝服务、服务器端请求伪造、从分析程序所在机器的角度进行端口扫描,以及其他系统影响。
缓解与预防
防止 XXE 攻击的最安全方法是完全禁用 DTD(外部实体)。根据分析程序的不同,方法可能会有所不同。例如,在 .NET 4.5.2+ 中,XmlReader 默认禁用 DTD,在 DtdProcessing = Parse 且 XmlResolver 不为 null 时才会出现安全风险。
漏洞代码示例
复制
static void LoadXML()
{
string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/SecretData.txt'>]>" + "<doc>&win;</doc>";
string xml = "<?xml version='1.0' ?>" + xxePayload;
XmlReaderSettings settings = new XmlReaderSettings(); // XmlReaderSettings processes Dtd and
// uses a non-null XmlResolver, so it is unsafe.
settings.DtdProcessing = DtdProcessing.Parse;
settings.XmlResolver = new XmlUrlResolver();
XmlReader reader = XmlReader.Create(xml, settings);
while (reader.Read())
{ ...}
}
修正代码示例
复制
static void LoadXML() {
string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/SecretData.txt'>]>" + "<doc>&win;</doc>";
string xml = "<?xml version='1.0' ?>" + xxePayload;
XmlReaderSettings settings = new XmlReaderSettings(); // Using the default safe settings
XmlReader reader = XmlReader.Create(xml, settings);
while (reader.Read())
{ ...}
}