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

yizhihongxing

标题: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内置模块events事件监听发射详解

    Node.js 内置模块 events 为发布-订阅模式提供了基础。该模块提供了两个类:EventEmitter 和 Class。EventEmitter 是所有事件侦听器类的父类,而 Class 则使其更容易地进行继承。 EventEmitter 类 EventEmitter 类提供了一些方法来操作事件: on(eventName, listener) -…

    node js 2023年6月8日
    00
  • 说说如何利用 Node.js 代理解决跨域问题

    使用 Node.js 代理可以轻松解决跨域问题。跨域问题是由于浏览器的安全限制,不允许从一个源(协议、域名、端口)获取另一个源的资源。但是,如果服务器端使用 Node.js 代理涉及不同的源,那么跨域问题将不再是问题。 下面是两个示例说明: 基于 http-proxy-middleware 的 Node.js 代理 http-proxy-middleware…

    node js 2023年6月8日
    00
  • 简单谈谈关于 npm 5.0 的新坑

    关于npm 5.0的新坑,主要包括以下几个方面: 1. 本地缓存机制 npm 5.0 引入了改进的本地缓存机制,该机制现在默认启用。新机制把每个依赖的模块和它们的元数据缓存到本地,并且这些缓存值不再被视为是全局的(即使你通过 -g 安装)。这样,如果你在两个项目中都使用一个版本号,它们将共享所存储的模块,并且模块只会被下载一次。如果你删除了某个模块,它将保留…

    node js 2023年6月8日
    00
  • node如何实现简单的脚手架浅析

    下面是对于 Node.js 实现简单脚手架的详细讲解。 什么是脚手架? 脚手架(Scaffold)是一个前端项目的空架子,提供了一套目录结构、规范、约定以及代码片段等,让我们快速搭建项目并把精力集中在具体的业务上。 Node.js 实现脚手架 Node.js 可以使用许多现有的工具来实现脚手架,例如 Yeoman、create-react-app 等,但在这…

    node js 2023年6月8日
    00
  • 基于nodejs+express(4.x+)实现文件上传功能

    实现文件上传功能是Web开发中常见的需求之一。本文档将详细讲解如何使用nodejs+express(4.x+)实现文件上传功能。 1. 安装express(4.x+)和multer 在开始使用express和multer之前,需要先确保它们已经安装在你的电脑上。 可以通过npm来进行安装: npm install express multer –save …

    node js 2023年6月8日
    00
  • nodejs npm包管理的配置方法及常用命令介绍

    Node.js npm包管理的配置方法及常用命令介绍 配置方法 安装 Node.js Node.js官网上提供了常规的安装方式,具体可见https://nodejs.org/zh-cn/download/。不过由于 Node.js 需要依赖于系统的 C++ 编译环境,如果你在安装过程中遇到问题,可以考虑使用编译好的二进制程序安装 Node.js,例如 nvm…

    node js 2023年6月8日
    00
  • nodejs 搭建简易服务器的图文教程(推荐)

    下面是详细的“nodejs 搭建简易服务器的图文教程(推荐)”的攻略。 基本概念 Node.js是一个基于Chrome V8引擎的JavaScript运行时。它可以解析和执行JavaScript代码,并在服务器端运行,可以联系上下文环境并直接访问OS底层库的服务器环境。Node.js在后端开发领域发挥着越来越重要的作用,我们可以使用Node.js轻松地搭建一…

    node js 2023年6月8日
    00
  • Node.JS利用PhantomJs抓取网页入门教程

    下面是关于“Node.JS利用PhantomJs抓取网页入门教程”的完整攻略。 简介 Node.JS是一个基于事件驱动的JavaScript服务器端解析器,PhantomJS是一个基于WebKit的无头浏览器,可以模拟浏览器的行为并获取网页内容。Node.js和PhantomJS的结合可以方便高效地抓取网页内容,具有广泛的应用价值。 一、准备工作 我们需要先…

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