2 月 10 日,Node.js 曝存在反序列化远程代码执行漏洞。漏洞 CVE 编号 CVE-2017-5941。攻击者利用此漏洞通过构造 Payload 对服务器进行远程攻击,从而获得服务器权限。
Node.js 是一个 Javascript 运行环境 (runtime)。实际上它是对 Google V8 引擎进行了封装。V8 引擎执行 Javascript 的速度非常快,性能非常好。Node.js 对一些特殊用例进行了优化,提供了替代的 API,使得 V8 在非浏览器环境下运行得更好。
漏洞原理:
Node.js 的 node-serialize 库中存在一个漏洞,该漏洞通过传输 JavaScript IIFE,利用恶意代码(未信任数据)达到反序列化远程任意代码执行的效果。
下面我们在本地搭建服务器进行原理演示:
1、在 Ubuntu14.04 安装 Node.js,Node.js 版本 6.9.5 。
2、创建以下 JavaScript 对象,将其传入 serialize() 函数:
3、输出结果如下:
4、serialize() 序列化的字符串,可以用 unserialize() 函数进行反序列化操作。在之前序列化的字符串中函数体后面加上 "()",并传入 unserialize() 函数,就可以成功触发代码执行:
5、执行结果如下:(ls 为例)
6、执行结果如下:(ifconfig 为例)
友情提示:
(1)修改 /node_modules/node-serialize/lib/serialize.js 中的 FUNCFLAG 值为随机值并保证该值不被泄漏。
(2)确保 Serialize 字符串仅内部发送。
(3)使用公钥(RAS)加密 Serialize 字符串,确保字符串不被篡改。
参考链接:
https://www.exploit-db.com/docs/41289.pdf
https://github.com/luin/serialize