浅谈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 相关文章推荐
Dojo 学习笔记入门篇 First Dojo Example
Nov 15 Javascript
js简单实现交换Li的值
May 22 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
Feb 18 Javascript
Jquery实现的简单轮播效果【附实例】
Apr 19 Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 Javascript
JS实现刷新父页面不弹出提示框的方法
Jun 22 Javascript
使用JS代码实现点击按钮下载文件
Nov 12 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
Vuejs实现购物车功能
Nov 05 Javascript
从0到1构建vueSSR项目之路由的构建
Mar 07 Javascript
使用webpack搭建vue项目实现脚手架功能
Mar 15 Javascript
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
May 30 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
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
php中使用websocket详解
2016/09/23 PHP
php取出数组单个值的方法
2018/03/12 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
python每天定时运行某程序代码
2019/08/16 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
教师绩效考核方案
2014/01/21 职场文书
优秀语文教师事迹
2014/05/18 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
德劲DE1108畅想
2021/04/22 无线电
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle
java中如何截取字符串最后一位
2022/07/07 Java/Android