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;
}
过滤缺陷
-
正则表达式错误:最后一个正则表达式
/on[A-Za-z]+[\s]*=[\s]s\S]i存在语法错误,无法正确匹配所有on事件属性。 -
过滤不全面:仅过滤了
<script>、<style>、<iframe>、<frame>标签和onclick事件,其他HTML标签和事件处理器(如onerror、onmouseover等)未被有效过滤。
绕过方法
有效Payload示例
- 使用img标签的onerror事件:
- 使用p标签的onmouseover事件:
<p onmouseover="javascript:alert(1);">M</p>
- 其他可能的绕过方式:
<svg/onload=alert(1)>
<body onload=alert(1)>
<a href=javascript:alert(1)>click</a>
漏洞验证步骤
-
注册用户:首先需要注册一个普通用户账号并登录系统。
-
发表评论:找到可以评论的文章,准备提交评论。
-
拦截请求:使用Burp Suite等工具拦截评论提交的POST请求。
-
修改评论内容:将评论内容替换为XSS payload,例如:
-
提交请求:放行修改后的请求。
-
触发XSS:
- 普通用户浏览包含恶意评论的文章时触发
- 管理员在后台查看评论时触发
漏洞影响
- 窃取用户凭证:攻击者可窃取登录用户的会话cookie。
- 钓鱼攻击:伪造登录表单诱导用户输入凭证。
- 恶意重定向:将用户重定向到恶意网站。
- 蠕虫传播:如果结合CSRF漏洞,可能实现自我传播。
修复建议
- 完善过滤函数:
protected function filterJs($str) {
// 移除所有HTML标签
$str = strip_tags($str);
// 编码特殊字符
$str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
return $str;
}
-
使用内容安全策略(CSP):添加HTTP头限制脚本执行来源。
-
输入验证:对用户输入进行严格的白名单验证。
-
输出编码:在输出用户提供的内容时进行HTML实体编码。
总结
该漏洞源于不完善的输入过滤机制,通过构造特定的HTML标签和事件处理器可以绕过过滤。开发人员应当采用更严格的安全措施,如白名单过滤、输出编码等,以防止此类XSS漏洞的发生。