Node.js 反序列化漏洞远程执行代码(CVE-2017-5941)
实验目的 (转载自I春秋 )
了解Node.js 序列化漏洞原理
掌握利用Node.js 序列化漏洞进行任意代码执行
漏洞原理
现在我们使用0.0.4版本的node-serialize进行研究,成功利用的话,不可信输入传递到 unserialize()的时候可以执行任意代码。创建
Payload最好使用同一模块的serialize()函数。 我创建了以下 JavaScript 对象,将其传入 serialize() 函数。
运行后得到以下输出:
现在我们得到序列化的字符串,可以用 unserialize() 函数进行反序列化操作。那么问题来了,怎么代码执行呢?
只有触发对象的 rce 成员函数才可以。 后来我想到可以使用 JavaScript 的立即调用的函数表达式(IIFE)来调用该函数。
如果我们在函数后使用 IIFE 括号 () ,在对象被创建时,函数就会马上被调用。有点类似于 C 中的类构造函数。 现在修改过的
代码经 serialize() 函数马上会被调用。
运行后得到以下输出:
我们知道了,在之前序列化的字符串中函数体后面
加上括号 (),并将其传入 unserialize() 函数,很幸运,成功执行。那么就有了下面的 exploit:
将其传入unserialize() 函数,触发代码执行。
运行后得到以下输出:
实验环境
操作机:kali linux
目标机:Centos6.5
实验工具 exp.txt:
利用nodejs代码执行的代码文件。
实验步骤
首先访问目标机器http://172.16.12.2 可以看到一个存在node.js漏洞的登录界面。 我们使用nc监听本地端口,用于接收漏洞环境的反弹Shell. nc -lv -p 8080 即监听本机8080端口 Alt text 将实验工具提供的exp代码,下载后修改里面的 <ip> <port>,修改为本机IP和NC监听的端口号。修改后复制该代码,去尝试到登录界面利用。 Alt text 用户名任意输入,将修改好的exp代码复制到密码框点击登录即可。 小提示: 如果代码错误,出现报错导致环境崩溃请从新创建环境,并检测代码错误继续实验 点击登录后,如下图所示:利用成功,已经反弹回一个shell,并且权限为root。
原文地址:https://www.cnblogs.com/kuaile1314/p/11371059.html
- mac机上搭建php56/nginx 1.8.x/thinkphp 3.2.x/gearman扩展/seaslog扩展/redis扩展环境
- 基础野:细说无符号整数
- Ubuntu12.04安装QQ for Linux
- 树莓派:最好的安排
- idea 高级调试技巧
- JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后
- mybatis: 利用多数据源实现分库存储
- 树莓派:文本编辑器与文件
- Java常用类(三)之StringBuffer与StringBuidler
- 使用监听器:定时清除map缓存
- 树莓派:光阴的故事
- lombok在IntelliJ IDEA下的使用
- 基础野:细说浮点数
- 微信开发如何保证access_token/jsapi_ticket长期有效
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用微信测试账号对网页进行授权
- Spring JMS的使用
- 使用Java编写ActiveMQ的队列模式和主题模式
- 安装ActiveMQ
- Spring Cloud Zuul 快速入门
- Spring Cloud 集成 RabbitMQ
- SpringBoot2.x集成Apache Shiro并完成简单的Case开发
- Spring Security权限框架理论与简单Case
- leetcode树之N叉树的前序遍历
- Spring Security 中的 hasRole 和 hasAuthority 有区别吗?
- python常见的import导包技巧
- 真正了解贪心算法,这是一篇精华入门总结...
- MGR修改max_binlog_cache_size参数导致异常
- 【技术创作101训练营】TensorFlow Lite的 GPU 委托(Delegate)加速模型推理
- 弄懂这 5 个问题,拿下 Python 迭代器!