Node.js 反序列化远程代码执行漏洞(CVE-2017-5941)漏洞复现

2 月 10 日,Node.js 曝存在反序列化远程代码执行漏洞。漏洞 CVE 编号 CVE-2017-5941。攻击者利用此漏洞通过构造 Payload 对服务器进行远程攻击,从而获得服务器权限。

漏洞复现.jpg

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 。

Node.js 版本 6.9.5

2、创建以下 JavaScript 对象,将其传入 serialize() 函数:

创建JavaScript 对象

3、输出结果如下:

输出结果

4、serialize() 序列化的字符串,可以用 unserialize() 函数进行反序列化操作。在之前序列化的字符串中函数体后面加上 "()",并传入 unserialize() 函数,就可以成功触发代码执行:

反序列化操作触发代码执行

5、执行结果如下:(ls 为例)

代码执行ls

6、执行结果如下:(ifconfig 为例)

代码执行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

推荐阅读更多精彩内容

  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 3,918评论 2 58
  • 本文由我首发于 GitChat 中。 前言 在 Node.js 开发领域中,原生 C++ 模块的开发一直是一个被人...
    機巧死月不會碼代碼阅读 4,642评论 6 24
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,439评论 2 41
  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,229评论 1 37
  • 没有情人的情人节 不只是孤单寂寞 留给人的是思索 爱是什么 情是否带来了快乐 到底得到多少算多 真的很困惑…… 生...
    琢玉书生阅读 217评论 3 9