OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

避免Node.js中的命令行注入安全漏洞


分享到
分类 骇客攻防   关键字 Node.JS   发布 ourjs  1417502745874
注意 转载须保留原文链接,译文链接,作者译者等信息。  
注* 此文是对 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧其中命令行注入的详解

在这篇文章中,我们将学习正确使用Node.js调用系统命令的方法,以避免常见的命令行注入漏洞。

我们经常使用的调用命令的方法是最简单的child_process.exec。它有很一个简单的使用模式;通过传入一段字符串命令,并把一个错误或命令处理结果回传至回调函数中。

这里是你通过child_process.exec调用系统命令一个非常典型的例子。

child_process.exec('ls', function (err, data) {
    console.log(data);
});

不过,当你需要在你调用的命令中添加一些用户输入的参数时,会发生什么?显而易见的解决方案是把用户输入直接和您的命令进行字符串合并。但是,我多年的经验告诉我:当你将连接的字符串从一个系统发送到另一个系统时,总有一天会出问题。

var path = "user input";
child_process.exec('ls -l ' + path, function (err, data) {
    console.log(data);
});


为什么连接字符串会出问题?

嗯,因为在child_process.exec引擎下,将调用执行"/bin/sh"。而不是目标程序。已发送的命令只是被传递给一个新的"/bin/ sh'进程来执行shell。 child_process.exec的名字有一定误导性 - 这是一个bash的解释器,而不是启动一个程序。这意味着,所有的shell字符可能会产生毁灭性的后果,如果直接执行用户输入的参数。


[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]


比如,攻击者可以使用一个分号";"来结束命令,并开始一个新的调用,他们可以使用反引号或$()来运行子命令。还有很多潜在的滥用。

那么什么是正确的调用方式?

execFile / spawn


像spawn和execFile采用一个额外的数组参数,不是一个shell环境下可以执行其他命令的参数,并不会运行额外的命令。

让我们使用的execFile和spawn修改一下之前的例子,看看系统调用有何不同,以及为什么它不容易受到命令注入。

child_process.execFile

var child_process = require('child_process');

var path = "."
child_process.execFile('/bin/ls', ['-l', path], function (err, result) {
    console.log(result)
});

运行的系统调用

[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]


child_process.spawn

使用 spawn 替换的例子很相似。

var child_process = require('child_process');

var path = "."
var ls = child_process.spawn('/bin/ls', ['-l', path])
ls.stdout.on('data', function (data) {
    console.log(data.toString());
});

运行的系统调用

[pid 26883] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */

当使用spawn或execfile时,我们的目标是只执行一个命令(参数)。这意味着用户不能运行注入的命令,因为/bin/ls并不知道如何处理反引号或pipe或;。它的/bin/bash将要解释的是那些命令的参数。它类似于使用将参数传入SQL查询(parameter),如果你熟悉的话。

但还需要警告的是:使用spawn或execFile并不总是安全的。例如,运行 /bin/find,并传入用户输入参数仍有可能导致系统被攻陷。 find命令有一些选项,允许读/写任意文件。

所以,这里有一些关于Node.js运行系统命令的指导建议:

  • 避免使用child_process.exec,当需要包含用户输入的参数时更是如此,请牢记。
  • 尽量避免让用户传入参数,使用选择项比让用户直接输入字符串要好得多。
  • 如果你必须允许用户输入参数,请广泛参考该命令的参数,确定哪些选项是安全的,并建立一个白名单。

原文地址: 点此
社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. NodeJS会是昙花一现吗?
  2. NodeJS就是癌症[2011]
  3. JavaScript的设计缺陷?浮点运算:0.1 + 0.2 != 0.3
  4. 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧
  5. Debug调试Node.JS:我们是如何定位内存泄漏和无限循环的
  6. Go语言实例教程基础语法篇(一)
  7. 理解JavaScript中的事件路由冒泡过程及委托代理机制
  8. 什么是IndexedDB:Web离线数据库入门简介及基础教程
  9. 基于HTML5和JavaScript实现的Winamp MP3播放器
  10. Node.JS编码规范指南教程:教你优雅地写JavaScript代码
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 骇客攻防
  1. 提高NodeJS网站的安全性:Web服务器防黑客攻击技巧
  2. 浦发银行,请给我们一个解释!
  3. 你不知道的JavaScript用法,Hacker是这样写JS的
  4. QQ邮箱是如何泄密的:JSON劫持漏洞攻防原理及演练
  5. 为什么谷歌的JSON响应以while(1);开头?
  6. 技术宅黑入扎总Facebook主页 称不得已
  7. 创建高安全性PHP网站的几个实用要点
  8. 谷歌明文存储用户密码 与其交付不如自我保护
  9. 十大关系数据库SQL注入工具一览

 关键字 - Node.JS
  1. OnceDB支持全文搜索和关系查询的Redis内存数据库:驱动安装及使用教程
  2. 告别Node.js
  3. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  4. 在OnceIO(Node.JS)中用Redis储存Session
  5. OnceIO的模块拦截与注入:模板文件路由重定向与Model数据改写
  6. 使用Node.JS监听文件夹变化
  7. NodeJS教程:基于OnceIO框架实现文件上传和验证
  8. OnceIO(Node.JS)服务器端Cookie设置、添加、删除、显示及其实现原理
  9. OnceIO(Node.JS)的网页(模板)的引用与嵌套
  10. OnceIO(NodeJS)中的服务器端缓存、模板预加载和静态资源文件的缓存和Gzip压缩机制

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号