【漏洞复现】Nodebb 被爆未授权拒绝服务攻击

简介: 本文复现了旧版 Nodebb 存在的拒绝服务攻击漏洞,通过本案例提醒各位读者,赶紧升级 Nodebb 的版本,同时提高自身的安全意识,在自己编写代码时,一定要对变量进行校验以及强制类型转换,以防被绕过造成危害!

前言

本篇博文主要内容是通过代码审计来分析 Nodebb 存在拒绝服务攻击的原因,并对此进行复现

严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能,严禁用于非法活动。任何个人、团体、组织不得用于非法目的,违法犯罪必将受到法律的严厉制裁。

介绍

漏洞的 CVE 编号为 CVE-2023-30591,适用于 Nodebb 版本小于 2.8.10;


Nodebb 是一个基于 Node.js 构建的开源社区论坛平台,该平台的特点之一是利用 Socket.IO 进行即时交互和实时通知。 以下是 NodeBB 的一些优势:

  • 快速和实时:Nodebb 使用了实时框架,使得帖子和聊天信息可以即时更新,用户可以实时交流和回复。这使得讨论更加活跃和生动。
  • 响应式设计:Nodebb 的界面采用响应式设计,可以在不同的设备上自动适应,包括桌面电脑、平板电脑和手机等。
  • 多功能的帖子和用户管理:Nodebb 具有丰富的功能,包括多级子论坛、标签、帖子置顶、编辑权限、用户组管理等,可以满足各种不同的论坛需求。
  • 安全性和可扩展性:Nodebb 采用现代化的 Web 开发框架,具有良好的安全性和可扩展性,可以通过插件系统灵活地扩展功能或自定义主题。

1721740876211.jpg

分析

由于对 Socket.IO 消息的解析和处理不当,未经身份验证的攻击者能够发送恶意 Socket.IO 消息,导致 Nodebb 工作实例崩溃。尽管 Nodebb 的集群管理器尝试生成新的替代工作器,但在短时间内多次使 Nodebb 工作器崩溃后,可能会导致 Nodebb 集群管理器终止。


利用该漏洞,可以通过使用数组作为 Socket.IO 事件名称,在调用 eventName.startsWith() 时触发崩溃,或者使用对象作为 Socket.IO 事件名称,并设置属性toString,在调用 eventName.toString() 时触发崩溃。


主要代码源自 /src/socket.io/index.js:

async function onMessage(socket, payload) {
    ...
    
    const eventName = payload.data[0];
    
    ...
    
    const parts = eventName.toString().split('.');  // [1]
    const namespace = parts[0];
    const methodToCall = parts.reduce((prev, cur) => {  // [2]
        if (prev !== null && prev[cur] && (!prev.hasOwnProperty || prev.hasOwnProperty(cur))) {
            return prev[cur];
        }
        return null;
    }, Namespaces);
    if (!methodToCall || typeof methodToCall !== 'function') { // [3]
        ...
        return callback({ message: `[[error:invalid-event, ${escapedName}]]` });
    }
    
    ...
    
    if (!eventName.startsWith('admin.') && ratelimit.isFlooding(socket)) {  // [4]
        winston.warn(`[socket.io] Too many emits! Disconnecting uid : ${socket.uid}. Events : ${socket.previousEvents}`);
        return socket.disconnect();
    }
    
    ...
}

根据上述源码,只需要绕开 [3] 在 [4] 处抛出异常或者直接在 [1] 处抛出异常,都将导致 Nodebb 拒绝服务,因为在 /loader.js 中,集群管理器尝试重新启动异常退出的工作进程,如果太多工作线程在硬编码的 10 秒阈值内异常退出,集群管理器就会得出结论,发生了启动错误,并将自行终止,从而杀死所有 Nodebb 工作线程:

1721740917181.jpg

由于攻击者可以随意导致 Nodebb 工作线程突然退出,这使得攻击者能够完全终止 Nodebb,从而导致持续的拒绝服务。

复现

只需要直接在 [1] 处抛出异常或者绕开 [3] 在 [4] 处抛出异常,都将导致 Nodebb 拒绝服务。


源码没有对 eventName 执行类型验证或强制转换,并且假定 String 是类型。

通过 Socket.IO 事件名称的对象类型进行 DoS

结合 [1] 处将 eventName 转换成 String 的处理方式,因此可以直接构造 eventName 为 {"toString": 1};,运行结果:

通过 Socket.IO 事件名称的数组类型进行 DoS

结合 [1] 处将 eventName 转换成 String 后进行分割提取事件名,可以构造如下 eventName:

const eventName = ["topics.loadMoreTags"];

eventName 为 topics.loadMoreTags 是因为在 /src/socket.io/index.js 源码中,modules 数组中的其中一个元素就是 topics,而 loadMoreTags 是它的一个方法,如下所示:

function requireModules() {
  const modules = [
    'admin', 'categories', 'groups', 'meta', 'modules',
    'notifications', 'plugins', 'posts', 'topics', 'user',
    'blacklist', 'uploads',
  ];
  modules.forEach((module) => {
    Namespaces[module] = require(`./${module}`);
  });
}

