在这篇文章中,我们将学习正确使用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,当需要包含用户输入的参数时更是如此,请牢记。

尽量避免让用户传入参数,使用选择项比让用户直接输入字符串要好得多。

如果你必须允许用户输入参数,请广泛参考该命令的参数,确定哪些选项是安全的,并建立一个白名单。

node.js mysql防注入_避免Node.js中的命令行注入安全漏洞相关推荐

  1. mysql隐藏密码_MySQL在Linux系统中隐藏命令行中的密码的方法

    在命令行中输入命令并不是一个好主意,会造成安全问题.但是如果你决定去写一个应用,而这个应用需要在命令行中使用密码或者其他敏感信息.那么,你能通过以下方法禁止系统的其他用户轻易的看到这些敏感数据 呢?, ...

  2. Win7进入mysql环境命令_怎样在win7中使用命令行启动mysql数据库服务

    展开全部 1.Win菜单键+R组合打开32313133353236313431303231363533e58685e5aeb931333363383962Winodws7运行窗口,在打开编辑框中输入c ...

  3. python中访问命令行参数_如何在Python中访问命令行参数?

    我强烈建议argparsePython 2.7及更高版本随附. 该argparse模块减少了样板代码,并使您的代码更健壮,因为该模块可以处理所有标准用例(包括子命令),为您生成帮助和用法,检查和清理用 ...

  4. java 命令行 解析_如何在Java中解析命令行参数?

    小编典典 例如,这是你commons-cli用来解析2个字符串参数的方法: import org.apache.commons.cli.*; public class Main { public st ...

  5. java ncso发送电邮_如何在Windows中从命令行发送电子邮件(无需额外的软件)

    java ncso发送电邮 In Windows there is no way to natively send mail from the Command Prompt, but because ...

  6. linux 卸载软件命令_如何在Linux中使用命令行卸载软件

    linux 卸载软件命令 Linux provides different methods for installing software. You can install software from ...

  7. linux查找文件夹命令_如何在Linux中使用命令行查找文件和文件夹

    linux查找文件夹命令 Most people use a graphical file manager to find files in Linux, such as Nautilus in Gn ...

  8. 高级cmd攻击命令_一步一步学习DVWA渗透测试(Command Injection命令行注入)-第七次课...

    各位小伙伴,今天我们继续学习Command Injection,翻译为中文就是命令行注入.是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的.在OWASP TOP 10中一种存在注 ...

  9. node作为php中转带参数,Nodejs中使用命令行如何进行传参(代码)

    本篇文章给大家带来的内容是关于Nodejs中使用命令行如何进行传参(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 使用commander.js.npm install com ...

最新文章

  1. 简单介绍SQL中ISNULL函数使用方法
  2. 测序数据质量统计软件fastqc,multiqc
  3. OpenStack Neutron浅析(四)
  4. antd tree 动态添加_一文了解Matlab如何制作动态图像
  5. 实战SSM_O2O商铺_08【商铺注册】Thumbnailator图片处理和封装工具类
  6. Python:如何仅用递归函数和栈操作逆序一个栈
  7. SpringBoot文件上传时提示FileUploadBase$SizeLimitExceed
  8. CSS3的滤镜filter属性
  9. 块状元素的居中,首先设置宽度,再设 margin: 0 auto
  10. ASP.net 省市级联(用户控件)适用用framework3.5以上版本
  11. arduino nano引脚_使用直流电机和RF模块nRF24L01制作Arduino遥控小车
  12. Springboot内置tomcat优化
  13. kali扫描内网ip_kali 局域网嗅探
  14. C# webbrowser文本框的键盘和鼠标模拟输入和模拟鼠标点击
  15. Isito - Rate Limits(请求限速)
  16. 微信公众号实现“一键关注”功能
  17. java curl 使用方法_如何在Java中使用这个cURL POST请求?(Spotify API)
  18. ARP欺骗的两种方式
  19. 计算机程序由算法,涉及计算机程序算法的发明专利申请问答
  20. Lytro发布光场影片,让你感受真正的沉浸式视频体验

热门文章

  1. IS环境下配置PHP5+MySql+PHPMyAdmin
  2. Windows Server 2008 部署权限管理RMS
  3. 批处理命令Start
  4. JavaWeb重要知识点总结
  5. 比较DataTable中新旧数据
  6. 制作 Windows8   to Go
  7. WP7基础学习---第九讲
  8. java 添加用户 数据库,跟屌丝学DB2 第二课 建立数据库以及添加用户
  9. css左右布局代码_如何使用CSS位置来布局网站(带有示例代码)
  10. 初学者css常见问题_5分钟内学习CSS-初学者教程