Catfish(鲶鱼) CMS V 4.7.21 存储型XSS漏洞
字数 943 2025-08-29 08:32:09

Catfish CMS V4.7.21 存储型XSS漏洞分析与利用

漏洞概述

Catfish CMS(鲶鲶鱼CMS)V4.7.21版本中存在一个存储型跨站脚本(XSS)漏洞,该漏洞位于评论功能处,由于过滤函数filterJs存在缺陷,导致攻击者可以绕过过滤注入恶意JavaScript代码。

漏洞位置

漏洞存在于以下文件中:

\application\index\controller\Index.php

具体函数为pinglun()方法中的评论处理逻辑。

漏洞分析

关键代码

public function pinglun() {
    // ...省略部分代码...
    $data = [
        'post_id' => Request::instance()->post('id'),
        'url' => 'index/Index/article/id/'.Request::instance()->post('id'),
        'uid' => Session::get($this->session_prefix.'user_id'),
        'to_uid' => $beipinglunren['post_author'],
        'createtime' => date("Y-m-d H:i:s"),
        'content' => $this->filterJs(Request::instance()->post('pinglun')), // 漏洞点
        'status' => $plzt
    ];
    Db::name('comments')->insert($data);
    // ...省略部分代码...
}

过滤函数分析

protected function filterJs($str) {
    while(stripos($str,'<script') !== false || stripos($str,'<style') !== false || stripos($str,'<iframe') !== false || stripos($str,'<frame') !== false || stripos($str,'onclick') !== false) {
        $str = preg_replace([
            '/<script[\s\S]*?<\/script[\s]*>/i',
            '/<style[\s\S]*?<\/style[\s]*>/i',
            '/<iframe[\s\S]*?[<\/iframe|\/][\s]*>/i',
            '/<frame[\s\S]*?[<\/frame|\/][\s]*>/i',
            '/on[A-Za-z]+[\s]*=[\s]s\S]i'
        ],'',$str);
    }
    return $str;
}

过滤缺陷

  1. 正则表达式错误:最后一个正则表达式/on[A-Za-z]+[\s]*=[\s]s\S]i存在语法错误,无法正确匹配所有on事件属性。

  2. 过滤不全面:仅过滤了<script><style><iframe><frame>标签和onclick事件,其他HTML标签和事件处理器(如onerroronmouseover等)未被有效过滤。

绕过方法

有效Payload示例

  1. 使用img标签的onerror事件:

  1. 使用p标签的onmouseover事件:
<p onmouseover="javascript:alert(1);">M</p>
  1. 其他可能的绕过方式:
<svg/onload=alert(1)>
<body onload=alert(1)>
<a href=javascript:alert(1)>click</a>

漏洞验证步骤

  1. 注册用户:首先需要注册一个普通用户账号并登录系统。

  2. 发表评论:找到可以评论的文章,准备提交评论。

  3. 拦截请求:使用Burp Suite等工具拦截评论提交的POST请求。

  4. 修改评论内容:将评论内容替换为XSS payload,例如:


  1. 提交请求:放行修改后的请求。

  2. 触发XSS

    • 普通用户浏览包含恶意评论的文章时触发
    • 管理员在后台查看评论时触发

漏洞影响

  1. 窃取用户凭证:攻击者可窃取登录用户的会话cookie。
  2. 钓鱼攻击:伪造登录表单诱导用户输入凭证。
  3. 恶意重定向:将用户重定向到恶意网站。
  4. 蠕虫传播:如果结合CSRF漏洞,可能实现自我传播。

修复建议

  1. 完善过滤函数
protected function filterJs($str) {
    // 移除所有HTML标签
    $str = strip_tags($str);
    // 编码特殊字符
    $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
    return $str;
}
  1. 使用内容安全策略(CSP):添加HTTP头限制脚本执行来源。

  2. 输入验证:对用户输入进行严格的白名单验证。

  3. 输出编码:在输出用户提供的内容时进行HTML实体编码。

总结

该漏洞源于不完善的输入过滤机制,通过构造特定的HTML标签和事件处理器可以绕过过滤。开发人员应当采用更严格的安全措施,如白名单过滤、输出编码等,以防止此类XSS漏洞的发生。

Catfish CMS V4.7.21 存储型XSS漏洞分析与利用 漏洞概述 Catfish CMS(鲶鲶鱼CMS)V4.7.21版本中存在一个存储型跨站脚本(XSS)漏洞,该漏洞位于评论功能处,由于过滤函数 filterJs 存在缺陷,导致攻击者可以绕过过滤注入恶意JavaScript代码。 漏洞位置 漏洞存在于以下文件中: 具体函数为 pinglun() 方法中的评论处理逻辑。 漏洞分析 关键代码 过滤函数分析 过滤缺陷 正则表达式错误 :最后一个正则表达式 /on[A-Za-z]+[\s]*=[\s]s\S]i 存在语法错误,无法正确匹配所有on事件属性。 过滤不全面 :仅过滤了 <script> 、 <style> 、 <iframe> 、 <frame> 标签和 onclick 事件,其他HTML标签和事件处理器(如 onerror 、 onmouseover 等)未被有效过滤。 绕过方法 有效Payload示例 使用img标签的onerror事件: 使用p标签的onmouseover事件: 其他可能的绕过方式: 漏洞验证步骤 注册用户 :首先需要注册一个普通用户账号并登录系统。 发表评论 :找到可以评论的文章,准备提交评论。 拦截请求 :使用Burp Suite等工具拦截评论提交的POST请求。 修改评论内容 :将评论内容替换为XSS payload,例如: 提交请求 :放行修改后的请求。 触发XSS : 普通用户浏览包含恶意评论的文章时触发 管理员在后台查看评论时触发 漏洞影响 窃取用户凭证 :攻击者可窃取登录用户的会话cookie。 钓鱼攻击 :伪造登录表单诱导用户输入凭证。 恶意重定向 :将用户重定向到恶意网站。 蠕虫传播 :如果结合CSRF漏洞,可能实现自我传播。 修复建议 完善过滤函数 : 使用内容安全策略(CSP) :添加HTTP头限制脚本执行来源。 输入验证 :对用户输入进行严格的白名单验证。 输出编码 :在输出用户提供的内容时进行HTML实体编码。 总结 该漏洞源于不完善的输入过滤机制,通过构造特定的HTML标签和事件处理器可以绕过过滤。开发人员应当采用更严格的安全措施,如白名单过滤、输出编码等,以防止此类XSS漏洞的发生。