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

一、什么是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编码可以作为一种简单的安全措施来保护不受信任的参数,只能保证攻击者无法在传输过程中直接执行。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Apache Spark是一个分布式计算系统,用于大数据处理和分析。然而,如果不谨慎使用,可能存在命令注入漏洞命令注入是一种常见的安全漏洞,攻击者利用这种漏洞向应用程序中注入恶意的命令,从而执行他们无权执行的操作。对于Apache Spark而言,命令注入漏洞可能发生在使用外部命令或系统命令执行时。 攻击者通过构造恶意输入并将其注入命令执行的相关参数中,例如shell命令或数据库查询,从而利用命令注入漏洞。如果Apache Spark的代码没有正确对用户输入进行验证和过滤,攻击者可能在执行命令时传递恶意的参数,导致系统受到攻击。 为了防止Apache Spark命令注入漏洞,开发者和管理员可以实施以下安全措施: 1. 输入验证和过滤:在接受用户输入时,必须对其进行验证和过滤,以确保输入符合预期的格式和内容。可以使用正则表达式或白名单过滤,只允许特定的字符和格式。 2. 参数化查询:在执行外部命令或数据库查询时,应使用参数化查询,通过占位符来传递用户输入,而不是直接拼接字符串。这样可以确保用户输入不能被误解为命令。 3. 最小权限原则:将Spark应用程序中执行的操作的权限限制为最小。确保Spark服务和应用程序以只读或只执行特定操作的权限运行,避免对系统进行不必要的修改或调用危险的命令。 4. 更新和补丁:保持Apache Spark及其相关组件的最新版本,以获取已修复的安全漏洞和错误。及时应用程序补丁和安全更新,以确保系统的安全性。 综上所述,理解和实施输入验证,参数化查询,最小权限原则以及更新和补丁是预防Apache Spark命令注入漏洞的有效方法。这些安全措施将有助于确保Apache Spark系统和处理的数据的安全性,减少命令注入攻击的风险

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值