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>";