XML注入漏洞修复参考
1. 漏洞背景
可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。发现目前一些普遍使用xml的场景中都存在一种古老的XML实体注入漏洞,这可能导致较为严重的安全问题,使得攻击者可能可以任意访问服务器以及应用所在网络的任何资源。
XML注入主要分为内容注入和实体注入。内容注入分为XML数据注入、样式表注入、XPATH/XQuery注入。实体注入分为实体循环DDOS、XML炸弹DDOS、外部实体注入。
恶意攻击者可以利用漏洞攻击做到:
-
使用超长标签像 ,多达1024个A,或者使用超多的属性像<AA a= ‘a’b=‘b’…> ,由于XML文件本身标签所占用的资源通常比内容多,在数据和属性比较多时,XML文件将变得非常庞大,给XML文件的传输和解析带来困难;
-
递归负载攻击,注入深层次的循环嵌套的XML数据,造成服务器上XML分析器崩溃,造成系统计算资源耗尽而被Dos ;
-
外部实体攻击,利用<!Entityname SYSTEM “URI”>。XML文件的解析依赖libxml库,而libxml2.9以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部普通实体和外部参数实体)做合适的处理,并且实体的URL支持file://和ftp://等协议,攻击者可以在XML文件中声明URI指向服务器本地的实体造成攻击。实体攻击可导致信息泄露、任意文件读取、DOS攻击和代码执行等问题。
2.修复思路
-
严格检查用户输入的字符;
-
检查使用的底层XML解析库,使用JAVA语言提供的禁用外部实体的方法:
DocumentBuilderFactory dbf
=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);
- 操作XML时对格式字符进行转义处理,常见的格式字符如下表:
<; <
> >
& &
' ‘
" “
3.代码修复
在代码中,对关键字符串进行转义:
& --> &
< --> <
> --> >
" --> "
' --> '
在XML保存和展示之前,对数据部分,单独做转义即可:
String userdata = "<USER role="+
GUESTROLE+
"><name>"+
StringUtil.xmlencode(request.getParameter("name"))+
"</name><email>"+
StringUtil.xmlencode(rrequest.getParameter("email"))+
"</email></USER>";