在.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数据库如 ...
随机推荐
- Flink运行在yarn上
在一个企业中,为了最大化的利用集群资源,一般都会在一个集群中同时运行多种类型的 Workload.因此 Flink 也支持在 Yarn 上面运行: flink on yarn的前提是:hdfs.yar ...
- fillder--信息面板显示请求耗时列
class Handlers--------->Ctrl+R,找到该方法,加上以下方法即可 { // 显示每行请求的发起时间:时分秒毫秒 public static BindUIColumn(& ...
- python---文件读写-IO
IO----文件操作,读操作 1.open('文件名','打开方式',mode[buff]);------------->第一个参数是文件路径,第二个参数是打开方式(如果不写,默认是只读),第三 ...
- 51Nod1773 A国的贸易 多项式 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1773.html 题目传送门 - 51Nod1773 题意 给定一个长度为 $2^n$ 的序列,第 $ ...
- NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
原文链接https://www.cnblogs.com/zhouzhendong/p/9275606.html 题目传送门 - 洛谷P1600 题目传送门 - LOJ#2359 题目传送门 - Vij ...
- 查看name的状态,是属于active还是standby
sudo -E -u hadoop /home/hadoop/bin/hdfs haadmin -getServiceState nn1 sudo -E -u hadoop /home/hadoop/ ...
- IntelliJ IDEA安装bower
安装nodejs(x64) https://nodejs.org/en/ 设置环境变量 变量名 NODE_PATH 变量值 C:\Program Files\nodejs\node_modules p ...
- POJ2387 Til the Cows Come Home 【Dijkstra】
题目链接:http://poj.org/problem?id=2387 题目大意; 题意:给出两个整数T,N,然后输入一些点直接的距离,求N和1之间的最短距离.. 思路:dijkstra求单源最短路, ...
- Oracle内置存储过程之DBMS_OUTPUT
1.DBMS_OUTPUT 1.1 作用: 调试PL/SQL程序 1.2 相关函数: 命令 作用 备注 enable 在serveroutput on的情况下,用来使dbms_output生效(默认即 ...
- linux 学习笔记 tail 命令
#tail -f -n 100 catalina.out 含义:从文件尾部监视catalina.out文件 主要看尾部100行 #tail -f -n 100 catalina.out > n ...