这样子 methodToCall 就会获取到相应的值,使得 !methodToCall || typeof methodToCall !== 'function' 值为 false,从而进行绕过。


举个例子,下面将用 url.parse 来代替 topics.loadMoreTags:

  1. 根据代码给 Namespaces[module] 赋值:
  2. 根据代码给 methodToCall 赋值:
  3. 输出 !methodToCall || typeof methodToCall !== 'function' 的值:


然后在 eventName.startsWith('admin.') 处抛出异常:

1721740996101.jpg

后记

本文复现了旧版 Nodebb 存在的拒绝服务攻击漏洞,通过本案例提醒各位读者,赶紧升级 Nodebb 的版本,同时提高自身的安全意识,在自己编写代码时,一定要对变量进行校验以及强制类型转换,以防被绕过造成危害!

相关文章
|
4月前
|
存储 开发框架 安全
如何处理预防XSS漏洞攻击问题
防止XSS攻击需要从多个方面入手,包括输入验证和过滤、输出编码、设置正确的HTTP头部、使用最新的安全框架和库、定期进行安全审计和漏洞扫描以及培训和意识提升等。只有综合运用这些措施,才能有效地防止XSS攻击,保护网站和用户的安全。
|
安全 网络安全 PHP
网络安全-RCE(远程命令执行)漏洞原理、攻击与防御
网络安全-RCE(远程命令执行)漏洞原理、攻击与防御
1001 0
网络安全-RCE(远程命令执行)漏洞原理、攻击与防御
|
4月前
|
SQL 监控 安全
如何发现服务器被入侵了,服务器被入侵了该如何处理?
如何发现服务器被入侵了,服务器被入侵了该如何处理?
|
SQL 运维 安全
【WEB安全】详解信息泄漏漏洞
1.1. 漏洞介绍 由于网站管理员运维不当,可能会将备份文件、数据库配置文件等敏感文件存放在WEB目录下公开访问,攻击者可以轻松地访问这些敏感文件,从而了解系统的配置细节、密码信息、数据库凭据等重要数据,扩大的攻击面。 这种泄漏敏感信息的情况就属于信息泄漏漏洞。 1.2. 漏洞发现 主要以目录扫描为主,可参考 目录扫描 (https //blog.gm7.org/个人知识库/0
454 0
|
缓存 安全 网络协议
网络安全-SSRF漏洞原理、攻击与防御
网络安全-SSRF漏洞原理、攻击与防御
405 0
网络安全-SSRF漏洞原理、攻击与防御
|
XML 安全 NoSQL
SSRF漏洞详细讲解
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)探测目标端口如果目标未开放探测的端口,则会立马产生回显如果对方开放了所探测的端口,页面将会一直处于加载中的状态。...
|
云安全 监控 安全
攻击者使用showDoc的漏洞传播僵尸网络
近日,阿里云安全团队基于威胁情报挖掘网络攻击日志的过程中,发现了使用showDoc漏洞传播僵尸网络和挖矿软件的攻击事件,使用该手法传播僵尸网络暂未被公开报告过。
1379 0
攻击者使用showDoc的漏洞传播僵尸网络
|
安全 前端开发 网络安全
渗透测试服务 针对CSRF漏洞检测与代码防御办法
XSS跨站以及CSRF攻击,在目前的渗透测试,以及网站漏洞检测中 ,经常的被爆出有高危漏洞,我们SINE安全公司在对客户网站进行渗透测试时,也常有的发现客户网站以及APP存在以上的漏洞,其实CSRF以及XSS跨站很容易被发现以及利用,在收集客户网站域名,以及其他信息的时候,大体的注意一些请求操作,前端输入,get,post请求中,可否插入csrf代码,以及XSS代码。
170 0
渗透测试服务 针对CSRF漏洞检测与代码防御办法
|
SQL 开发框架 安全
网站漏洞修复方案防止SQL注入攻击漏洞
SQL注入漏洞在网站漏洞里面属于高危漏洞,排列在前三,受影响范围较广,像asp、.net、PHP、java、等程序语言编写的代码,都存在着sql注入漏洞,那么如何检测网站存在sql注入漏洞?
196 0
网站漏洞修复方案防止SQL注入攻击漏洞
|
SQL 安全 数据可视化
如何修补网站漏洞之metinfo远程SQL注入漏洞
2018年11月23日SINE网站安全检测平台,检测到MetInfo最新版本爆出高危漏洞,危害性较大,影响目前MetInfo 5.3版本到最新的 MetInfo 6.1.3版本,该网站漏洞产生的主要原因是MetInfo的上传代码里的参数值没有进行安全过滤,导致上传路径这里进行伪造路径,并可以插入恶意的代码,以及特殊字符进行上传图片到MetInfo的后台。
197 0
如何修补网站漏洞之metinfo远程SQL注入漏洞