xrCMS代码审计:存储型XSS
字数 1027 2025-08-26 22:11:45

xrCMS存储型XSS漏洞分析与利用

漏洞概述

xrCMS(迅睿CMS)存在存储型XSS漏洞,攻击者可以通过注册功能注入恶意JavaScript代码,当管理员查看用户列表时触发XSS攻击。该漏洞存在于用户注册处理逻辑中,对用户输入过滤不严格导致。

环境搭建

  1. 安装迅睿CMS(PHP7环境)
  2. 后台路径:/admin.php
  3. 默认账号密码:admin/admin
  4. 确保后台开启注册功能

漏洞复现步骤

注册处XSS

  1. 访问注册页面
  2. 构造以下注册数据:
    • 用户名:" onclick="alert(1)"
    • 密码:任意密码(如test
  3. 提交注册
  4. 管理员登录后台查看用户列表
  5. 点击该用户时触发XSS弹窗

登录记录XSS(辅助漏洞)

  1. 注册一个普通用户(如test
  2. 登录时修改User-Agent头为XSS payload:
    "><script>alert(1)</script>
    
  3. 在"账号管理->登陆记录"中查看记录时会触发XSS

代码审计分析

漏洞位置

主要漏洞位于用户注册处理逻辑中,关键文件为会员注册相关控制器。

关键代码分析

  1. 输入处理

    $post = \Phpcmf\Service::L('input')->post('data', true);
    

    通过post方法获取输入数据,第二个参数true表示启用XSS过滤。

  2. XSS过滤函数

    public function xss_clean($str, $is_image = FALSE) {
        // 过滤逻辑...
    }
    

    该函数存在以下问题:

    • 仅过滤了特定格式的XSS(如alert后跟反引号的情况)
    • onclick等事件处理器的过滤不足
    • 空白字符过滤后可能重组恶意代码
  3. 注册处理

    $rt = \Phpcmf\Service::M('member')->register($groupid, [
        'username' => (string)$post['username'],
        // 其他字段...
    ], $data[1]);
    

    直接将过滤后的用户名插入数据库,没有额外的安全处理。

过滤缺陷分析

  1. 对以下形式的XSS过滤不足:

    " onclick="alert(1)"
    
  2. 主要过滤了:

    • PHP标签
    • JavaScript标签
    • 特定关键词(如alert后跟反引号的情况)
    • URL编码
    • 不可见字符
  3. 但允许HTML属性中的JavaScript代码执行

漏洞利用场景

  1. 攻击者注册恶意用户
  2. 管理员查看用户列表时触发XSS
  3. 可窃取管理员cookie或执行其他恶意操作

修复建议

  1. 对用户名进行更严格的过滤:

    • 禁止特殊字符
    • 使用白名单策略
  2. 输出时进行HTML实体编码:

    htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
    
  3. 完善XSS过滤函数:

    • 增加对HTML事件属性的过滤
    • 加强关键词检测
  4. 使用CSP(Content Security Policy)策略限制脚本执行

总结

该漏洞展示了即使有XSS过滤函数,如果实现不完善仍然可能导致安全问题。开发时应:

  1. 采用输入验证和输出编码双重防护
  2. 对用户提供的数据保持高度警惕
  3. 定期进行安全审计和测试

通过此案例可以学习到存储型XSS的挖掘方法和防御思路,对CMS安全审计有重要参考价值。

xrCMS存储型XSS漏洞分析与利用 漏洞概述 xrCMS(迅睿CMS)存在存储型XSS漏洞,攻击者可以通过注册功能注入恶意JavaScript代码,当管理员查看用户列表时触发XSS攻击。该漏洞存在于用户注册处理逻辑中,对用户输入过滤不严格导致。 环境搭建 安装迅睿CMS(PHP7环境) 后台路径: /admin.php 默认账号密码: admin/admin 确保后台开启注册功能 漏洞复现步骤 注册处XSS 访问注册页面 构造以下注册数据: 用户名: " onclick="alert(1)" 密码:任意密码(如 test ) 提交注册 管理员登录后台查看用户列表 点击该用户时触发XSS弹窗 登录记录XSS(辅助漏洞) 注册一个普通用户(如 test ) 登录时修改User-Agent头为XSS payload: 在"账号管理->登陆记录"中查看记录时会触发XSS 代码审计分析 漏洞位置 主要漏洞位于用户注册处理逻辑中,关键文件为会员注册相关控制器。 关键代码分析 输入处理 : 通过 post 方法获取输入数据,第二个参数 true 表示启用XSS过滤。 XSS过滤函数 : 该函数存在以下问题: 仅过滤了特定格式的XSS(如 alert 后跟反引号的情况) 对 onclick 等事件处理器的过滤不足 空白字符过滤后可能重组恶意代码 注册处理 : 直接将过滤后的用户名插入数据库,没有额外的安全处理。 过滤缺陷分析 对以下形式的XSS过滤不足: 主要过滤了: PHP标签 JavaScript标签 特定关键词(如 alert 后跟反引号的情况) URL编码 不可见字符 但允许HTML属性中的JavaScript代码执行 漏洞利用场景 攻击者注册恶意用户 管理员查看用户列表时触发XSS 可窃取管理员cookie或执行其他恶意操作 修复建议 对用户名进行更严格的过滤: 禁止特殊字符 使用白名单策略 输出时进行HTML实体编码: 完善XSS过滤函数: 增加对HTML事件属性的过滤 加强关键词检测 使用CSP(Content Security Policy)策略限制脚本执行 总结 该漏洞展示了即使有XSS过滤函数,如果实现不完善仍然可能导致安全问题。开发时应: 采用输入验证和输出编码双重防护 对用户提供的数据保持高度警惕 定期进行安全审计和测试 通过此案例可以学习到存储型XSS的挖掘方法和防御思路,对CMS安全审计有重要参考价值。