Xiuno BBS 审计之问题10:用户密码不符合现代密码存储规范

问题:用户密码使用 md5(password+salt) 单重哈希存储,未使用 bcrypt/PBKDF2/Argon2

此文章为XIUNOX版本重构审计时发现问题,分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。

现象

Xiuno BBS 4.0.4 在用户注册、登录、改密、后台建号等多个入口均使用 md5($password.$salt) 形式存储密码摘要。md5 算法本身运算速度极快(现代 GPU 可达每秒数百亿次),且为单重哈希(无迭代、无内存硬化),完全不符合现代密码存储规范。一旦数据库泄露,攻击者可在数小时内使用字典+彩虹表+GPU 暴力破解绝大多数弱口令密码。同时后台安装脚本对管理员密码使用 md5(md5($password).$salt) 双重 md5,仍属不安全范围。

源码证据

文件:xiunobbs_4.0.4/route/user.php 行 154-169(注册时密码写入)

php 复制代码
$salt = xn_rand(16);
$pwd = md5($password.$salt);
$gid = 101;
$_user = array (
    'username' => $username,
    'email' => $email,
    'password' => $pwd,
    'salt' => $salt,
    // ...
);
$uid = user_create($_user);

文件:xiunobbs_4.0.4/route/user.php 行 84(登录校验同样为 md5 比对)

php 复制代码
md5($password.$_user['salt']) != $_user['password'] AND message('password', lang('password_incorrect'));

文件:xiunobbs_4.0.4/route/user.php 行 277(找回密码重置流程)

php 复制代码
$password = md5($password.$salt);
user_update($_uid, array('password'=>$password));

文件:xiunobbs_4.0.4/route/my.php 行 56-58(修改密码)

php 复制代码
md5($password_old.$user['salt']) != $user['password'] AND message('password_old', lang('old_password_incorrect'));
$password_new = md5($password_new.$user['salt']);
$r = user_update($uid, array('password'=>$password_new));

文件:xiunobbs_4.0.4/admin/route/index.php 行 27(后台登录校验)

php 复制代码
if(md5($password.$user['salt']) != $user['password']) {
    xn_log('password error. uid:'.$user['uid'].' - ******'.substr($password, -6), 'admin_login_error');
    message('password', lang('password_incorrect'));
}

文件:xiunobbs_4.0.4/admin/route/user.php 行 88(后台建号,使用 md5(md5()))

php 复制代码
$r = user_create(array(
    'username'=>$username,
    'password'=>md5(md5($password).$salt),
    'salt'=>$salt,
    // ...
));

文件:xiunobbs_4.0.4/install/index.php 行 188(安装时管理员密码)

php 复制代码
$salt = xn_rand(16);
$password = md5(md5($adminpass).$salt);
$update = array('username'=>$adminuser, 'email'=>$adminemail, 'password'=>$password, 'salt'=>$salt, 'create_date'=>$time, 'create_ip'=>$longip);
db_update('user', array('uid'=>1), $update);

风险等级与结论

高危

危害后果:

  • md5 哈希无迭代、无盐值放大、无内存硬化,攻击者拿到库后可用 hashcat 在单 GPU 上以每秒 10^10 量级速度爆破,常见弱口令几分钟内即被还原。
  • 即使前台 md5($password.$salt) 加了 salt,salt 本身与 md5 一同存库,泄露后毫无防御价值。
  • 后台 md5(md5($password).$salt) 双重 md5 只是 2 倍计算量,对 GPU 暴力破解毫无阻碍。
  • 与现代标准 password_hash() (bcrypt/argon2) 相差 6-7 个数量级的安全强度。

修复建议:

  1. 立即切换到 PHP 内置 password_hash($password, PASSWORD_BCRYPT)PASSWORD_ARGON2ID,存储格式自带 salt 与 cost factor。
  2. 校验时使用 password_verify($password, $hash),并在登录成功时调用 password_needs_rehash() 自动平滑升级旧 md5 哈希到 bcrypt。
  3. 设置 bcrypt cost ≥ 12,Argon2id 推荐参数:memory_cost=65536, time_cost=4, threads=2
  4. model/user.func.php 中封装统一的密码哈希/校验函数,禁止业务层直接调用 md5() 处理密码。
相关推荐
IT_陈寒1 小时前
SpringBoot自动配置的坑,我的Bean怎么不生效?
前端·人工智能·后端
CoderYanger1 小时前
视频切割脚本(Python版)
linux·开发语言·windows·后端·python·程序人生·职场和发展
程序员爱钓鱼2 小时前
Rust 数据类型详解:整数、浮点数、布尔、字符、元组和数组
后端·rust
geovindu2 小时前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
AC赳赳老秦2 小时前
Excel 动态仪表盘制作:用 OpenClaw 自动处理数据、生成交互式图表并实时更新仪表盘
大数据·服务器·后端·测试用例·excel·deepseek·openclaw
CoderYanger2 小时前
视频裁剪+缩放+自动添加水印脚本(Python版)
开发语言·后端·python·程序人生·职场和发展·音视频·学习方法
从零开始的代码生活_2 小时前
C++ 模板入门:函数模板、类模板与实例化机制
开发语言·c++·后端
mCell11 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
咖啡八杯12 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式