CSZ CMS 1.2.7 xss分析与复现
字数 1432 2025-08-25 22:58:40

CSZ CMS 1.2.7 XSS漏洞分析与复现教学文档

1. 漏洞概述

CSZ CMS 1.2.7版本存在一个存储型XSS漏洞,允许未授权用户通过篡改User-Agent头向管理员面板注入恶意JavaScript代码。当管理员查看后台时,注入的代码将被执行。

2. 影响版本

  • CSZ CMS 1.2.7

3. 环境搭建

  1. 下载CSZ CMS 1.2.7安装包:
    https://sourceforge.net/projects/cszcms/files/install/CSZCMS-V1.2.7.zip/download
    
  2. 按照官方文档完成安装
  3. 确保系统配置为:
    • PHP环境
    • MySQL或MariaDB数据库

4. 漏洞复现步骤

4.1 准备工作

  1. 注册一个普通用户账号
  2. 登录该用户账号

4.2 漏洞利用

  1. 访问"inbox"页面发送私信
  2. 选择管理员用户作为接收者
  3. 使用浏览器开发者工具或Burp Suite等代理工具修改HTTP请求
  4. 将User-Agent头修改为恶意payload:
    User-Agent: <script>alert(1)</script>
    
  5. 发送私信

4.3 触发漏洞

  1. 管理员登录后台
  2. 无需其他操作,XSS payload将自动执行

5. 漏洞分析

5.1 数据流分析

  1. 用户发送私信时,系统记录User-Agent头
  2. 数据存储流程:
    • 请求进入Member.php控制器的insertpm方法
    • 调用Csz_auth_modelsend_pm方法
    • 最终调用Csz_modelsendEmail方法

5.2 关键漏洞点

  1. sendEmail方法中的数据库操作:

    $this->db->set('user_agent', $this->input->user_agent(), TRUE);
    $this->db->insert('email_logs', $data);
    
  2. user_agent()方法未进行XSS过滤:

    public function user_agent($xss_clean = NULL) {
        return $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean);
    }
    
    • $xss_clean参数默认为NULL,未启用过滤
  3. 后台直接输出未过滤的User-Agent:

    • 位于cszcms/views/admin/home.php
    • 直接echo数据库中的User-Agent值

5.3 安全机制缺失

  1. 输入未过滤:
    • User-Agent头直接存入数据库
  2. 输出未编码:
    • 后台直接输出数据库内容,未进行HTML编码

6. 漏洞修复方案

6.1 官方修复

在1.2.8版本中,开发者移除了直接输出User-Agent的代码(cszcms/views/admin/home.php

6.2 推荐修复方案

  1. 输入过滤:

    $this->db->set('user_agent', $this->input->user_agent(TRUE), TRUE);
    
    • 启用xss_clean参数
  2. 输出编码:

    echo htmlspecialchars($user_agent, ENT_QUOTES, 'UTF-8');
    
  3. 深度防御:

    • 对所有用户可控输入进行验证和过滤
    • 对所有输出到HTML的内容进行编码

7. 技术要点总结

  1. CodeIgniter框架的输入处理机制:

    • $this->input->user_agent()默认不进行XSS过滤
    • 需要显式设置$xss_clean参数为TRUE
  2. 数据库操作:

    • $this->db->set()方法用于准备SQL语句
    • $this->db->insert()执行最终插入操作
  3. 邮件日志功能:

    • 系统记录所有发送邮件的日志
    • 包括User-Agent和IP地址等敏感信息

8. 扩展思考

  1. 其他可能存在类似问题的点:

    • 所有使用$this->input->user_agent()的地方
    • 其他HTTP头信息的处理(如Referer)
    • 用户可控的其他输入字段
  2. 自动化检测方法:

    • 扫描所有直接输出数据库内容的视图文件
    • 检查所有使用$this->input->*方法而未过滤的代码
  3. 安全开发建议:

    • 遵循"输入验证、输出编码"原则
    • 使用框架提供的安全函数
    • 实施内容安全策略(CSP)作为额外防护

9. 参考资源

  1. CodeIgniter输入类文档
  2. OWASP XSS防护指南
  3. CSZ CMS官方文档:https://docs.cszcms.com/
CSZ CMS 1.2.7 XSS漏洞分析与复现教学文档 1. 漏洞概述 CSZ CMS 1.2.7版本存在一个存储型XSS漏洞,允许未授权用户通过篡改User-Agent头向管理员面板注入恶意JavaScript代码。当管理员查看后台时,注入的代码将被执行。 2. 影响版本 CSZ CMS 1.2.7 3. 环境搭建 下载CSZ CMS 1.2.7安装包: 按照官方文档完成安装 确保系统配置为: PHP环境 MySQL或MariaDB数据库 4. 漏洞复现步骤 4.1 准备工作 注册一个普通用户账号 登录该用户账号 4.2 漏洞利用 访问"inbox"页面发送私信 选择管理员用户作为接收者 使用浏览器开发者工具或Burp Suite等代理工具修改HTTP请求 将User-Agent头修改为恶意payload: 发送私信 4.3 触发漏洞 管理员登录后台 无需其他操作,XSS payload将自动执行 5. 漏洞分析 5.1 数据流分析 用户发送私信时,系统记录User-Agent头 数据存储流程: 请求进入 Member.php 控制器的 insertpm 方法 调用 Csz_auth_model 的 send_pm 方法 最终调用 Csz_model 的 sendEmail 方法 5.2 关键漏洞点 sendEmail 方法中的数据库操作: user_agent() 方法未进行XSS过滤: $xss_clean 参数默认为NULL,未启用过滤 后台直接输出未过滤的User-Agent: 位于 cszcms/views/admin/home.php 直接echo数据库中的User-Agent值 5.3 安全机制缺失 输入未过滤: User-Agent头直接存入数据库 输出未编码: 后台直接输出数据库内容,未进行HTML编码 6. 漏洞修复方案 6.1 官方修复 在1.2.8版本中,开发者移除了直接输出User-Agent的代码( cszcms/views/admin/home.php ) 6.2 推荐修复方案 输入过滤: 启用 xss_clean 参数 输出编码: 深度防御: 对所有用户可控输入进行验证和过滤 对所有输出到HTML的内容进行编码 7. 技术要点总结 CodeIgniter框架的输入处理机制: $this->input->user_agent() 默认不进行XSS过滤 需要显式设置 $xss_clean 参数为TRUE 数据库操作: $this->db->set() 方法用于准备SQL语句 $this->db->insert() 执行最终插入操作 邮件日志功能: 系统记录所有发送邮件的日志 包括User-Agent和IP地址等敏感信息 8. 扩展思考 其他可能存在类似问题的点: 所有使用 $this->input->user_agent() 的地方 其他HTTP头信息的处理(如Referer) 用户可控的其他输入字段 自动化检测方法: 扫描所有直接输出数据库内容的视图文件 检查所有使用 $this->input->* 方法而未过滤的代码 安全开发建议: 遵循"输入验证、输出编码"原则 使用框架提供的安全函数 实施内容安全策略(CSP)作为额外防护 9. 参考资源 CodeIgniter输入类文档 OWASP XSS防护指南 CSZ CMS官方文档:https://docs.cszcms.com/