xrCMS代码审计:存储型XSS
字数 1027 2025-08-26 22:11:45
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:
"><script>alert(1)</script> - 在"账号管理->登陆记录"中查看记录时会触发XSS
代码审计分析
漏洞位置
主要漏洞位于用户注册处理逻辑中,关键文件为会员注册相关控制器。
关键代码分析
-
输入处理:
$post = \Phpcmf\Service::L('input')->post('data', true);通过
post方法获取输入数据,第二个参数true表示启用XSS过滤。 -
XSS过滤函数:
public function xss_clean($str, $is_image = FALSE) { // 过滤逻辑... }该函数存在以下问题:
- 仅过滤了特定格式的XSS(如
alert后跟反引号的情况) - 对
onclick等事件处理器的过滤不足 - 空白字符过滤后可能重组恶意代码
- 仅过滤了特定格式的XSS(如
-
注册处理:
$rt = \Phpcmf\Service::M('member')->register($groupid, [ 'username' => (string)$post['username'], // 其他字段... ], $data[1]);直接将过滤后的用户名插入数据库,没有额外的安全处理。
过滤缺陷分析
-
对以下形式的XSS过滤不足:
" onclick="alert(1)" -
主要过滤了:
- PHP标签
- JavaScript标签
- 特定关键词(如
alert后跟反引号的情况) - URL编码
- 不可见字符
-
但允许HTML属性中的JavaScript代码执行
漏洞利用场景
- 攻击者注册恶意用户
- 管理员查看用户列表时触发XSS
- 可窃取管理员cookie或执行其他恶意操作
修复建议
-
对用户名进行更严格的过滤:
- 禁止特殊字符
- 使用白名单策略
-
输出时进行HTML实体编码:
htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); -
完善XSS过滤函数:
- 增加对HTML事件属性的过滤
- 加强关键词检测
-
使用CSP(Content Security Policy)策略限制脚本执行
总结
该漏洞展示了即使有XSS过滤函数,如果实现不完善仍然可能导致安全问题。开发时应:
- 采用输入验证和输出编码双重防护
- 对用户提供的数据保持高度警惕
- 定期进行安全审计和测试
通过此案例可以学习到存储型XSS的挖掘方法和防御思路,对CMS安全审计有重要参考价值。