nodejs代码执行绕过的一些技巧汇总

标题:Node.js代码执行绕过的一些技巧汇总

一、概述

Node.js是一款非常流行的JavaScript运行环境,但在代码执行过程中可能也会出现漏洞使得攻击者可以执行一些不受欢迎的代码。本文将探讨几种绕过代码执行漏洞的技巧。

二、技巧汇总

  1. 绕过输入过滤

当从前端获取用户输入时,很重要的一步就是对数据进行输入检查。但只是检查数据的类型是不够的,因为攻击者可以使用一些特殊字符绕过检查。例如:

const input = req.body.input
fs.readFile('/var/www/html/' + input + '.html', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        res.send(data);
    }
});

攻击者可以使用../字符来绕过input变量的检查,从而获取文件系统中敏感文件的访问权限。此时可以在代码中对输入进行过滤,使用path.resolve方法来限制访问文件的路径:

const path = require('path');
const input = path.resolve(req.body.input);
const fullPath = '/var/www/html/' + input + '.html';
fs.readFile(fullPath, function (err, data) {
    if (err) {
        console.log(err);
    } else {
        res.send(data);
    }
});
  1. 绕过函数执行

时常存在通过eval()函数、Function()函数或从数据库中拿到函数文本执行等情况。例如:

let funcStr = 'console.log("Hello, world!")';
let func = new Function(funcStr);
func();

但攻击者可以将恶意脚本注入到函数字符串中来执行恶意代码:

let funcStr = 'console.log("Hello, world!");alert("You are hacked!");';
let func = new Function(funcStr);
func();

此时可以使用Function的函数签名,在传递给函数前先将所有非字符元素删除:

