合上吧,水文一篇。
Node.js中的反序列化漏洞?
(Node.js:这锅我不背)
漏洞复现
安装好node和npm后,安装一下主角node-serialize
测试代码:
运行:
可以看到执行了命令whoami
漏洞分析
关于IIFE
从运行截图来看,直接对序列化串进行反序列化,并不能导致远程命令执行,而是需要对序列化串进行修改。这里需要用到JS的IIFE(Immediately-Invoked Function Expression),也即立即执行函数。这里简单的进行介绍。
前两种写法都是很正常的函数调用。
而第三种function(){console.log("Hello,chybeta three!")}();
,由于它直接以function()
开头,js解释器默认情况下碰到function关键字时将其当作函数声明,而第三种写法缺少函数声明所必需的函数名。若要执行该函数,则必须显式地指定其为函数表达式。
第四种写法(function(){console.log("Hello,chybeta four!")}());
,则是常见的IIFE写法,js解释器在遇到()
时,将其中的内容解释为函数表达式,而不是函数声明,因此得以执行。注意在Hello,chybeta four!")}
的后面还有一对括号()
node-serialize
在node-serialize的源码中,即node-serialize/lib/serialize.js,第59行开始,是对反序列(unserialize)的处理:
其中有一句:
不妨在该句之前加上console.log:
执行node index.js
,
所以在进行eval时,实际进行的语句为:
后面的这对括号()
,正是我们在修改原反序列化串时加上的:
eval执行了该语句,从而造成了命令执行。
利用
将exec里的替换成反弹shell,比如:
Refference
其他
无聊玩一玩。