Node.js CVE-2017-14849复现(详细步骤)
0x00 前言
早上看Sec-news安全文摘的时候,发现腾讯安全应急响应中心发表了一篇文章,Node.js CVE-2017-14849 漏洞分析(https://security.tencent.com/index.php/blog/msg/121),然后想着复现,学习学习,就有了这篇文章。
0x01 漏洞简介
CVE(http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-14849)上面的描述是这样的:
Node.js 8.5.0 before 8.6.0 allows remote attackers to access unintended files, because a change to ".." handling was incompatible with the pathname validation used by unspecified community modules.
换成我们看的懂的意思就是node.js 8.5.0 到8.6.0 之间的版本会造成目录穿越漏洞,读取任意文件,而漏洞的原因是因为对”..”的处理和另外的模块不兼容。
打个比喻就是有一个人开发这个模块,另外的一个人开发另外个模块,大家对于这个东西的处理不一样,从而导致出现了漏洞。而这里的模块就是node.js 和 express。
影响版本:
Node.js 8.5.0 + Express 3.19.0-3.21.2
Node.js 8.5.0 + Express 4.11.0-4.15.5
0x02 node.js是什么
Node.js® 是一个基于 Chrome V8 引擎的 JavaScript 运行时。 Node.js 使用高效、轻量级的事件驱动、非阻塞 I/O 模型。它的包生态系统,npm,是目前世界上最大的开源库生态系统。(抄从官网)
0x03 express是什么
Express是基于 Node.js 平台,快速、开放、极简的 web 开发框架。(同样抄从官网)
0x04 如何复现
下面采用腾讯云开发者实验室搭建环境进行快速复现。
复现准备:
0. 腾讯云开发者实验室的云主机一台 (我这里用的是《基于 Ubuntu 搭建微信小程序服务》的实验主机 ubuntu 16.04 64位)
1. node.js 8.5.0 (https://nodejs.org/download/release/v8.5.0/)
2. express-4.15.5 (https://github.com/expressjs/express/releases)
3. burpsuite
Step 1安装node.js 8.5.0
下载node.js 8.5.0安装包
wget https://nodejs.org/download/release/v8.5.0/node-v8.5.0-linux-x64.tar.gz
解压安装包
tar -zxvf node-v8.5.0-linux-x64.tar.gz
移到通用软件安装目录/opt
mv node-v8.5.0-linux-x64 /opt/
安装 npm 和 node 命令到系统命令
sudo ln -s /opt/node-v8.5.0-linux-x64 /bin/node /usr/local/bin/node
sudo ln -s /opt/node-v8.5.0-linux-x64 /bin/npm /usr/local/bin/npm
验证一下:
node -v
输出版本号则表示配置成功
Step2 安装express-4.15.5
下载express-4.15.5
wget https://github.com/expressjs/express/archive/4.15.5.tar.gz
解压压缩包
tar -zxvf 4.15.5.tar.gz
进入express目录下,安装express
cd express-4.15.5 && npm install
进入到expresss-4.15.5/examples/static-files目录里
node index.js
Step 3 发送payload验证
Payload: /../../../a/../../../../etc/passwd

0x05 漏洞原理分析
为什么payload会是这样的呢?请参考腾讯应急响应中心的那篇文章(https://security.tencent.com/index.php/blog/msg/121),写的很言简意赅。
(还不是因为自己菜,分析不出。。。。)
注意:该漏洞是建立在文件夹通过express.static 来托管的情况下,因为在这种情况下才会使用normalize函数进行path标准化。(发现来源于p神的分析)
比如代码这样写:
app.use(express.static(path.join(__dirname, 'static')));
那么payload应该是
/../../../a/../../../../etc/passwd
但代码如果是这样写的话:
app.use('/static',express.static(path.join(__dirname, 'static')));
那么payload应该为:
/static/../../../a/../../../../etc/passwd
0x06 后记
复现很简单,但分析原理很难。至少我现在还没弄明白。等我弄明白了,再写写怎么分析与跟踪吧。
其实这里有一个挺有意思的点,那就是一些重大漏洞的追踪问题,关于这个漏洞官方早在九月份就已经发布了说明,而这个问题是在最近才得到重视,很明显就算是腾讯也没有第一时间去跟踪CVE的更新列表。
而在腾讯发了这篇文章之后,P神把复现环境给弄到了vulhub(https://github.com/vulhub/vulhub/tree/master/node/CVE-2017-14849),速度之快令人惊奇。然后再代码审计里面发了,在微博里面发了。再接着整个安全圈其实都知道了。
然后这里我们得出了一个结论,如果想要得到第一手漏洞预警与学习,应该时刻关注着CVE列表,努力做第一个吃螃蟹的人。
Node.js CVE-2017-14849复现(详细步骤)的更多相关文章
- 如何发布一个自定义Node.js模块到NPM(详细步骤)
		咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ... 
- 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)
		咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ... 
- 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程
		一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ... 
- node.js,express入门看详细篇
		先最简单的代码 安装 npm install express app.js 代码内容 const express = require('express') const app = express() ... 
- Node.js+MySQL管理工作的详细信息所遇到的问题
		问题陈述: Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xE8\xB4\xAD\xE7\x89\xA9' ... 
- 【转载】在Centos系统上采用二进制文件部署Node.js环境
		Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又 ... 
- 如何系统地学习Node.js?
		转载自知乎:http://www.zhihu.com/question/21567720 ------------------------------------------------------- ... 
- 实用的 Node.js 教程,工具和资源
		这里分享一批实用的实用的 Node.js 教程,工具和资源. Node.js是一个建立在Chrome之上的JavaScript运行时平台,可方便地构建快速,可扩展的网络应用程序.Node.js使用事件 ... 
- Node.js CVE-2017-1484复现(详细步骤)
		0x00 前言 早上看Sec-news安全文摘的时候,发现腾讯安全应急响应中心发表了一篇文章,Node.js CVE-2017-14849 漏洞分析(https://security.tencent. ... 
随机推荐
- 最长递增子序列(LIS)(转)
			最长递增子序列(LIS) 本博文转自作者:Yx.Ac 文章来源:勇幸|Thinking (http://www.ahathinking.com) --- 最长递增子序列又叫做最长上升子序列 ... 
- .net WebService 大数据量时性能的提高
			1.直接返回DataSet对象 [WebMethod(Description = "直接返回DataSet对象")] public DataSet GetUserListDateS ... 
- Javascript技术之详尽解析event对象
			描述event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定的事件有意义.比如,fromEleme ... 
- 20155336 2016-2017-2《JAVA程序设计》第五周学习总结
			20155336 2016-2017-2<JAVA程序设计>第五周学习总结 教材学习内容总结 第八章 语法与继承构架 使用try.catch 特点: 使用try.catch语法,JVM会尝 ... 
- 【leetcode 简单】 第七十三题  丑数
			编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例 1: 输入: 6 输出: true 解释: 6 = 2 × 3 示例 2: 输入: 8 输出: true ... 
- sqlmap tamper脚本
			本文来自:SQLmap tamper脚本注释, 更新了一些脚本,<<不断更新中>> 目前已经总共有50+的脚本,故对源文章进行更新... sqlmap-master ls -l ... 
- UVA1386 【Cellular Automaton】题解
			题面:UVA1386 Cellular Automaton 矩阵乘法+快速幂解法: 这是一个比较裸的有点复杂需要优化的矩乘快速幂,所以推荐大家先做一下下列洛谷题目练练手: (会了,差不多就是多倍经验题 ... 
- 系统学习(javascript)_基础(数据类型之间的转换)
			在js中数据类型转换一般分为两种,即强制类型转换和隐式类型转换(利用javascript弱变量类型转换). 强制转换: 利用js提供的函数parseInt(),parseFloat(),Number( ... 
- Linux/Unix系统编程手册 第一章:历史和标准
			Unix的开发不受控于某一个厂商或者组织,是由诸多商业和非商业团体共同贡献进行演化的.这导致两个结果:一是Unix集多种特性于一身,二是由于参与者众多,随着时间推移,Unix实现方式逐渐趋于分裂. 由 ... 
- 20165227 实验三《敏捷开发与XP实践》实验报告
			2017-2018-4 20165227 实验三<敏捷开发与XP实践>实验报告 实验内容 1.XP基础 2.XP核心实践 3.相关工具 实验要求 1.没有Linux基础的同学建议先学习&l ... 
