在.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数据库如 ...
随机推荐
- python manage.py runserver指定端口和ip
python manage.py runserver 0.0.0.0:8000 在本地运行程序,python manager.py runserver打开http://127.0.0.1:5000端口 ...
- 怎样把linux客户端用户禁止用 su命令来切换用户
系统中有一个组叫做“wheel”,我们可以利用该组实现一些特殊的功能.我们可以将拥有su使用权限的用户加入到wheel组中并且对该组进行限制,那么只有在该组中的用户才有su的使用权限. 如要实现该功能 ...
- Ubuntu学习
一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词,意思是“人性”.“我的存在是因为大 ...
- js防止安卓手机软键盘弹出挤压页面导致变形的方法
5防止安卓手机软键盘弹出挤压页面导致变形的方法 输入框定位在底部,手机端打开,输入框聚焦后软键盘打开为什么会瞬间自动关闭呢? 先看看问题: 1.原来是这样的: 2.在苹果手机里面是正常的: 3.到了安 ...
- Python中GIL
GIL(global interpreter lock)全局解释器锁 python中GIL使得同一个时刻只有一个线程在一个cpu上执行,无法将多个线程映射到多个cpu上执行,但GIL并不会一直占有,它 ...
- 基于Keil软件的MCU环境搭建
我们在开发一款新的MCU的时候,偶尔会遇到Keil软件没有对应的Device设备选型,以下,我们以STM32F407VGT6作为实例来演示整个环境的搭建过程: 一.如下所示,我需要选择的是ST公司的S ...
- python inspect 模块 和 types 模块 判断是否是方法,模块,函数等内置特殊属性
python inspect 模块 和 types 模块 判断是否是方法,模块,函数等内置特殊属性 inspect import inspect def fun(): pass inspect.ism ...
- 3dsmax不同版本 pyside qt UI 设置max窗口为父窗口的方法
3dsmax不同版本 pyside qt widget 设置 max 窗口为父窗口的方法 前言: 3dsmax 在 2014 extension 之后开始集成 Python 和 PySide,但是在版 ...
- 2018年中国研究生数学建模竞赛C题 二等奖 赛题论文
2018年中国研究生数学建模竞赛C题 对恐怖袭击事件记录数据的量化分析 恐怖袭击是指极端分子或组织人为制造的.针对但不仅限于平民及民用设施的.不符合国际道义的攻击行为,它不仅具有极大的杀伤性与破坏力, ...
- poj1041 【无向图欧拉回路】 按最小升序输出
题目链接:http://poj.org/problem?id=1041 题目大意: 题目大意:一个城镇有n个二叉路口,这些路口由m条街道连接,某人想要从某个路口出发,经过所有的街道且每条街道只走一次, ...