ssycms代码审计:后台存储型XSS
字数 1165 2025-08-26 22:11:56

SSYCMS后台存储型XSS漏洞分析与利用

漏洞概述

SSYCMS内容管理系统存在多处后台存储型XSS漏洞,攻击者可以通过后台管理功能注入恶意脚本,这些脚本会被持久化存储在数据库中,并在其他用户访问相关页面时执行。

受影响版本

  • 基础版
  • UGC投稿版

系统架构

  • 前台:Bootstrap4.x
  • 后台:vue2.x、iview3.x
  • 框架:Thinkphp5.x
  • 架构:PHP+MYSQL

漏洞位置

1. 内容管理模块

  • 路径:内容->全部内容
  • 可触发字段:
    • 标题字段:直接触发
    • 标签字段:直接触发
    • 描述字段:需要闭合HTML标签
    • 关键词字段:需要闭合HTML标签
    • 内容字段:无法触发(经过htmlspecialchars过滤)

2. 单个页面管理模块

  • 路径:功能->单个页面
  • 可触发字段:
    • 标题字段:直接触发
    • 关键词字段:需要闭合HTML标签
    • 描述字段:需要闭合HTML标签
  • 额外功能:可自定义页面路由

3. 友情链接管理模块

  • 可触发字段:
    • 名称字段:直接触发
    • 网址字段:直接触发
    • 描述字段:直接触发

漏洞复现步骤

  1. 登录后台管理系统
  2. 导航到漏洞位置(内容管理/单个页面/友情链接)
  3. 在可触发字段中输入XSS payload:
    • 直接触发字段:<script>alert(1)</script>
    • 需要闭合字段:"><script>alert(1)</script>
  4. 保存提交
  5. 访问受影响页面查看XSS执行效果

代码审计分析

漏洞根源

  1. 请求处理流程:

    • 路由:/index.php?s=/article/ApiAdminArticle/itemAdd
    • 控制器方法:itemAdd()
    • 数据获取方式:$this->request->post()
  2. 关键问题代码:

public function itemAdd()
{
    $data = $this->request->post();
    // 缺少输入过滤
    $res = model($this->itemModelNameSpace)->itemAdd($data,$fieldList);
    // ...
}
  1. 数据库存储差异:
// 未过滤的字段直接存储
$indexId = db($this->item)->insertGetId(array (
    'title' => $paramData['title'],  // 未过滤
    'description' => $paramData['description'],  // 未过滤
    'keywords' => $paramData['keywords'],  // 未过滤
    // ...
));

// 内容字段经过htmlspecialchars过滤
db($this->itemContent)->insert(array(
    'content' => htmlspecialchars($content),
));

安全对比:UGC投稿功能

UGC投稿版对用户输入进行了严格过滤:

public function itemAdd()
{
    $title = Htmlp::htmlp(input('post.title'));
    $content = Htmlp::htmlp(input('post.content'));
    // 所有字段都经过HTMLPurifier过滤
    // ...
}

HTMLPurifier过滤实现:

class Htmlp
{
    static public function htmlp($dirty_html)
    {
       $config = HTMLPurifier_Config::createDefault();
       $purifier = new HTMLPurifier($config);
       return $purifier->purify($dirty_html);
    }
}

漏洞利用限制

  1. 需要后台管理员权限
  2. 部分字段需要特定闭合方式才能触发
  3. 内容字段无法利用(已过滤)

修复建议

  1. 对所有用户输入进行统一过滤:

    • 使用HTMLPurifier或类似库
    • 至少使用htmlspecialchars()函数
  2. 实施最小权限原则:

    • 即使对管理员也应实施输入过滤
    • 区分不同管理角色的权限
  3. 输出时进行编码:

    • 在显示用户提供的内容时进行HTML实体编码
  4. 实施内容安全策略(CSP):

    • 限制可执行脚本的来源

漏洞危害评估

虽然需要管理员权限,但仍存在风险:

  • 管理员账号被窃取后的攻击面
  • 内部威胁(恶意管理员)
  • 可能与其他漏洞形成攻击链

总结

SSYCMS在后台管理界面存在多处存储型XSS漏洞,主要原因是未对管理员输入进行充分过滤。虽然需要管理员权限才能利用,但仍建议修复以遵循纵深防御原则。修复方案应对所有用户输入实施统一过滤,不区分用户角色。

SSYCMS后台存储型XSS漏洞分析与利用 漏洞概述 SSYCMS内容管理系统存在多处后台存储型XSS漏洞,攻击者可以通过后台管理功能注入恶意脚本,这些脚本会被持久化存储在数据库中,并在其他用户访问相关页面时执行。 受影响版本 基础版 UGC投稿版 系统架构 前台:Bootstrap4.x 后台:vue2.x、iview3.x 框架:Thinkphp5.x 架构:PHP+MYSQL 漏洞位置 1. 内容管理模块 路径:内容->全部内容 可触发字段: 标题字段:直接触发 标签字段:直接触发 描述字段:需要闭合HTML标签 关键词字段:需要闭合HTML标签 内容字段:无法触发(经过htmlspecialchars过滤) 2. 单个页面管理模块 路径:功能->单个页面 可触发字段: 标题字段:直接触发 关键词字段:需要闭合HTML标签 描述字段:需要闭合HTML标签 额外功能:可自定义页面路由 3. 友情链接管理模块 可触发字段: 名称字段:直接触发 网址字段:直接触发 描述字段:直接触发 漏洞复现步骤 登录后台管理系统 导航到漏洞位置(内容管理/单个页面/友情链接) 在可触发字段中输入XSS payload: 直接触发字段: <script>alert(1)</script> 需要闭合字段: "><script>alert(1)</script> 保存提交 访问受影响页面查看XSS执行效果 代码审计分析 漏洞根源 请求处理流程: 路由: /index.php?s=/article/ApiAdminArticle/itemAdd 控制器方法: itemAdd() 数据获取方式: $this->request->post() 关键问题代码: 数据库存储差异: 安全对比:UGC投稿功能 UGC投稿版对用户输入进行了严格过滤: HTMLPurifier过滤实现: 漏洞利用限制 需要后台管理员权限 部分字段需要特定闭合方式才能触发 内容字段无法利用(已过滤) 修复建议 对所有用户输入进行统一过滤: 使用HTMLPurifier或类似库 至少使用htmlspecialchars()函数 实施最小权限原则: 即使对管理员也应实施输入过滤 区分不同管理角色的权限 输出时进行编码: 在显示用户提供的内容时进行HTML实体编码 实施内容安全策略(CSP): 限制可执行脚本的来源 漏洞危害评估 虽然需要管理员权限,但仍存在风险: 管理员账号被窃取后的攻击面 内部威胁(恶意管理员) 可能与其他漏洞形成攻击链 总结 SSYCMS在后台管理界面存在多处存储型XSS漏洞,主要原因是未对管理员输入进行充分过滤。虽然需要管理员权限才能利用,但仍建议修复以遵循纵深防御原则。修复方案应对所有用户输入实施统一过滤,不区分用户角色。