Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5.00 及以前的版本存在相同密码用户可互相访问的漏洞 #254

Open
1 of 2 tasks
BANKA2017 opened this issue Nov 11, 2023 · 2 comments · Fixed by #252
Open
1 of 2 tasks

5.00 及以前的版本存在相同密码用户可互相访问的漏洞 #254

BANKA2017 opened this issue Nov 11, 2023 · 2 comments · Fixed by #252
Assignees
Labels

Comments

@BANKA2017
Copy link
Collaborator

  • 我已升级贴吧云签到到最新版本,并且运行了升级脚本
  • 我已搜索过 Issue 区,没有找到相关问题

问题描述

云签使用 uidpwd 作为 cookie 的两部分用来鉴权,由于计算 pwd 时没有加盐,所以相同密码的用户的 pwd 是一致的,这就导致相同密码的用户只需要简单修改 cookieuid 部分即可开始尝试爆破。只要密码相同,不论是什么用户类型都可以互相访问

if (isset($_POST['ispersis']) && $_POST['ispersis'] == 1) {
$cktime = (int) option::get('cktime');
if (empty($cktime)) {
option::set('cktime', '999999');
$cktime = 999999;
}
setcookie("uid", $p['id'], time() + $cktime);
setcookie("pwd", substr(sha1(EncodePwd(EncodePwd($pw))), 4, 32), time() + $cktime);
ReDirect('index.php');
} else {
setcookie("uid", $p['id']);
setcookie("pwd", substr(sha1(EncodePwd(EncodePwd($pw))), 4, 32));
ReDirect('index.php');
}

复现步骤

  • 随便新建一个实例,管理员账号密码就都设为 a 好了,此时我们可以看到
    • 数据表 tc_users 中相应用户的 pw 的值为 54f74fbfb94518a527a36474dc904c25uid 值为 1
    • 登录后浏览器的 cookiepwd94f3e461f1f245f377893d39955685a3
  • 这时注册一个帐号 b,密码还是设为 a,这时除了 cookieuid2 以外其他部分是一样的
  • 这时只需要将这个 uid 的值改为 1 即可登录管理员的 a 帐号

环境

  • 云签到版本:<= 5.00
  • 服务器系统和版本:不限
  • 云签到是否在 Docker 中运行:不限
  • PHP 版本:不限
  • MySQL 版本:不限
@BANKA2017 BANKA2017 linked a pull request Nov 11, 2023 that will close this issue
@BANKA2017 BANKA2017 self-assigned this Nov 11, 2023
@BANKA2017
Copy link
Collaborator Author

BANKA2017 commented Nov 11, 2023

这严重吗?

云签作为古老的软件,现在还有多少活跃用户我不清楚。爆破不需要知道邮箱或账号名这两个登录凭据中的任意一个,而是使用自增的 uid,并且通过一般 log 都不会记录的 cookie 进行,所以我不清楚是否严重,也许有心人已经干了很久了——反正也没有记录

有的云签站可能开了登录注册页验证码,但这个漏洞本就无需经过登录所以也可以绕过

一旦爆破成功,即可拿到目标账号名下所有的明文 bdussstoken
如果攻击目标是管理员:

  • 还可以云签的导出数据库功能获取所有用户的明文bduss/stoken/邮箱及密码hash等信息
  • 以及通过上传插件的方式上传 webshell 进而拿下服务器(根据实际环境php.ini配置也可能不行)

该怎么办?

  • 最新版本 5.01 已经修复了这个漏洞,直接更新并:
    • 务必将 PHP 版本升级到 5.5.0 或以上以支持 password_hash()
    • 安装修改密码插件并引导用户进行一次密码修改,否则是治标不治本
  • 如果有各种原因无法更新到最新版本,请自行在 /lib/globals.php 找到四个 substr(sha1(EncodePwd($p['pw'])), 4, 32)(此处 $p 可能会是 $con_p)并自行加盐(比如加上 $p['id'])使不同帐号之间的 hash 不一样(没上面“安全”,但肯定比什么都不做好点)

一些回应

攻破本软件的用户几乎不会有任何收益,没有任何使用复杂散列算法的必要,能防止撞彩虹表就已经可以了

总之,社区是无法强制要求所有站点都更新的,并且可能永远都不会有人去利用这个费时费力的低收益漏洞

@n0099 n0099 pinned this issue Nov 11, 2023
@n0099
Copy link
Collaborator

n0099 commented Nov 11, 2023

@enferas Please assign a CVE for this like #156

@BANKA2017 BANKA2017 unpinned this issue Dec 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants