(XML外部实体注入)XXE

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

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

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

<!ENTITY % xx '&#x25;zz;'>
<!ENTITY % zz '&#x25;xx;'>
%xx;

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>  

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>

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

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

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

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

正确示例(不允许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); 
发布了20 篇原创文章 · 获赞 0 · 访问量 184

猜你喜欢

转载自blog.csdn.net/weixin_42299862/article/details/104719183