浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)


Posted in Javascript onNovember 10, 2017

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

浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)

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列表,努力做第一个吃螃蟹的人。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 打印内容方法小结
Nov 04 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
Mar 24 Javascript
JSON为什么那样红为什么要用json(另有洞天)
Dec 26 Javascript
中文输入法不触发onkeyup事件的解决办法
Jul 09 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
Jan 22 Javascript
基于js的变量提升和函数提升(详解)
Sep 17 Javascript
vue注册组件的几种方式总结
Mar 08 Javascript
Angular Renderer (渲染器)的具体使用
May 03 Javascript
Vue.js 父子组件通信的十种方式
Oct 30 Javascript
BootStrap table实现表格行拖拽效果
Dec 01 Javascript
bootstrap table列和表头对不齐的解决方法
Jul 19 Javascript
JavaScript This指向问题详解
Nov 25 Javascript
angular之ng-template模板加载
Nov 09 #Javascript
深入理解Vue 单向数据流的原理
Nov 09 #Javascript
node.js基于express使用websocket的方法
Nov 09 #Javascript
angular2系列之路由转场动画的示例代码
Nov 09 #Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 #Javascript
基于vue配置axios的方法步骤
Nov 09 #Javascript
微信小程序倒计时功能实现代码
Nov 09 #Javascript
You might like
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
第五节 克隆 [5]
2006/10/09 PHP
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
通过php快速统计某个数据库中每张表的数据量
2012/09/04 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
Yii框架form表单用法实例
2014/12/04 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
简单的js计算器实现
2016/10/26 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
canvas绘制七巧板
2017/02/03 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
眼镜促销方案
2014/03/15 职场文书
吨的认识教学反思
2014/04/27 职场文书
升职演讲稿范文
2014/05/23 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
趣味运动会广播稿
2014/09/13 职场文书
《藏戏》教学反思
2016/02/23 职场文书
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技