浅谈OS命令注入漏洞(Shell注入漏洞)

news2024/11/25 7:36:59

一、什么是OS命令注入?

1. 基本概念

    OS(Operating system)命令注入(也称为 Shell 注入)是一个 Web 安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统 (OS) 命令,这会破坏应用程序及其所有数据。

2. Shell的概念:

    Shell翻译过来就是” 壳”, 操作系统的外壳。Shell接收用户指令, 调用相应的应用程序, 是一种用C语言编写的程序设计语言, 同时也是“为使用者提供操作界面”的命令解析器。

3. Shell的执行过程:

    当用户输入Shell命令时,Shell负责将命令解释给内核,内核去运行,最后将处理完的结果反馈给用户;所以说Shell既是一种程序设计语言,又是命令解释程序。
而我们常用的CMD和Windows Power Shell是两种不同的Windows命令行工具, 其中PowerShell要更强大, 是微软发布的目前最新的一代命令行和脚本语言一体化工具。 

二、利用OS命令注入漏洞能做什么?

1. 攻击示意图

Shell注入攻击示意图
        Curl是一种支持各种协议的传输工具, 经常在Linux系统中使用;
        通过curl命令调用受害网站的的backdoor.sh脚本文件;这样就可以控制受害者主机, 访问我不该访问的服务, 获取我不该获取的数据,连接我不该连接的网络,篡改我不该篡改的权限。

 