let funcStr = 'console.log("Hello, world!");alert("You are hacked!");';
let sanitizedFuncStr = funcStr.replace(/[^-\w\s,'"]+/g, '');
let func = new Function(sanitizedFuncStr);
func();

三、示例说明

示例一:目录遍历漏洞

当程序对用户输入缺乏过滤和校验时,可能遭受到目录遍历漏洞攻击。例如以下web服务:

const http = require('http');
const fs = require('fs');

const server = http.createServer(function (req, res) {
    if (req.url === '/') {
        res.writeHead(200, {'Content-Type': 'text/html'});
        fs.readFile(__dirname + '/index.html', function (err, data) {
            res.end(data);
        });
    } else if (req.url === '/static') {
        const fileName = __dirname + req.query.path;
        fs.readFile(fileName, function (err, data) {
            if (err) {
                res.writeHead(404);
                res.end('File not found.');
            } else {
                res.writeHead(200);
                res.end(data);
            }
        });
    } else {
        res.writeHead(404);
        res.end('Page not found.');
    }
});

server.listen(8000);
console.log('Server running at http://127.0.0.1:8000/');

攻击者可以在请求url为/static时通过修改path参数来实现目录遍历攻击。

修改后的代码为:

const http = require('http');
const fs = require('fs');

const server = http.createServer(function (req, res) {
    if (req.url === '/') {
        res.writeHead(200, {'Content-Type': 'text/html'});
        fs.readFile(__dirname + '/index.html', function (err, data) {
            res.end(data);
        });
    } else if (req.url === '/static') {
        const fileName = __dirname + req.query.path;
        // 阻止目录遍历攻击
        if (fileName.indexOf(__dirname) !== 0) {
            res.writeHead(403);
            res.end('Forbidden.');
            return;
        }
        fs.readFile(fileName, function (err, data) {
            if (err) {
                res.writeHead(404);
                res.end('File not found.');
            } else {
                res.writeHead(200);
                res.end(data);
            }
        });
    } else {
        res.writeHead(404);
        res.end('Page not found.');
    }
});

server.listen(8000);
console.log('Server running at http://127.0.0.1:8000/');

fileName包含__dirname(当前文件所在目录)时,才会执行读取文件操作,从而阻止目录遍历漏洞攻击。

示例二:代码注入漏洞

当程序加载用户提供的脚本时,可能产生代码注入漏洞攻击。例如以下web服务:

const express = require('express')
const app = express()

app.get('/user/:id', function (req, res, next) {
  const id = req.params.id
  const user = `User info: ${id}`

  const script = `<script>alert('${user}')</script>`
  res.send(`<p>${user}</p> ${script}`)
})

app.listen(3000, function () {
  console.log('Server listening on port 3000!')
})

攻击者可以通过在url参数中注入脚本来实现XSS攻击。例如:

http://localhost:3000/user/123%3Cscript%3Ealert(%27hacked%27)%3C/script%3E

修改后的代码为:

const express = require('express')
const app = express()
const sanitizeHtml = require('sanitize-html');

app.get('/user/:id', function (req, res, next) {
  const id = sanitizeHtml(req.params.id);
  const user = `User info: ${id}`

  const script = `<script>alert('${user}')</script>`
  res.send(`<p>${user}</p> ${script}`)
})

app.listen(3000, function () {
  console.log('Server listening on port 3000!')
})

使用sanitize-html库可以对用户输入进行HTML过滤,从而防止代码注入漏洞攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs代码执行绕过的一些技巧汇总 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • nodejs 中的读取文件fs模块示例详解

    接下来我将为您详细讲解“nodejs 中的读取文件fs模块示例详解”的完整攻略。首先,先从 fs 模块的引入开始介绍。 引入 fs 模块 在 Node.js 中,fs 模块用于对文件系统进行操作,包括读写文件等功能。要使用 fs 模块,需要在文件开头进行模块引入: const fs = require(‘fs’); 读取文件 fs 模块中提供了多个方法用于读…

    node js 2023年6月8日
    00
  • 利用Node.js+Koa框架实现前后端交互的方法

    使用Node.js和Koa框架,可以轻松地实现前后端交互。下面是一份完整攻略,包含了从创建项目到实现前后端交互的所有步骤。 步骤一:创建一个新项目 首先,我们需要创建一个新项目。可以使用npm init命令创建一个新的包管理文件,并安装koa框架。 mkdir node-koa-demo cd node-koa-demo npm init npm insta…

    node js 2023年6月8日
    00
  • node.js express捕获全局异常的三种方法实例分析

    Node.js Express捕获全局异常的三种方法实例分析 在Node.js Express应用开发中,捕获全局异常肯定是一个必要的技能。那么,在Node.js Express中,我们有哪些方法可以捕获全局异常呢?接下来,我们将会详细讲解使用三种不同方法捕获全局异常的实例分析。 方法一:process.on(“uncaughtException”)函数 使…

    node js 2023年6月8日
    00
  • 基于nodejs res.end和res.send的区别

    首先,需要了解的是res.end()和res.send()都是Node.js用于向客户端发送HTTP响应的方法。它们都可以发送内容到客户端,但是在某些情况下它们会有些微的差异,下面就详细讲解一下它们之间的区别。 1. res.end() 1.1 作用 res.end()是Node.js内置HTTP模块的方法之一,用于结束响应进程并向客户端发送最后一个数据块。…

    node js 2023年6月8日
    00
  • npm i报错以及解决方案实战案例

    首先我们要了解一下“npm i报错”的原因: 网络问题:npm i命令需要从npm官方仓库下载依赖包,在网络缓慢或不稳定的时候可能会出现报错。 依赖版本冲突:在package.json中定义了多个依赖包,并且这些依赖包之间可能存在版本冲突,可能导致npm i报错。 解决方案如下: 换源:可以通过切换npm镜像源来解决网络问题。 示例一:使用淘宝镜像 首先需要…

    node js 2023年6月8日
    00
  • NodeJS实现客户端js加密

    关于“NodeJS实现客户端js加密”的攻略,我可以给你讲解一下。 首先需要明确的是,对于前端加密的需求,我们可以使用一些现成的js代码库来实现加密。但是,由于js代码是公开的,所以在一定程度上不能保证加密的安全性。所以,在这种情况下,我们需要将加密操作转移到后端进行处理,将加密后的数据传回前端。那么,我们就可以使用NodeJS来实现这种加密操作。 下面就是…

    node js 2023年6月8日
    00
  • 浅谈react性能优化的方法

    下面是详细讲解“浅谈React性能优化的方法”的完整攻略。 浅谈React性能优化的方法 在使用React进行开发时,随着项目体量和复杂度的增加,可能会遇到性能方面的问题。本文介绍了一些React性能优化的方法,可以帮助您更好地优化项目性能。 一、使用PureComponent或React.memo 对于一些简单的组件,可以使用PureComponent或R…

    node js 2023年6月8日
    00
  • egg.js的基本使用和调用数据库的方法示例

    下面为你详细讲解egg.js的基本使用和调用数据库的方法示例: 1. egg.js的基本使用 1.1 egg.js简介 Egg.js是阿里出品的一款Node.js框架,它基于Koa.js,致力于企业级应用开发。 Egg.js具有插件化机制,通过插件的方式为开发者提供了一系列开箱即用的基础设施。同时,Egg.js具有比Koa.js更高的扩展性、更完善的文档和更…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部