2 月 10 日,Node.js 曝存在反序列化遠程代碼執(zhí)行漏洞。漏洞 CVE 編號 CVE-2017-5941。攻擊者利用此漏洞通過構(gòu)造 Payload 對服務器進行遠程攻擊,從而獲得服務器權(quán)限。

Node.js 是一個 Javascript 運行環(huán)境 (runtime)。實際上它是對 Google V8 引擎進行了封裝。V8 引擎執(zhí)行 Javascript 的速度非??欤阅芊浅:?。Node.js 對一些特殊用例進行了優(yōu)化,提供了替代的 API,使得 V8 在非瀏覽器環(huán)境下運行得更好。
漏洞原理:
Node.js 的 node-serialize 庫中存在一個漏洞,該漏洞通過傳輸 JavaScript IIFE,利用惡意代碼(未信任數(shù)據(jù))達到反序列化遠程任意代碼執(zhí)行的效果。
下面我們在本地搭建服務器進行原理演示:
1、在 Ubuntu14.04 安裝 Node.js,Node.js 版本 6.9.5 。

2、創(chuàng)建以下 JavaScript 對象,將其傳入 serialize() 函數(shù):

3、輸出結(jié)果如下:

4、serialize() 序列化的字符串,可以用 unserialize() 函數(shù)進行反序列化操作。在之前序列化的字符串中函數(shù)體后面加上 "()",并傳入 unserialize() 函數(shù),就可以成功觸發(fā)代碼執(zhí)行:

5、執(zhí)行結(jié)果如下:(ls 為例)

6、執(zhí)行結(jié)果如下:(ifconfig 為例)

友情提示:
(1)修改 /node_modules/node-serialize/lib/serialize.js 中的 FUNCFLAG 值為隨機值并保證該值不被泄漏。
(2)確保 Serialize 字符串僅內(nèi)部發(fā)送。
(3)使用公鑰(RAS)加密 Serialize 字符串,確保字符串不被篡改。
參考鏈接:
https://www.exploit-db.com/docs/41289.pdf
https://github.com/luin/serialize