2. DDOS攻击:

    比如说DDOS攻击: 我可以通过Shell注入控制你的电脑, 这台电脑就是我们常说的肉鸡/傀儡机, 我控制了你的电脑, 就可以用你的电脑, 你的IP对目标网站发起请求, 进行DDOS攻击;我控制几百台几千台不断的发起请求, 这就会影响目标服务器的正常访问。(Powershell -Command Invoke-WebRequest -Uri https://wwww.baidu.com -Method POST -Body @{username=‘admin’; password='abc’})

3. 上传非法脚本执行Shell命令

    结合文件上传漏洞:继承Web服务器程序权限,执行系统命令,控制整个服务器。
    结合路径遍历漏洞:访问文件存储路径, 清空所有数据文件。

4. 反弹shell

    假设现在我们有两台主机一台主机A、一台主机B,我们想通过A主机控制B主机。那么如果用正向Shell,其实就是在A主机上输入B主机的连接地址用户名和密码,连接到B,连接成功之后,我们就可以在A主机通过命令控制B主机了, 通过Shell注入可以绕过输入用户密码的步骤。
    但如果现在主机A是公网, 主机B是内网, 而由于防火墙等限制,主机A无法访问到主机B,这时候怎么办?这时候我们就可以利用反弹Shell攻击技术,在公网主机上先开启一个监听端口,然后再通过Shell注入让内网主机去连接公网主机的这个端口,连接成功之后,公网主机这边就能通过命令控制内网主机了。
    问:既然已经可以Shell注入进内网主机了,为什么还要让内网主机去连接控制端主机开启的端口,再由控制端主机发命令去控制内网主机?
    答:便捷;扩大权限;持久化(利用注入点可能会产生系统日志,可以防止后续注入点被修复无法再控制的情况;目标端IP动态变化) 

三、如何检测OS命令注入漏洞?

1. 检查代码

public void shellInjectionSimple(String command) {
    try {
        // 用于调用外部可执行程序或系统命令,这允许攻击者执行任意的外部命令。
        Process process = Runtime.getRuntime().exec(command);

        BufferedReader reader = new BufferedReader(new         InputStreamReader(process.getInputStream()));
        String line;

        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2. Shell盲注

与SQL盲注相同,SQL盲注都有哪些方式:
· SQL语句执行结果True/False,触发不同的响应;
· SQL语句注入服务器是否报错;
· 延迟执行,判断执行时间的长短;
· OAST带外技术盲注; 

四、如何防止OS命令注入?

1. 永远不要从应用层代码中调用操作系统命令 。
2. 参数化执行

public void shellInjectionParametrize(String[] args) {
    try {
        String command = ""; // Hard code

        // ProcessBuilder类是Java中用于执行外部命令的工具类,它提供了一种安全的方式来执行命令
        ProcessBuilder builder = new ProcessBuilder(command);
        List parameters = Arrays.asList(args);
        builder.command().addAll(parameters); // 使用command()方法将其添加到ProcessBuilder对象中
        Process process = builder.start(); // 调用start()方法来启动进程

        BufferdReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); // 使用BufferedReader读取输出流中的数据
        String line;

        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }


        int exitCode = process.waitFor();
        System.out.println("Exit code: " + exitCode);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. 如果不可避免地使用用户提供的输入调用操作系统命令,则必须执行强输入验证:
    a. 添加白名单验证;
    b. 控制输入字符(仅包含字母数字字符,不包含其他语法/空格/特殊字符等)
4. 不建议仅通过转义来控制输入,容易出错,并且很容易被熟练的攻击者绕过。

    对参数进行Base64编码,Base64编码可以作为一种简单的安全措施来保护不受信任的参数,只能保证攻击者无法在传输过程中直接执行。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/750725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

DaVinci Resolve Studio 18对Mac和Windows系统的要求

DaVinci Resolve Studio 18 是一款功能强大的专业视频编辑和调色软件,它提供了全面的工具和功能,让用户能够完成从剪辑、调色到特效和音频处理等各个方面的任务。DaVinci Resolve Studio 18 在中文界面上进行了优化,使得中文用户能够更加方便…

【xxl-job】分布式任务调度系统xxl-job搭建

XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用。 更多介绍,请访问官网:分布式任务调度平台XXL-JOB 一、任务调度中心(基于docker)【Version 2.4.0】 前提条件:任务调度…

Vue3 Vite electron 开发桌面程序

Electron是一个跨平台的桌面应用程序开发框架,它允许开发人员使用Web技术(如HTML、CSS和JavaScript)构建桌面应用程序,这些应用程序可以在Windows、macOS和Linux等操作系统上运行。 Electron的核心是Chromium浏览器内核和Node.js…

个体化治疗策略:如何使用机器学习定制化药物?

一、引言 个体化治疗策略是一种基于患者个体特征和病情的定制化治疗方法,旨在提高治疗效果、减少药物副作用并优化患者的生命质量。传统的治疗方法往往采用标准化的治疗方案,忽视了个体差异和患者特定的需求。然而,每个患者的基因组、疾病特征…

JAVA——二维数组遍历二维数组的三种方法

目录 🍒java中二维数组的定义和赋值 🍒二维数组遍历的三种方法 🍇第一种:for循环遍历 🍇第二种方法:通过Arrays.deepToString()遍历 🍇第三种方法:通过for( : &a…

七大排序算法——希尔排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、希尔排序核心思想代码实现 三、性能分析四、七大排序算法性能对比 一、排序的概念 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小&#xff0…

自动化测试与持续集成方案

目录 前言: 传统接口测试 接口测试自动化 接口自动化的持续集成 前言: 自动化测试和持续集成是软件开发过程中非常重要的环节。自动化测试可以提高测试效率和准确性,而持续集成则可以确保代码的稳定性和可靠性。 传统接口测试 不知道别…

使用WiFi测量仪进行机器人定位的粒子过滤器研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

50. Pow(x, n) 快速幂

题目链接:力扣 解题思路:直接使用for进行累乘会超时(时间复杂度O(n),n为指数n的大小),可以使用快速幂进行更快的幂运算(时间复杂度为O(logn)) 快速幂:核心思想就是每一次把指数缩小一半&#x…

华南农业大学|图像处理与分析技术综合设计|题目解答:读取电表示数

l 设计任务: ipa05.jpg是一幅电气柜上的电表图像,试采用图像处理与分析技术,设计适当的 算法和程序,找出电流表所在的区域,提取其指针位置,计算指针与表盘下沿 的夹角,进而判断当前电表的读数…

车载软件架构——车载诊断软件框架

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的…

vue2+AntdesignVue a-input使用颜色选择器

不需要任何插件即可实现颜色选择器 a-input type设置为color即可 回调函数

vue进阶-消息的订阅与发布

📖vue基础学习-组件 介绍了嵌套组件间父子组件通过 props 属性进行传参。子组件传递数据给父组件通过 $emit() 返回自定义事件,父组件调用自定义事件接收子组件返回参数。 📖vue进阶-vue-route 介绍了路由组件传参,两种方式&…

Spring MVC异步上传、跨服务器上传和文件下载

一、异步上传 之前的上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如:上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 1.1 JSP页面 …

PT:report_timing实用技巧

report_timing -start_end_pair 默认report_timing -to 会报告到endpoint最差一条violation path。 用report_timing -max_path X就会报告到endpoint的X条path,每组startpoint /endpoint只报告最差的一条(在X范围内有多少报多少,下面同理)。 用report…

Android 生成pdf文件

Android 生成pdf文件 1.使用官方的方式 使用官方的方式也就是PdfDocument类的使用 1.1 基本使用 /**** 将tv内容写入到pdf文件*/RequiresApi(api Build.VERSION_CODES.KITKAT)private void newPdf() {// 创建一个PDF文本对象PdfDocument document new PdfDocument();//创建…

什么是从人类反馈中强化学习(RLHF)?

自从OpenAI公司发布ChatGPT以来,人们对大型语言模型(LLM)的这一重大进步感到兴奋。虽然ChatGPT与其他最先进的大型语言模型大小相同,但其性能要高得多,并且承诺支持新的应用程序或颠覆取代原有的应用程序。 ChatGPT的惊人表现背后的主要原因…

NAT—网络地址转换

目录 静态NAT 动态NAT NAPT—easy IP 多对多的NAPT 端口映射—高级用法 NAT—网络地址转换 IPV4地址不够用 NAT ABC—三类地址中截取了一部分地址(并且让这部分地址可以重复使用)—私网地址 A类地址中:10.0.0.0-10.255.255.255 (…

3. 学习分类 - 基于图像大小进行分类

3.1 设置问题 根据图片的尺寸,把图片分为纵向图像和横向图像。这种把图像分成两种类别的问题,就是二分类问题。 纵向图片示例: 横向图片示例: 这样就有了两个训练数据: 增加训练数据,并在图像中表示出来…