浅谈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 相关文章推荐
js实现兼容IE6与IE7的DIV高度
May 13 Javascript
当前页禁止复制粘贴截屏代码小集
Jul 24 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
Nov 28 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 Javascript
node.js中格式化数字增加千位符的几种方法
Jul 03 Javascript
jQuery基础知识点总结(必看)
May 31 Javascript
react.js 翻页插件实例代码
Jan 19 Javascript
详解如何在angular2中获取节点
Nov 23 Javascript
详解webpack多页面配置记录
Jan 22 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 Javascript
vue router 动态路由清除方式
May 25 Vue.js
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 面向对象 PHP5 中的常量
2010/05/05 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
一次失败的jQuery优化尝试小结
2011/02/06 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
python对html过滤处理的方法
2018/10/21 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
python实现把二维列表变为一维列表的方法分析
2019/10/08 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
迟到检讨书800字
2014/01/13 职场文书
大学军训感想
2014/02/12 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
理财学专业自荐书
2014/06/28 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
教师考核评语大全
2014/12/31 职场文书
违纪检讨书范文
2015/01/27 职场文书
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle