seacms9.92从变量覆盖到getshell(已修复)
字数 1178 2025-08-27 12:33:49

SeaCMS 9.92 全局变量覆盖漏洞分析与利用

漏洞概述

SeaCMS 9.92版本存在一个全局变量覆盖漏洞,攻击者可以利用该漏洞实现从越权访问到远程代码执行(RCE)的攻击链。该漏洞的核心问题在于变量注册与过滤的逻辑顺序不当,导致可以覆盖敏感全局变量,特别是$_SESSION变量。

漏洞原理分析

1. 变量注册机制

SeaCMS中多数程序在开头都会包含include/common.php文件,该文件主要功能:

  1. $_GET$_POST$_COOKIE注册成全局变量(通过include/filter.inc.php实现)
  2. 检查是否存在非法变量名

关键问题

  • 逻辑顺序错误:应该先检查变量名合法性,再注册变量
  • 过滤不完整:漏过滤了_SESSION_FILES等超全局变量

2. 身份验证机制

后台管理员身份验证主要依赖两个session变量:

  1. $_SESSION['sea_admin_id'] - 管理员ID
  2. $_SESSION['hashstr'] - 由数据库名、账号、密码拼接的MD5值

攻击者需要同时覆盖这两个变量才能实现越权访问,其中$_SESSION['hashstr']由于包含敏感信息难以猜测。

漏洞利用步骤

第一步:获取普通用户session

  1. 注册或登录一个普通用户账号
  2. 普通用户登录时会设置$_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 - 执行登录操作
  • useridpwd - 普通用户凭据
  • validate - 验证码
  • _SESSION[sea_admin_id]=1 - 覆盖为管理员ID
  • _SESSION[sea_ckstr]=xwtz - 必须设置为小写验证码

第三步:访问后台获取RCE

成功覆盖session后,直接访问后台地址即可实现越权登录。在后台中可以找到RCE点实现代码执行。

漏洞修复建议

  1. 调整变量处理逻辑顺序:先检查变量名合法性,再注册变量
  2. 完善过滤机制:增加对_SESSION_FILES等超全局变量的过滤
  3. 加强session管理:对关键session变量增加额外的验证机制

漏洞关联性

该漏洞与DedeCMS、DuomiCMS等CMS的历史漏洞有相似之处,可能是代码复用或借鉴导致的相似安全问题。

注意事项

  1. 该漏洞利用需要知道网站后台路径(SeaCMS后台路径是随机命名的)
  2. 最新版本虽然过滤了$_SESSION_FILES,但由于校验逻辑顺序问题,仍可能存在类似漏洞
  3. 攻击者需要能够获取或预测$_SESSION['sea_ckstr']的值(小写验证码)
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变量: 关键参数说明 : 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'] 的值(小写验证码)