解决方案-漏洞扫描授权书-手把手教信息安全自学

解决方案-漏洞扫描授权书-手把手教信息安全自学

前言

本篇博文是《从0到1学习安全测试》中漏洞复现系列的第四篇博文,主要内容是通过代码审计来分析 存在拒绝服务攻击的原因,并对此进行复现,往期系列文章请访问博主的 安全测试 专栏;

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

介绍

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

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

分析

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

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

主要代码源自 /src/.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] 处抛出异常,都将导致 拒绝服务,因为在 中,集群管理器尝试重新启动异常退出的工作进程,如果太多工作线程在硬编码的 10 秒阈值内异常退出,集群管理器就会得出结论,发生了启动错误,并将自行终止,从而杀死所有 工作线程:

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

复现

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

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

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

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

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

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

const eventName = ["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}`);
	});
}

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

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

根据代码给 [] 赋值:

根据代码给 赋值:

image.png

输出 ! || !== '' 的值:

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

后记

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

以上就是博文 被爆未授权拒绝服务攻击的所有内容了,希望对大家有所帮助!

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

上篇精讲:(三)建议升级!旧版 Cecil 存在路径遍历漏洞!

我是,期待你的关注,创作不易,请多多支持;

网络安全学习路线图(思维导图)

网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。

1. 网络安全视频资料

2. 网络安全笔记/面试题

3. 网安电子书PDF资料

如果你向网安入门到进阶的全套资料,我都打包整理好了,需要学习的小伙伴可以V我找我拿~

学网络安全/学黑客,零基础资料整理来啦~~~

~

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值