该仓库包含在 ProjectSend r1270 版本中发现的漏洞(CVE-2020-28874)的描述。
感谢我的同事 Entelgy Innotec Security 推动我进步!
该漏洞存在于重置密码组件中,攻击者可以在没有有效令牌的情况下,通过用户名(如 admin)更改任何已知用户的密码。
这是因为后端没有用从提供的用户名加载的用户数据来清理 $user_data。
if (!empty($_GET['token']) && !empty($_GET['user'])) {
$got_token = $_GET['token'];
$got_user = $_GET['user'];
/**
* 获取用户 ID
*/
$user_data = get_user_by_username($got_user);
....
}
并且使用该变量的状态继续重置密码的过程。
if ($_POST) {
/**
* 清理提交的表单值。
*/
$form_type = encode_html($_POST['form_type']);
switch ($form_type) {
----
case 'new_password':
if (!empty($user_data['id'])) {
$reset_password_new = $_POST['password'];
...
}
...
}
为此,攻击者需要构造一个 POST 请求,在查询字符串中包含一个无效的参数 "token" 和 "user" 参数(目标用户名),同时还需要在请求体中添加 "form_type" 为 "new_password"、"password" 为所需的新密码,以及一个有效的 csrf_token(从登录表单获取,重置密码表单不提供该令牌)。
在该仓库中,你可以找到一个用于利用该漏洞的 Python 脚本和一个用于测试的 Docker 容器。
git clone https://github.com/varandinawer/CVE-2020-28874_CVE-2020-28875.git
cd ./CVE-2020-28874_CVE-2020-28875/docker-r1270
docker-compose up
#完成 ProjectSend 安装过程后,在浏览器中访问 http://localhost,并按照指示设置管理员账户
cd ..
python CVE-2020-28874.py --url http://localhost --user admin --pwd newAdminP4ssword*
升级至版本 r1295 或更高版本。