我們對我們的代碼進行了安全審計,他們提到我們的代碼易受外部實體(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攻擊。任何人幫助表示讚賞!