当前位置: 首页 > news >正文

关于RCE

什么是RCE?

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。也就是远程命令执行。命令执行是在目标服务器上任意执行系统命令。它属于高危漏洞之一,也属于代码执行的范畴。命令执行漏洞与文件上传漏洞类似,攻击原理易于理解,但是攻击的点非常多。

限制输入长度,如何突破?

前期理解

这里我们先来看看一段源码:

我们可以通过查找PHP的官方文档可以知道,shell_exec()这个函数,通过 shell 执行命令并将完整的输出以字符串的方式返回。也就是$param里面是可以直接写入命令的。下面我们也可以试一下,输入id。

 这也是一种典型的限制输入长度的一个函数,我们现在需要考虑的就是如何在限制长度的情况下,突破这个8位的限制,来进行远程命令执行。因为在Linux下的命令长度一般都比较长,命令长度较短的无非也就那几个(w,id,whoami等等)。而我们需要用到的命令长度却是远远大于8位的。

到这,就需要了解到Linux系统的重定向命令 > 和 >>。这两个区别在于:

  • >是重定向到一个文件,
  • >>是追加内容到一个文件。

如果文件不存在,那么这两个命令都会首先创建这个文件。而我们就可以通过 >m 这一条极短的命令,来创建一个文件。但是要清楚的是,我们写入的是文件名,不是文件内容。

而Linux中还有一个按照时间的排序,打印出当前目录的文件。这个命令就是 ls -t 。该命令可以按照时间,让最近创建的文件排在最前面。为此就可以引发一个思考,我们是否可以通过排序和拼接的方式来进行命令执行呢?

实战操作

接下来,我们就继续操作。

首先,先对需要执行的PHP代码进行base64编码,这里我写的是 phpinfo(); (测试后发现,那两个 ' = ' 可以不要)

然后,在网页上,对param一个一个的输入(也可以在自己电脑的Linux下进行,这样更直观一点)。输入的时候注意长度不要超过8位。

输入>ls -t>0,将这些文件按照创建时间排序,并将文件名追加到0这个文件中。查看一下 0 这个文件里面的内容。

直接sh 0 执行,这里可能会报错,但是文件还是会生成的。

在Linux下,我们查看一下文件是否创建完成。都完成之后,就可以发现我们的目录下出现了从。c.php这个文件,

直接访问。

限制字母和数字如何进行命令执行?

 我们可以再看一个例子

<?php
if(isset($_GET['code'])){var_dump($_GET['code']);$code = $_GET['code'];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]+/",$code)){die("NO.");}eval($code);       
}else{highlight_file(__FILE__);
}

解读代码 

  •  限制了输入长度,但是不想上一个例子限制的那么严
  • "/[A-Za-z0-9_$]+/"这段正则,限制了输入的内容,不能使用大小写字母、数字、_、$
  • 最后用eval执行,highlight_file()高亮显示 

 这里的PHP版本我使用的是5.6.9版本。

流程思路

那么,该如何绕过这个限制呢?

这里我们得重点关注这个正则。它虽然过滤了大小写字母、数字、_、$,在Linux上确实很多的命令都不能使用,但真的是这样吗? 

这里要补充一个知识点:在Linux下,我们可以使用 ? 来进行文件的匹配。也就是说,如果我们要匹配到 /tmp 目录下的文件的话,就可以使用/???/?????????类似这种格式,来进行一个匹配。但是如果只是这样的话,匹配到的文件就太多了,还是不能精准的对这个临时文件进行匹配。

可以知道的一点是,在我们进行文件上传的时候,Linux中的 /tmp 目录下会自动生成一个文件,它的文件名是随机的,但是它的文件名的最后几位通常存在一个或多个大写字母,这和我们Linux的其他文件是很不相同的。此时,就需要想一个办法,既然我们已经知道这个文件名的特征了,就可以从这个方面入手。

