XXE 攻击既可恶,也没那么危言耸听。

栏目: 编程语言 · XML · 发布时间: 5年前

内容简介:XML External Entity attack

XXE

XML External Entity attack

漏洞原理

XML 中可以引用外部资源,比如:Entities、DTDs、Schemas,这些都可以作为另外一个文件,引入到 XML 中,这就像 HTML 中引用 CSS 文件一样。

这个外部资源既可以是本地的、也可以是网络的。

这就可能带来一个风险,比如 A 向 B 传输数据,是 XML 格式的:

  • A 故意放置一个 file://D:/itpow.txt 的 Entity 在 XML 中。
  • B 收到后,XmlDocument 就会去解析它,就会把 D:\itpow.txt 读取出来。
  • A 还可以构造更复杂的 XML,利用变量,将 D:\itpow.txt 中的内容放置在某个 URL 的结尾,XmlDocument 去解析这个 URL 的时候,顺道把 D:\itpow.txt 的内容也带出去了,这就是安全隐患了。B 本地的内容都被 A 偷走了。

除此之外,A 还可以构造更多特殊格式,使 B 那里解析 XML 变成执行本地文件、遭受 DDoS 攻击等内容。

确实挺可怕的,我们简单试一下呢,我们只是看看,它有没有读取 D:\itpow.txt 的内容。

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<!DOCTYPE cftea [<!ENTITY passwd SYSTEM ""file://D:/itpow.txt"">]>
<cftea>&passwd;</cftea>");

XmlNodeList xmlNodeList = xmlDocument.GetElementsByTagName("cftea");
foreach (XmlNode item in xmlNodeList)
{
	MessageBox.Show(item.InnerText);
}

发现根本没有显示  itpow.txt 的内容嘛,然后我们再试试下面这个:

XmlUrlResolver myResolver = new XmlUrlResolver();
myResolver.Credentials = CredentialCache.DefaultCredentials;

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.XmlResolver = myResolver;
xmlDocument.LoadXml(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<!DOCTYPE cftea [<!ENTITY passwd SYSTEM ""file://D:/itpow.txt"">]>
<cftea>&passwd;</cftea>");

XmlNodeList xmlNodeList = xmlDocument.GetElementsByTagName("cftea");
foreach (XmlNode item in xmlNodeList)
{
	MessageBox.Show(item.InnerText);
}

测试时,要看到效果得用 InnerText 属性,不要用 Value 属性,当然用哪个属性不影响是否被攻击,只是决定了你看不看得到内容。

作为攻击者,前面 encoding="UTF-8",最好去掉,因为如果 D:\itpow.txt 不是 UTF-8 格式,就会出现解析失败。

扯远了,我们发现:D:\itpow.txt 的内容被显示出来了。

回头看看,是哪里使攻击实现了呢?原来是 XmlResolver,为它赋值后,这玩意就去解析其中的外部资源了,如果你不信你可以测试一下,将外部资源指向一个不存在的地址,当没有指定 XmlResolver 时不会报错,当指定了 XmlResolver 时就会报错。

也就是说 .NET 默认是不支持外部资源的,同样现在的浏览器解析 XML 时,默认也是不支持外部资源的。

也就是说攻击者要成功,必须是被攻击者为 XmlResolver 指定了解析器,而我相信 99.9999% 的开发者是没有主动为这个赋值的。

有人说,我 NTFS 权限设置得好,网站的权限仅限本文件夹,访问不到 D:\itpow.txt,即使设置了 XmlResolver 也不怕,其实不能这么说,对,的确访问不了 D:\itpow.txt,但是,本网站目录的源代码总会被访问到吧?还有攻击者可能并不只是读文件攻击这么简单。

所以还是老老实实的不要为 XmlResolver 赋值吧。微信支付建议为 XmlResolver 赋值为 null,其实没多大必要,因为它初始就是 null 的。

有人会说,但是我确实需要解析外部资源,怎么办呢?

这时首先要确认受信任的外部资源地址。

然后自定义一个类,继承自 XmlUrlResolver,重载函数:public override Uri ResolveUri(Uri baseUri, string relativeUri):受信任时,就调用基类解析之; 当地址不受信任时,就返回 null。 代码如下:

public class MyUrlResovler : XmlUrlResolver
{
	public override Uri ResolveUri(Uri baseUri, string relativeUri)
	{
		Uri uri = new Uri(baseUri, relativeUri);
		if (uri.Host == "xxx")
		{
			return base.ResolveUri(baseUri, relativeUri);
		}
		else
		{
			return null;
		}
	}
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

区块链技术驱动金融

区块链技术驱动金融

阿尔文德·纳拉亚南、约什·贝努、爱德华·费尔顿、安德鲁·米勒、史蒂文·戈德费德 / 林华、王勇 / 中信出版社,中信出版集团 / 2016-8-25 / CNY 79.00

从数字货币及智能合约技术层面,解读了区块链技术在金融领域的运用。“如果你正在寻找一本在技术层面解释比特币是如何运作的,并且你有一定计算机科学和编程的基本知识,这本书应该很适合你。” 《区块链:技术驱动金融》回答了一系列关于比特币如何运用区块链技术运作的问题,并且着重讲述了各种技术功能,以及未来会形成的网络。比特币是如何运作的?它因何而与众不同?你的比特币安全吗?比特币用户如何匿名?区块链如何......一起来看看 《区块链技术驱动金融》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试