当前位置:   article > 正文

(XML外部实体注入)XXE_e-cology xml禁用 xml 解析器中的外部实体处理

e-cology xml禁用 xml 解析器中的外部实体处理

测试怎么测
一、前提条件:(1)有入口用户可上传XML (2)后台解析了XML & 允许DTD或外部实体扩展

二、测试发现漏洞点
https://xz.aliyun.com/t/3357

1、实体循环DDOS
a)、发送以下XML代码到服务器,如:

<!ENTITY % xx '&#x25;zz;'>
<!ENTITY % zz '&#x25;xx;'>
%xx;
  • 1
  • 2
  • 3

b)、当执行到最后一行,%xx会变成%zz,然后%zz又会变成%xx,实体转换变成一个死循环。
c)、查看XML解析器在解析时是否被拒绝服务攻击,即Web系统是否被DDOS。

2、XML炸弹DDOS
a)、发送以下XML代码到服务器,如:

 <?xml version=""1.0"" encoding=""utf-8""?>
<!DOCTYPE something [
<!ENTITY x0 ""Developers!"">  
<!ENTITY x1 ""&x0;&x0;"">
<!ENTITY x2 ""&x1;&x1;"">
<!ENTITY x3 ""&x2;&x2;"">
<!ENTITY x4 ""&x3;&x3;"">
...
<!ENTITY x100 ""&x99;&x99;"">]>
<something>&x100;</something>  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

b)、当执行到最后一行,最终字符串变成了一个超大字符串。
c)、查看XML解析器在解析时是否被拒绝服务攻击,即Web系统是否被DDOS。

3、外部实体注入
a)、实体能够引用文件的内容,也可以通过指定外部URL,如发送以下代码:(windows服务器)

<?xml version=""1.0"" encoding=""UTF-8""?>
<!DOCTYPE myTest [  
<!ELEMENT secTest ANY>
<!ENTITY xxe SYSTEM ""c:/boot.ini"">]>
<secTest>&xxe;</secTest>
  • 1
  • 2
  • 3
  • 4
  • 5

b)、查看是否显示服务器C盘下的boot.ini配置内容。

三、渗透
1)分析XML参数的意义,设计构造输入内容(如保存用户的格式为<USER role="“guest”">test时,通过修改用户名test为User1User2的方式增加用户)分析对功能的影响
2)使用特别长的标签 像使用1024个及超过1024个A的标签
3)使用特别多的属性 像<AA a=‘a’b=‘b’>的n个
4)递归负载攻击,注入深层次的循环嵌套的xml数据,造成服务器上XML分析器崩溃,造成Dos
5)外部实体攻击。使用<!Entityname SYSTEM “URI”>

开发怎么改
一、XXE(XML External Entity漏洞),是一种针对XML终端实施的攻击,黑客想要实施这种攻击,需要在XML的payload包含外部实体声明,且服务器本身允许实体扩展。这样的话,黑客或许能读取WEB服务器的文件系统,通过UNC路径访问远程文件系统,或者通过HTTP/HTTPS连接到任意主机。借助XXE,攻击者可以实现任意文件读取,DOS拒绝服务攻击以及代理扫描内网等。

二、危险方法
解析xml格式的数据的函数:将XML数据反序列化到新创建的Java内容树中的过程
以下方法均不禁用DTD

SAXReader
SAXBuilder
unmarshaller
DocumentBuilderFactory(DocumentBuilder)
SAXParserFactory (SAXParser)
SAXParserFactory(XMLReader)
XMLReader
XMLInputFactory
TransformerFactory
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三、安全的写法
需要禁用DTD,或者禁止外部实体解析和参数实体解析。

场景1:SAXReader。默认情况下,SAXReader不禁用DTD,需要通过调用setFeature方法设置相应的属性完全禁止或部分禁止DTD来防御XXE注入。
错误示例:

SAXReader reader = new SAXReader();
Document doc = reader.read(new File(fileName));
System.out.println(doc);
  • 1
  • 2
  • 3

正确示例(不允许DTD,优选):

SAXReader reader = new SAXReader();
//禁用DTDs (doctypes),不允许使用 DOCTYPE。
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

//如果不能禁用DTDs,可以使用下两项,必须两项同时存在

reader.setFeature("http://xml.org/sax/features/external-general-entities", false);                 
//防止外部实体POC 
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);                
//防止参数实体POC

Document doc = reader.read(new File(fileName));
System.out.println(doc); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/682115
推荐阅读
相关标签
  

闽ICP备14008679号