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日

相关文章

  • Node.js API详解之 tty功能与用法实例分析

    下面是对“Node.js API详解之tty功能与用法实例分析”的完整攻略。 tty功能简介 tty 模块是 Node.js 的核心模块之一,它提供了一些用于处理 tty 设备(终端)的API接口,并且也支持类似 Unix 的管道和基于 event 实现的 IO 。 tty 是 Terminal Type 的缩写,通常指的是 Shell 终端,因此 tty …

    node js 2023年6月8日
    00
  • Nodejs如何搭建Web服务器

    下面是关于如何搭建Node.js Web服务器的完整攻略。 1. 安装Node.js 首先,你需要在你的计算机上安装Node.js。你可以从Node.js的官方网站 https://nodejs.org 下载安装程序,按照提示安装Node.js,安装完成后,你可以通过在命令行中输入以下命令来检查Node.js是否成功安装: node -v 如果你看到输出了N…

    node js 2023年6月8日
    00
  • 详解JWT与Token的应用与原理

    详解JWT与Token的应用与原理 什么是JWT JWT(JSON Web Token)是一种用于网络通信的协议,主要用来在网络应用之间传递认证及授权数据。JWT 将用户信息进行编码,形成一个字符串并将其发送到客户端,在客户端需要访问受保护的资源时,将其发送回服务器进行验证。JWT 是有状态的,因为其中包含了用户的信息,而服务器在解析 Token 时,会将其…

    node js 2023年6月8日
    00
  • Node.js全局可用变量、函数和对象示例详解

    当我们在使用Node.js开发时,会发现有一些变量、函数和对象可以在任何文件中使用,这些变量、函数和对象属于Node.js的全局可用部分。接下来,我将详细讲解这部分全局可用的内容,以及它们的使用方法。 Node.js全局变量 下面是Node.js的一些全局变量: __dirname __dirname用于获取当前执行文件所在的目录的路径。该变量主要用于在当前…

    node js 2023年6月8日
    00
  • node.js读取Excel数据(下载图片)的方法示例

    node.js读取Excel数据(下载图片)的方法示例 这篇文章将介绍如何使用Node.js来读取Excel数据和下载Excel中的图片。我们将使用node-xlsx模块来处理Excel数据,使用request模块下载图片。 步骤一:安装依赖 我们需要安装node-xlsx和request模块来处理Excel数据和下载图片。从命令行安装它们: npm ins…

    node js 2023年6月8日
    00
  • 学习 NodeJS 第八天:Socket 通讯实例

    让我为你介绍一下“学习 NodeJS 第八天:Socket 通讯实例”的完整攻略。 简介 本文将介绍 Socket 通讯实例以及如何使用 Socket 建立通信。 Socket 通讯实例 建立 Socket 服务器 要建立一个 Socket 服务器,你需要使用 net 模块。下面是一些示例代码: const net = require(‘net’); con…

    node js 2023年6月8日
    00
  • nodejs实现日志读取、日志查找及日志刷新的方法分析

    Node.js实现日志读取、日志查找及日志刷新的方法分析 在Node.js中,可以通过模块来实现日志文件的读取、查找和刷新。以下是具体的步骤: 1. 安装模块 使用Node.js需要使用到fs和path模块,并且为了方便管理日志文件,还需要使用mkdirp和log4js模块。可以使用npm安装他们: npm install fs npm install pa…

    node js 2023年6月8日
    00
  • NodeJs form-data格式传输文件的方法

    下面我将详细讲解“NodeJs form-data格式传输文件的方法”的完整攻略。 什么是form-data格式? form-data格式是用于将表单数据以及文件上传到远程服务器的一种数据传输格式,其格式如下: ——WebKitFormBoundary********** Content-Disposition: form-data; name=&q…

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