漏洞介绍

CVE-2019-6341 是一个影响 Drupal 内容管理框架的跨站脚本(XSS)漏洞。该漏洞允许攻击者通过文件模块或子系统上传恶意文件,从而在用户访问特定链接时触发 XSS 攻击

漏洞范围

  • Drupal 7 版本低于 7.65
  • Drupal 8.6 版本低于 8.6.13
  • Drupal 8.5 版本低于 8.5.14

漏洞靶场

使用vulhub的靶场:

vulhub-master/drupal/CVE-2019-6341

使用环境为drupal 8.5.0

启动靶场环境:

1
docker-compose up -d

服务启动后,访问http://your-ip:8080即可查看到Drupal的安装页面。因为没有mysql环境,所以安装的时候可以选择sqlite数据库。其他配置均默认即可。

image-20250328185850626

image-20250328190010345

安装完成

漏洞原理

在Drupal的机制中,设定了这样一条规则。

用户上传的图片文件名将会被保留,如果出现文件名相同的情况,那么文件名后面就会被跟上_0,_1依次递增。

在Drupal中为了兼容各种编码,在处理上传文件名时,Drupal会对文件名对相应的处理,如果出现值小于0x20的字符,那么就会将其转化为_

drupal-8.5.0/core/includes/file.inc#L776

但如果文件名中,如果出现了\x80\xff的字符时,PHP就会抛出PREG_BAD_UTF8_ERROR,如果发生错误,那么preg_replace就会返回NULL,$basename就会被置为NULL。

当basename为空时,后面的文件内容会被写入到形似_0的文件内

drupal-8.5.0/core/includes/file.inc#L806

在这个基础下,原本会被上传到

1
/sites/default/files/pictures/<YYYY-MM>/

则会被写入

1
/sites/default/files/pictures/<YYYY-MM>/_0

当服务端开启了评论头像上传,或者是拥有作者账号时

攻击者可以通过上传一张恶意构造的gif图,然后再上传一张带有恶意字符的同一张图,那么就会将恶意图片的内容写入到相应目录的_0

但如果我们直接访问这个文件时,该文件可能不会解析,这是因为

  1. 浏览器首先会根据服务端给出的content-type解析页面,而服务端一般不会给空后缀的文件设置content-type,或者设置为application/octet-stream
  2. 其次浏览器会根据文件内容做简单的判断,如果文件的开头为<html>,则部分浏览器会将其解析为html
  3. 部分浏览器还可能会设置默认的content-type,但大部分浏览器会选择不解析该文件。

这时候我们就需要一个很特殊的小trick了,a标签可以设置打开文件的type(only not for chrome)

当你访问该页面时,页面会被解析为html并执行相应的代码。

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
</head>
<body>
<a id='a' href="http://127.0.0.1/drupal-8.6.2/sites/default/files/2019-04/_6" type="text/html">321321</a>

<script type="text/javascript">
var a = document.getElementById('a')
a.click()
</script>
</body>
</html>

当被攻击者访问该页面时,我们就可以执行任意的xss

漏洞复现

该漏洞利用了Drupal文件模块中的一个缺陷,允许上传特制的文件。该文件表面上是一个图片,但实际包含了嵌入JavaScript的HTML代码。当其他用户访问该文件的链接时,XSS代码将被执行。

Drupal默认将上传的图片存储在/sites/default/files/pictures/<YYYY-MM>/目录下,并保留其原始文件名。

要利用此漏洞,使用来自thezdi/PoC的PoC脚本创建并上传恶意GIF文件。执行以下命令,其中第一个参数是目标IP,第二个参数是目标端口:

1
php cve-2019-6341-exp.php 192.168.159.132 8080

image-20250330164043760

上传成功后,访问图片位置即可触发XSS漏洞:

image-20250330164123055

参考

https://paper.seebug.org/897/

https://github.com/vulhub/vulhub/blob/master/drupal/CVE-2019-6341/README.zh-cn.md

https://www.zerodayinitiative.com/blog/2019/4/11/a-series-of-unfortunate-images-drupal-1-click-to-rce-exploit-chain-detailed