C/C++的命令执行分析

news2024/9/28 13:15:58

背景

最近发现一个命令执行风险;
一开始提供修复建议,是对特殊字符进行过滤,但是业务侧没有办法过滤,因为输入点是没有办法限制的,然后提供另一个方案是将用户的输入写到配置文件中,然后再进行操作,而不是直接拼接用户的输入;但是提供的方案没有被采纳,所以就有了下文的分析;

本文以Linux环境为背景,只分析C语言的命令执行漏洞。

C的命令执行漏洞分析

漏洞简介

wiki百科上描述:任意代码执行(简称ACE)是指攻击者能够让目标电脑或目标进程中执行任意命令或代码[1]。如果系统有地方可以被黑客利用以执行任意代码,则此处被称为任意代码执行漏洞。特别设计利用此一漏洞的程式,称为任意代码执行漏洞利用。可以通过网络(尤其是通过互联网等广域网)让目标电脑(远程电脑)执行任意代码的能力称为远程代码执行(RCE)。

wiki的描述比较偏于云端的场景,这里场景就是指用户通过浏览器或者其他辅助程序提交数据,由于执行端没有针对执行函数进行过滤,导致在没有指定绝对路径的情况下执行命令。

漏洞成因

在了解漏洞成因之前先看一下C语言在Linux环境中可以执行shell命令的函数;分别是system,popen和exec家族函数。

exec()							# 在当前进程中执行命令,其后所有的代码将被清空,不能执行
system() = fork + exec			# 在子进程中执行指令
popen()  = fork + exec + pipe		# 重定向子进程的标准输入或输出,提供控制子进程输入或输出的能力

关于exec()家族

  • l 代表函数取一个参数列表
execl ("/bin/sh", "sh", "-c", command, (char *) 0);
  • v 代表函数取一个 agrv[] 向量
char *argv[] = {"sh", "-c", command, (char *) 0};
execv("/bin/sh", argv);
  • p 代表通过 PATH 环境变量来查找可执行文件,因此只用提供文件名
execlp ("sh", "sh", "-c", command, (char *) 0);
  • e 代表使用指定的环境变量,函数取一个 envp[] 数组
char *env_init[] = { "USER=unknown", NULL };
execle("/bin/sh", "sh", "-c", command, (char *) 0, env_init);

实例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    if (argc < 2) {
        printf("usage: %s param1 [param2 ...[param n]]\n", argv[0]);
        return -1;
    }

    char cmdbuf[128] = {0};
    snprintf(cmdbuf, sizeof(cmdbuf), "ls %s", argv[1]);

    char cmd[128] = {0};
    snprintf(cmd, sizeof(cmdbuf), argv[1]);

    puts("call system function:");
    system(cmdbuf);

    puts("\ncall popen function:");
    FILE *fp = popen(cmdbuf, "r");
    char readbuf[2048] = {0};
    fread(readbuf, 1, 2048, fp);
    puts(readbuf);
    pclose(fp);

    int pid = fork();
    if (pid > 0) {
        sleep(1);
    } else if (pid == 0) {
        //puts("call execl function:");
        //execl("/bin/sh", "sh", "-c", cmdbuf, NULL);

        //puts("call execl function:");
        //execl("/bin/ls", cmd, NULL);

        //puts("call execve function:");
        //execve("/bin/ls", argv, NULL);

        puts("call execvp function:");
        execvp("/bin/ls", argv);
    }
    return 0;    
}

测试结果,
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

一开始以为参考文章说的没错,自己测试也确实如文章示例一样,然后我试了一下别的playload发现可以绕过了,文章中说通过execve参数注入命令是不会解析执行的,跟自己测试的情况是对不上的;研究此的背景是,研发不采用我提供的修复方案,使用文章中所说的这种修复方式,因为不了解,所以学习一下;
请添加图片描述

那么如果使用execve的方式不能完全修复,针对此类情况有什么较好的修复方案呢;

命令执行修复方案

在执行命令前,对入参进行过滤,对敏感字符进行转义处理;

其实按理说,只要参数是用户可控的都应该这么处理;

然后有些特殊场景,无法过滤的,可以看一下能否写到配置文件中,然后在进行配置的方式,而不是通过拼接命令执行用户输入的内容;