根据ascii码表,我们可以知道大写字母的范围是96~123这个范围内,但是因为不能使用数字,所以说就可以用 @-[ 来对其进行替代。也就是说现在,我们的匹配命令就可以用ls -al /???/????????[@-[] 来进行一个精准匹配。

知道原理之后,就可以进行实战的操作了

实战操作

先简单写一个上传文件的网页,上传成功之后,跳转到web2.php页面。

因为把之前的临时文件删了,我这里就自己在/tmp目录下创建了一个phaaaaaaA文件。

然后,对刚才的文件上传页面,我们用BP来抓包,分析一下POST上传文件的结构。

在回到web2.php,对这个网页抓包。

对比一下这两个包的结构,很明显可以看出一个是POST传参,一个是GET传参 。我们将这两个数据包都放到Rpeater模块中去,进行重放。

首先,我们要对之前web2.php这个页面的参数进行修改。 将GET改成POST,然后将Content-Type修改成和文件上传的那个包里的格式相同。然后,就可以将重点放到 ? 后面的内容。

第一个问题:这里为什么要用 ?><? 呢?

这里通过查找PHP的官方文档可以知道,我们需要在 = 前面加上 ?> 来进行闭合,这样才能重新进入到PHP模式。

第二个问题:为什么要使用 ` ` (反引号)?

因为eval() 可以使用反引号来直接执行系统命令。也就是eval()可以利用反引号来执行命令,而反引号中的命令,可以在Linux下直接执行。所以说此时,代码执行变成了命令执行。

第三个问题:为什么要对其进行编码?

因为是在地址栏中,所以要遵守URLcode编码。而且需要注意的是,里面不能出现空格,需要用+来进行连接。

第四个问题:这里为什么既有POST传参又有GET传参呢?

这里是PHP的一个流程。POST传参和GET传参是可以并行处理的,相互不会影响。

最后,直接send

成功执行了。

相关文章:

关于RCE

什么是RCE&#xff1f; RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。也就是远程命令执行。命令执行是在目标服务器上任意执行系统命令。它属于高危漏洞之一&#xff0c;也属于代码执行的范畴。命令执行漏洞与…...

深入理解npm:从入门到精通

1. npm 简介 npm&#xff08;Node Package Manager&#xff09;是 Node.js 生态系统中的核心组件&#xff0c;它不仅是一个包管理器&#xff0c;还是一个强大的开发工具和庞大的开源社区。自2010年首次发布以来&#xff0c;npm 已经成为世界上最大的软件注册表&#xff0c;拥有…...

Docker入门教程:10分钟掌握基础

Docker入门教程&#xff1a;10分钟掌握基础 1. Docker是什么&#xff1f; Docker是一种容器化技术&#xff0c;它允许开发者打包他们的应用以及应用的依赖环境到一个可移植的容器中&#xff0c;这个容器可以在任何支持Docker的操作系统上运行。 2. Docker的基本组成 镜像&a…...

NLP实验-基于预训练模型的文本分类

使用BERT及其变体实现AclImdb情感分类 前言数据集介绍【Hugging Face】使用方法和如何挑选一个自己需要的模型 基于BERT预训练模型的本文分类数据预处理载入文本标记器将数据转化为模型可以接受的格式训练模型加载模型 基于RoBerta预训练模型的文本分类基于DeBerta预训练模型的…...

Table API SQL的概念和通用API

目录 表API和SQL程序的结构 创建表环境(Create a TableEnvironment) 在目录中创建表(Create Tables in the Catalog) 临时表与永久表(Temporary vs Permanent tables) 遮蔽(Shadowing) 创建表(Create a Table) 连接器表(Connector Tables) 虚拟表(Virtual…...

【网络】UDP和TCP之间的差别和回显服务器

文章目录 UDP 和 TCP 之间的差别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP API 的使用UDP APIDatagramSocket构造方法方法 DatagramPacket构造方法方法 回显服务器&#xff08;Echo Server&#xff09;1. 接收请求2. 根据请求计算响应3. 将…...

Electron:摄像头录制和屏幕录制

摄像头录制 main.js const { app, BrowserWindow} require(electron)let mainWin null const createWindow () > {mainWin new BrowserWindow({width: 800,height: 600,title: 自定义菜单,webPreferences: {// 允许渲染进程使用nodejsnodeIntegration: true,// 允许渲…...

【uniapp】vue3+vite配置tailwindcss

安装 npm install autoprefixer tailwindcss uni-helper/vite-plugin-uni-tailwind -Dautoprefixer &#xff1a;自动管理浏览器前缀的插件&#xff0c;可以解析css文件并且添加前缀到css内容里。uni-helper/vite-plugin-uni-tailwind: 将 Tailwind CSS 框架集成到使用 Vite 作…...

从源码到应用:医疗陪诊系统与在线问诊小程序开发详解

在数字化医疗时代&#xff0c;医疗陪诊系统与在线问诊小程序的开发成为了医疗机构和技术公司关注的焦点。接下来&#xff0c;小编将与您一同深入了解。 一、医疗陪诊系统的核心功能 医疗陪诊系统旨在为患者提供更贴心的医疗服务&#xff0c;通过专业人员陪同患者完成就医过程。…...

mysql数据库中decimal数据类型比较大小

在MySQL中&#xff0c;DECIMAL数据类型用于存储精确的数值&#xff0c;它非常适合用于需要高精度计算的场景&#xff0c;如金融应用。当我们需要在MySQL数据库中比较DECIMAL类型数据的大小时&#xff0c;可以使用标准的比较运算符&#xff0c;如>, <, >, <, 和 &l…...

掌控库存,简化管理 — InvenTree 开源库存管理系统

InvenTree &#xff1a;简化您的库存管理&#xff0c;让效率和控制力触手可及。- 精选真开源&#xff0c;释放新价值。 概览 InvenTree&#xff0c;一款专为精细化库存管理而设计的开源系统&#xff0c;以其高效和灵活性在众多库存管理工具中脱颖而出。它以Python和Django框架…...

Linux---项目自动化构建工具-make/Makefile

一、背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件…...

嘉立创EDA个人学习笔记1(PCB板介绍)

前言 本篇文章属于嘉立创EDA的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 嘉立创EDA-PCB设计零基础入门课程&#xff08;54集全&#xff09;_…...

(转)Restful接口设计(1)

.representational&#xff1a;代表性的 URI&#xff08;Universal Resouce Identifier&#xff09;&#xff1a;Universal &#xff1a;普遍的;共同的。Identifier&#xff1a;标识符。统一资源标识符。 31-RESTful接口介绍-02_哔哩哔哩_bilibili 31-RESTful接口介绍-03_哔哩…...

Python进阶之3D图形

Python进阶之3D图形 在数据可视化中&#xff0c;2D图形通常可以满足大多数需求。然而&#xff0c;对于一些复杂的数据或分析&#xff0c;3D图形可以提供更多的视角和洞察。在Python中&#xff0c;使用 Matplotlib 和 Plotly 等库可以轻松创建各种3D图形。本文将介绍如何使用这…...

机器学习深度学习中的搜索算法浅谈

机器学习&深度学习中的搜索算法浅谈 搜索算法是计算机科学中的核心算法&#xff0c;用于在各种数据结构&#xff08;如数组、列表、树、图等&#xff09;中查找特定元素或信息。这些算法不仅在理论上具有重要意义&#xff0c;还在实际应用中扮演着关键角色。本文将详细探讨…...

基于IMX8M_plus+FPGA+AI监护仪解决方案

监护仪是一种以测量和控制病人生理参数&#xff0c;并可与已知设定值进行比较&#xff0c;如果出现超标可发出警报的装置或系统。 &#xff08;1&#xff09;监护仪主要采集测量人体生理参数&#xff0c;心电、血压、血氧、体温等需要采集处理大量的数据&#xff0c;系统需要多…...

仿RabbitMq实现简易消息队列正式篇(路由匹配篇)

TOC 目录 路由匹配模块 代码展示 路由匹配模块 决定了一条消息是否能够发布到指定的队列 在每个队列根交换机的绑定信息中&#xff0c;都有一个binding_key&#xff08;在虚拟机篇有说到&#xff09;这是队列发布的匹配规则 在每条要发布的消息中&#xff0c;都有一个rout…...

一套完整的NVR网络硬盘录像机解决方案和NVR程序源码介绍

随着网络技术的发展&#xff0c;视频数据存储的需求激增&#xff0c;促使硬盘录像机&#xff08;DVR&#xff09;逐渐演变为具备网络功能的网络视频录像机&#xff08;NVR&#xff09;。NVR&#xff0c;即网络视频录像机&#xff0c;负责网络视音频信号的接入、存储、转发、解码…...

2024年人工智能固态硬盘采购容量预计超过45 EB

根据TrendForce发布的最新市场报告&#xff0c;人工智能&#xff08;AI&#xff09;服务器客户在过去两个季度显著增加了对企业级固态硬盘&#xff08;SSD&#xff09;的订单。为了满足AI应用中不断增长的SSD需求&#xff0c;上游供应商正在加速工艺升级&#xff0c;并计划在20…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...