在.NET下如何预防XXE注入攻击
接下来关于.NET中XXE注入的内容来自Dean Fleming单元测试的Web站点:https://github.com/deanf1/dotnet-security-unit-tests。该站点覆盖了目前.NET下支持的所有XML解析器,且测试用例均展示了哪些情况下它们对于XXE注入而言是安全的,哪些情况下又是不安全的。这些内容更早之前是基于James Jardine这篇关于.NET XXE的杰出文章:https://www.jardinesoftware.net/2016/05/26/xxe-and-net/。与微软这篇在.NET下如何预防XXE以及XML拒绝服务的老文章http://msdn.microsoft.com/en-us/magazine/ee335713.aspx 相比它提供了更新更全的内容,但与Dean Fleming的Web站点覆盖的地方相比还是有些不准确的地方。
下表罗列了.NET下所有支持的XML解析器其默认的安全级别:
XML解析器 | 默认是否安全? |
---|---|
LINQ to XML | 是 |
XmlDictionaryReader | 是 |
XmlDocument | |
4.5.2之前的版本 4.5.2及之后的版本 |
否 是 |
XmlNodeReader | 是 |
XmlReader | 是 |
XmlTextReader | |
4.5.2之前的版本 4.5.2及之后的版本 |
否 是 |
XPathNavigator | |
4.5.2之前的版本 4.5.2及之后的版本 |
否 是 |
XslCompiledTransform | 是 |
LINQ to XML
System.Xml.Linq
类库下的 XElement
和 XDocment
对于XXE注入而言默认都是安全的。XElement
仅解析XML中的元素,直接忽略了 DTDs。XDocment
默认禁止 DTDs,其仅在基于非安全的XML解析器构建时才是不安全的。
XmlDictionaryReader
System.Xml.XmlDictionaryReader
默认情况下是安全的,当它尝试解析 DTDs 时,编译器会抛出一个 “CData elements not valid at top level of an XML document
” 的异常,其仅在基于非安全的XML解析器构建时才是不安全的。
XmlDocment
在.NET Framework 4.5.2之前的版本中,System.Xml.XmlDocument
默认是不安全的。要预防XXE,在4.5.2之前的版本中,XmlDocument
下的 XmlResolver
属性需要手工设置为null。而在4.5.2及其之后的版本中,XmlResolver
默认就已经被设置为了null。下面的例子展示了如何进行预防:
static void Reader()
{
string xml = @"<?xml version=""1.0"" ?><!DOCTYPE doc
[< !ENTITY win SYSTEM ""file:///C:/Users/user/Documents/testdata2.txt"">]
>< doc > &win;</ doc >";
XmlReader myReader = XmlReader.Create(new StringReader(xml));
while (myReader.Read())
{
Console.WriteLine(myReader.Value);
}
Console.ReadLine();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
如果你使用非空且具有默认或不安全设置的 XmlResolver
,那么 XmlDocument
将无法预防XXE。如果你需要允许处理 DTD,这篇MSDN的文章详细介绍了如何安全的处理 DTD。
XmlNodeReader
System.Xml.XmlNodeReader
默认情况下是安全的,且就算它是基于非安全的XML解析器构建,或被封装到其它非安全的XML解析器时,它也不会处理而是忽略掉 DTDs。
XmlReader
System.Xml.XmlReader
默认情况下是安全的。在4.0及之前的版本中,其ProhibitDtd
属性被设置为 false
,而在4.0及其之后的版本中,其DtdProcessing
属性被设置为 Prohibit
。另外,在4.5.2及更高版本中,XmlReader
的 XmlReaderSettings
默认将其XmlResolver
属性设置为了null,用于提供额外的安全措施。因此,在4.5.2及之后的版本中,必须同时将 DtdProcessing
属性设置为Parse
,且 XmlReaderSetting
的 XmlResolver
属性必须赋值为非空且具有默认或不安全设置的相关实现。如果你需要允许处理 DTD,这篇MSDN的文章详细介绍了如何安全的处理 DTD。
XmlTextReader
在.NET Framework 4.5.2之前的版本中,System.Xml.XmlTextReader
默认是不安全的。下面是在不同的.NET版本中进行安全设置:
4.0之前的版本
.NET4.0之前,在 System.Xml.XmlReaderSettings
和 System.Xml.XmlTextReader
类中,像 XmlTextReader
这类 XmlReader
的DTD解析行为是由Boolean类型的 ProhibitDtd
属性来控制的,将该值设置为 true
将可以完全禁止内联DTDs。
XmlTextReader reader = new XmlTextReader(stream);
reader.ProhibitDtd = true; // NEEDED because the default is FALSE!!
- 1
- 2
.NET 4.0 - .NET 4.5.2
.NET4.0版本中DTD的解析行为发生了变化。已不再推荐通过 ProhibitDtd
属性进行安全控制,取而代之的是 DtdProcessing
属性。然而他们并没有改变其默认设置,所以在默认情况下,XmlTextReader
对于XXE而言仍然是易受攻击的。将 DtdProcessing
设置为Prohibit
后,如果XML包含 <!DOCTYPE>
元素将会在程序运行时抛出一个异常。你可以这样设置这个值:
XmlTextReader reader = new XmlTextReader(stream);
reader.DtdProcessing = DtdProcessing.Prohibit; // NEEDED because the default is Parse!!
- 1
- 2
或者你可以将 DtdProcessing
设置为 Ignore
,这样就算有<!DOCTYPE>
程序也不会抛出异常,而是简单的跳过且不处理它。最后,你可以将 DtdProcessing
属性设置为 Parse
来允许处理内联DTDs。
.NET 4.5.2及之后的版本
.NET4.5.2及其之后的版本中,XmlTextReader
的 XmlResolver
属性(可访问性为internal
)默认被设置为null,这样默认XmlTextReader
将会忽略DTDs。当使用非空且具有默认或不安全设置的 XmlResolver
时,XmlTextReader
将会变得不安全。
XPathNavigator
在4.5.2版本之前,System.Xml.XPath.XPathNavigator
默认是不安全的。这是因为它像 XmlDocument
那样实现了 IXPathNavigable
接口,这个接口在4.5.2之前的版本中默认也是不安全的。你可以通过传递安全的Xml解析器(比如 XmlReader
,它默认是安全的)到XPathNavigator
的构造函数中来获取安全的 XPathNavigator
实例,以下是例子:
XmlReader reader = XmlReader.Create("example.xml");
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
string xml = nav.InnerXml.ToString();
- 1
- 2
- 3
- 4
XslCompiledTransform
只要给定的Xml解析器是安全的,那么 System.Xml.Xsl.XslCompiledTransform
(Xml转换器)默认就是安全的。它之所以安全是因为Transform()
方法默认的解析器是 XmlReader
,这个解析器默认是安全的(前面有描述)。你可以在此处查看它的源代码。有些Transform()
的重构方法接受像 XmlReader
、IXPathNavigable
(比如 XmlDocument
)之类的参数,如果你传递的是不安全的Xml解析器,那么 Transform
方法也将不安全。
英文地址:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#.NET
在.NET下如何预防XXE注入攻击的更多相关文章
- XXE注入攻击与防御
在研究XXE注入攻击之前先了解一下什么是XXE 定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括 ...
- 预防SQL注入攻击
/** * 预防SQL注入攻击 * @param string $value * @return string */ function check_input($value) { // 去除斜杠 if ...
- 怎么预防sql注入攻击
假设sql是搜索用户A的文章,sql会是这样: select * from table where owner='A'; sql注入攻击者会修改用户名来实现攻击,例如把A 改成A' or 1='1 组 ...
- 023. Asp.net参数化查询预防Sql注入攻击
/// <summary> /// 参数化查询预防SQL注入式攻击 /// </summary> public int checkLogin(string loginName, ...
- 如何对抗、预防 SQL注入 攻击
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...
- SQL参数化查询--最有效可预防SQL注入攻击的防御方式
参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值. 在使用参 ...
- Oracle数据库XXE注入漏洞(CVE-2014-6577)分析
在这篇文中,我们将共同分析一下Oracle数据库的XXE注入漏洞(CVE-2014-6577),Oracle公司1月20日发布了针对该漏洞的相关补丁. 有关XXE的相关知识,可以查看安全脉搏站内的另一 ...
- (非原)SQL注入专题--整理帖 && like 语句拼sql 如何防止注入攻击。
原地址:blog.csdn.net/lvjin110/article/details/28697695 like 语句拼sql 如何防止注入攻击?http://bbs.csdn.net/topics/ ...
- 网站mysql防止sql注入攻击 3种方法总结
mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...
随机推荐
- memcached 配置
Memcached是一款开源.高性能.分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序.它是一个基于内存的“键值对”存储,用于存储数据 ...
- jquery正则表达式验证(手机号、身份证号、中文名称)
这篇文章主要介绍了jquery正则表达式验证,实现手机号.身份证号.中文名称验证,感兴趣的小伙伴们可以参考一下 本文实例需要验证的内容:中文姓名.手机号.身份证和地址,验证方法分享给大家供大家参考,具 ...
- fillder--信息面板展示serverIP
1.Ctrl+R打开面板 2.如上图的位置,加上一句后,重启Fillder即可 FiddlerObject.UI.lvSessions.AddBoundColumn(, "X-HostIP& ...
- webpack的总结
1,首先 项目的入口----package的入口 "scripts": { "dev": "node build/dev-server.js" ...
- 使用PHPStorm 配置自定义的Apache与PHP环境
使用PHPStorm 配置自定义的Apache与PHP环境之一 关于phpstorm配置php开发环境,大多数资料都是直接推荐安装wapmserver.而对于如何配置自定义的PHP环境和Apach ...
- Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)
An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...
- hdu1285 确定比赛名次【拓扑排序】
题目链接 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- linux(manjaro)磁盘迁移/opt /home
目录 1. 创建临时挂载点/opt, 并将分区挂载到临时挂载点上: 2. 切换单用户,将除了root用户之外的用户踢出 3. 将/opt目录下的所有内容拷贝到临时挂载点中,等待结束 4. 进入/et ...
- ECMAScript6 入门 变量的解析赋值
ES6 允许按照一定模式,先=从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 这句话的解释:第一步从数组或者对象中提取值,第二步将提取到的值对变量进行赋值 数组的解 ...
- sql语句1——join
注:一下内容来自于http://www.w3school.com.cn/sql/ 1. 引用两个表 我们可以通过引用两个表的方式,从两个表中获取数据: 谁订购了产品,并且他们订购了什么产品? sele ...