2016-11-21 18 views
0

我們對我們的代碼進行了安全審計,他們提到我們的代碼易受外部實體(XXE)攻擊。配置的XML解析器不會阻止也不會限制外部實體的解析。這可能會將解析器暴露給XML外部實體攻擊

說明 - XML外部實體攻擊受益於XML特性,以在處理時動態構建文檔。 XML實體允許從給定資源動態地包含數據。外部實體允許XML文檔包含來自外部URI的數據。除非進行了其他配置,否則外部實體會強制XML解析器訪問URI指定的資源,例如本地計算機或遠程系統上的文件。此行爲將應用程序公開給XML外部實體(XXE)攻擊,該攻擊可用於執行本地系統的拒絕服務,未經授權訪問本地計算機上的文件,掃描遠程計算機以及執行遠程系統的拒絕服務。以下XML文檔顯示了XXE攻擊的示例。

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foo [ 
<!ELEMENT foo ANY > 
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo> 

此示例可能崩潰的服務器(在UNIX系統上),如果XML解析器嘗試與的/ dev /隨機文件的內容來替代實體。

建議 - 應該對XML解組器進行安全配置,以便它不允許外部實體作爲傳入XML文檔的一部分。爲避免XXE注入,請不要使用直接將java.io.File,java.io.Reader或java.io.InputStream處理XML源的解組方法。與安全配置的解析器解析文檔並使用接受的安全

解析器作爲XML源作爲顯示在下面的例子的解組方法:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setExpandEntityReferences(false); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document document = db.parse(<XML Source>); 
Model model = (Model) u.unmarshal(document); 

而編寫的代碼是下面其中發現XXE攻擊 -

1- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
2- DocumentBuilder db = dbf.newDocumentBuilder(); 
3- InputSource is = new InputSource(); 
4- is.setCharacterStream(new StringReader(xml)); 
5- 
6- Document doc = db.parse(is); 
7- NodeList nodes = doc.getElementsByTagName(elementsByTagName); 
8- 
9- return nodes; 

我正在線路上無6 請幫助我如何能解決上述問題XXE攻擊。任何人幫助表示讚賞!

回答

0

爲整治的詳細說明和選項,我建議你看一下OWASP XEE Cheat Sheet

我們也有類似的問題,提出並通過禁用DOCTYPES(以上鍊接的第一個建議),因爲我們並不需要他們解決它:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);