命令执行常见的绕过方式

管道符

“;”

WIndows:

请添加图片描述

Linux:

请添加图片描述

“|”

请添加图片描述
请添加图片描述

“||”

请添加图片描述
请添加图片描述

“&”

请添加图片描述
请添加图片描述

“&&”

请添加图片描述
请添加图片描述

linux下绕过空格

{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
ca\t fl\ag.txt

请添加图片描述

命令注入漏洞介绍(下篇) - FreeBuf网络安全行业门户

命令注入漏洞介绍(上篇) - FreeBuf网络安全行业门户

C 语言执行 shell 命令的三种方式总结_lylhw13_的博客-CSDN博客_c 执行命令

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

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

相关文章

LeetCode24. 两两交换链表中的节点+19. 删除链表的倒数第 N 个结点

24. 两两交换链表中的节点 题目描述&#xff1a; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 输入&#xff1a;head [1…

蓝牙 - 抓包工具BPA600介绍

BPA 600开箱后&#xff0c;先把天线(antenna)装在后面的SMA接口上。 SMA connectors: SMA&#xff08;SubMiniature version A&#xff09;连接器是在20世纪60年代开发的半精密同轴射频连接器&#xff0c;是一种用于同轴电缆的最小连接器接口&#xff0c;具有螺旋式耦合机制。…

复旦大学高校专区入驻飞桨AI Studio,优质教育资源等你来学!

近日&#xff0c;复旦大学高校专区在飞桨人工智能学习与实训社区AI Studio上线&#xff0c;双方将携手搭建人工智能教学实训平台专区&#xff0c;汇集优质教学实训资源&#xff0c;校企共同培育复合型 AI 人才&#xff0c;为国家输送高质量人才&#xff0c;促进国家智能化进程。…

【机器学习】Kullback-Leibler散度实现数据监控

https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence 一、说明 本篇叙述了KL 散度的数学、直觉和如何实际使用&#xff1b;以及它如何最好地用于过程监测。Kullback-Leibler 散度度量&#xff08;相对熵&#xff09;是信息论中的一种统计测量方法&#xff0c;通…

深入理解Dockerfile

一、是什么 Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。把镜像比喻成一个软件那么DockerFile就相当于是软件的配置文件。具体的内容可参考[官方网站](Dockerfile reference | Docker Documentation。 二、能做什么 通…

密码学中的SM2

目录 概述 功能 密钥生成 基点G的生成 模数p 密钥生成过程 加解密 加密过程&#xff1a; 解密过程&#xff1a; 数字签名 概述 对第5步r的计算方式分析 对第6步s的计算方式分析 加密模式 优缺点 论文和研究方向推荐 论文 研究方向 概述 SM2是中国密码学算法…

qt 时间编程之时钟

这里写目录标题 开启time格式自动 QTIM打点 qtime qt的时间类 qtimer qt的定时类 头文件包含以及定义 #include<QTime> #include<QTimer>QTime * time; QTimer * timer;开启 右键槽 timer start&#xff08;50&#xff09; 到达50毫米的时候会触发 time out信号…

Unreal 5 实现场景环境控制组件

我在场景中发现了一个环境控制器&#xff0c;这个场景实现了雨天天气和晴天风沙天气&#xff0c;接下来我分析一下这个天气控制器是如何实现。 实现流程&#xff1a; 将环境控制器拖入场景&#xff0c;在配置项上面设置相应的雾&#xff0c;主光源&#xff0c;天空光。在环境控…

Spring Cloud Alibaba-全链路灰度设计

文章目录 灰度发布概念灰度发布架构Spring Cloud Alibaba技术架构下的灰度发布实现基础设计HttpHeader设计 Spring Cloud Gateway改造Spring Cloud Gateway实现灰度发布过滤器 自定义Loadbalancer微服务注册元信息修改自定义LoadBalancer使用 测试代码放到了github上[地址]() 灰…

STM32F4_CAN详解

目录 1. CAN简介 2. CAN协议的物理层 2.1 CAN协议中的差分信号 3. CAN协议的协议层 3.1 CAN的报文种类及结构 4. STM32的CAN外设 4.1 CAN框图 5. CAN相关结构体 6. CAN相关寄存器 7. 硬件设计 7.1 TJA1050芯片 8. 库函数配置CAN初始化 9. 实验代码 9.1 main.c 9…

SpringBoot问题-----------可以同时处理多少个请求

SpringBoot之可以同时处理多少个请求 SpringBoot的运行方式springBoot中tomcat的位置最小、最多工作线程数最大连接数等待数 SpringBoot的运行方式 SpringBoot项目中内嵌了tomcat 程序的运行就是通过tomcat来实现的&#xff1b;springBoot可以同时处理多少个请求其实就是在说 …

图像生成—使用GANs给出代码示例

文章目录 图像生成简单介绍—使用GANs给出代码示例1. 什么是生成对抗网络&#xff08;GANs&#xff09;2. 准备数据集3. 构建生成器和判别器4. 训练GAN模型5. 生成新图像6. 总结 图像生成简单介绍—使用GANs给出代码示例 图像生成是指使用计算机算法生成图像的过程。这些图像可…

C++ | 多线程使用vector

多线程使用vector 文章目录 多线程使用vector场景描述原因分析解决代码测试不扩容和提前扩容 size 与 capacity 变化欢迎关注公众号【三戒纪元】 场景描述 最近在看代码优化&#xff0c;看到有这样的代码&#xff1a; std::vector<int> valid_indices;void SimbaSegmen…

APP测试面试题快问快答(五)

21. App自动化你用的什么工具&#xff1f; 框架&#xff1a;Appium 编译环境和工具&#xff1a;python3.7和PyCharm 环境&#xff1a;Android sdk 第三方模拟器&#xff1a;夜神、蓝叠等模拟器 定位工具&#xff1a;uiautomatorviewer 实时日志查看&#xff1a;ddms 22.…

Tapdata 重磅更新已就绪!全托管云服务上线,应用场景再扩展

继 5 月举办的 「连接 1 次孤岛&#xff0c;服务 N 个场景」主题产品发布会后&#xff0c;Tapdata Live Data Platform 现已实现功能特性的全面升级&#xff0c;并基于自身产品能力积极探索在应用场景层面的落地实践及无限可能。 在去年 6 月的 Tapdata 2.0 发布会上&#xff…

Threejs实现数字人3D粽子

个人主页&#xff1a; 左本Web3D&#xff0c;更多案例预览请点击》 在线案例 个人简介&#xff1a;专注Web3D使用ThreeJS实现3D效果技巧和学习案例 &#x1f495; &#x1f495;积跬步以至千里&#xff0c;致敬每个爱学习的你。喜欢的话请三连&#xff0c;有问题请私信或者加微…

美国访问学者的父母如何申请探亲签证?

对于美国访问学者的父母来说&#xff0c;申请探亲签证是能够让他们在美国与子女团聚的重要途径。下面是知识人网小编整理的一些关于如何申请探亲签证的基本步骤和要点&#xff0c;希望对您有所帮助。 第一步&#xff1a;了解签证类型 在开始申请探亲签证之前&#xff0c;父母需…

【增值税发票识别 OCR】如何实现自动化发票管理

导言 在现代商业环境中&#xff0c;管理和处理大量的增值税发票数据是一项繁琐而重要的任务。传统的手动处理方法既费时又容易出错&#xff0c;而使用增值税发票识别OCR API可以实现自动化的发票管理&#xff0c;大大减少人工处理的工作量。本文将介绍如何利用增值税发票识别O…

Hadoop --- HDFS介绍

HDFS 全称是Hadoop Distributed File System hadoop分布式&#xff08;cluser&#xff09;文件存储系统。适合一次写入&#xff0c;多次读出的场景。 HDFS不需要单独安装&#xff0c;安装Hadoop的时候带了HDFS系统。 Hadoop安装可以参考&#xff1a; 有基础的&#xff0c;已…

轻松了解OPC:实时数据通信领域的必备神器!

OPC简介 OPC&#xff08;OLE for Process Control&#xff0c;进程控制对象连接&#xff09;是一种在工业自动化领域中被广泛使用的技术&#xff0c;它允许不同厂商的自动化设备之间进行通信和数据交换。 OPC技术最早是由美国的软件公司OPC Foundation推出的&#xff0c;它通…