命令执行漏洞-rce

2024-08-25 18:44
文章标签 命令 漏洞 执行 rce

本文主要是介绍命令执行漏洞-rce,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《网安面试指南》icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484339&idx=1&sn=356300f169de74e7a778b04bfbbbd0ab&chksm=c0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene=21#wechat_redirect

1.1 命令执行漏洞

1.1.1 反序列化漏洞

1.1.1.1 漏洞原理

反序列化漏洞是基于序列化和反序列化的操作,在反序列化——unserialize()时存在用户可控参数,而反序列化会自动调用一些魔术方法,如果魔术方法内存在一些敏感操作例如eval()函数,而且参数是通过反序列化产生的,那么用户就可以通过改变参数来执行敏感操作,这就是反序列化漏洞。

1.1.1.2 漏洞危害

攻击者可伪造恶意的字节序列并提交到应用系统时,应用系统将对字节序列进行反序列处理时将执行攻击者所提交的恶意字节序列,从而导致任意代码或命令执行,最终可完成获得应用系统控制权限或操作系统权限。。

1.1.1.3 检测条件

网站正常运行;网址服务器环境中使用WebLogic、WebSphere、JBoss、Jenkins、OpenNMS、shiro 这些使用反序列化的中间件。

1.1.1.4 检测方法

1、 通过指纹识别工具(或者是已知的反序列化POC)检测目标网站是否存在这些WebLogic、WebSphere、JBoss、Jenkins、OpenNMS、shiro这些中间件的反序列化漏洞,若存在即可直接使用相对应的反序列化漏洞利用工具。

使用vulmap对目标进行指纹扫描和漏洞探测:

Vulmap下载地址:GitHub - zhzyker/vulmap: Vulmap 是一款 web 漏洞扫描和验证工具, 可对 webapps 进行漏洞扫描, 并且具备漏洞验证功能

探测到目标使用了weblogic中间件。

以下是常见的识别方法:

Shiro:

rememberMe

可以在 cookie 追加一个 rememberMe=xx 的字段,这个字段是rememberMeManager默认的,然后看响应头部可以看看是否有 Set-Cookie: rememberMe=deleteMe; 的字段则可判断使shiro框架。

Weblogic:

路径进行模糊检测:

/console/login/LoginForm.jsp

/wls-wsat/CoordinatorPortType

/_async/AsyncResponseService

/ws_utc/config.do

脚本工具:GitHub - rabbitmask/WhoIsWeblogic: 提供Weblogic批量模糊指纹识别

典型的404页面:

2、 以下以weblogic为例:weblogic默认端口为7001,这里靶场为docker端口映射,http://vulfocus.xxx.xx:49003/ (weblogic测试靶场)

通过404典型页面初步判定为weblogic,接下来使用weblogic漏洞利用工具进行检测,检测和利用工具下载链接:Release 1.9 · yhy0/ExpDemo-JavaFX · GitHub

通过检测存在目标存在Weblogic反序列化漏洞(CVE-2019-2725)

接下来进行漏洞验证即可,如下图执行ifconfig不影响系统正常运行的命令即可验证。

1.1.1.6 修复建议

l 黑名单校验修复

在反序列化时设置类的黑名单来防御反序列化漏洞利用及攻击,当工程中导入jar包提供反序列化操作的公共接口,就需要使用黑名单的方式来禁止一些已知危险的类被反序列化,部分的黑名单类如下:

org.apache.commons.collections.functors.InvokerTransformer

org.apache.commons.collections.functors.InstantiateTransformer

org.apache.commons.collections4.functors.InvokerTransformer

org.apache.commons.collections4.functors.InstantiateTransformer

org.codehaus.groovy.runtime.ConvertedClosure

org.codehaus.groovy.runtime.MethodClosure

org.springframework.beans.factory.ObjectFactory

com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl

org.apache.commons.fileupload

org.apache.commons.beanutils

l 安全编码

更新commons-collections、commons-io等第三方库版本;

业务需要使用反序列化时,尽量避免反序列化数据可被用户控制,如无法避免建议尽量使用白名单校验的修复方式;

l 过滤用户输入

接收用户传参时过滤不合理,不符合程序逻辑的输入。

1.1.2 代码注入漏洞

1.1.2.1 漏洞原理

当应用在调用一些能将字符串转化成代码的函数(如php中的eval)时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞。 狭义的代码注入通常指将可执行代码注入到当前页面中,如php的eval函数,可以将字符串代表的代码作为php代码执行,当用户能够控制这段字符串时,将产生代码注入漏洞。

1.1.2.2 漏洞危害

通过可注入脚本语言的不同产生的危害也不同,例如如果一个php程序存在代码注入漏洞,可直接获得目标主机权限;如果javascript存在代码注入漏洞,则只能造成一些前端的漏洞,例如xss。

在常见的web应用中,大部分代码注入漏洞出现在php程序中,Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL、SpEL、MVEL等,这些都能造成代码执行漏洞。

1.1.2.3 检测条件

网站正常运行,且使用后端编程语言,例如java/php/python等

1.1.2.4 检测方法

这里以php和java分别介绍检测方法

Php:

在没有目标代码的情况下,可以在可能使用了eval或其他造成代码执行的参数点输入phpinfo()来进行测试,例如某些cms后台有查看服务器环境信息的接口,新建或者编辑模板的功能,都可以进行测试:

www.xxx.com/test.php?searchtype=5&tid=&area=phpinfo()

代码执行成功后,页面返回phpinfo信息

如果发现目标为thinkphp框架或者开源cms,可以使用github已有脚本和poc进行快速扫描:

phpcms前台任意代码执行(有php版本限制)

https://wooyun.x10sec.org/static/bugs/wooyun-2015-0104157.html

Thinkphp快速扫描

https://github.com/Lucifer1993/TPscan

Java:

可观察目标网站是否使用了struts2框架,一般struts2框架的接口通常以action和do结尾,例如:

www.xxx.com/index.action

发现目标使用了struts2框架后,可以使用struts2漏洞利用工具进行测试:

https://github.com/HatBoy/Struts2-Scan

如果目标网站使用了spring框架,则可以测试其是否存在spel表达式注入漏洞,参照如下poc:

https://github.com/wearearima/poc-cve-2018-1273

1.1.2.6 修复建议

总体修复方式:尽量不使用eval等危险函数。如果确定要使用,则参考如下做法 :

l 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则,如果可以尽量使用白名单。

l 输入处理:使用escapeshellarg函数处理相关参数。Escapeshellarg函数会将任何引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“\’”,双引号“””会被转义为“\””,分号“;”会被转义为“\;”,这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。

l 在php中使用disable_functions禁用相关危险函数 。

1.1.3 命令注入漏洞

1.1.3.1 漏洞原理

在Web 程序中,因为业务功能需求要通过Web前端传递参数到后台服务器上执行。但由于开发人员没有对输入进行严格的过滤,导致攻击者可以构造一些额外的“带有非法目的”命令,去欺骗后台服务器执行这些非法命令。命令注入通常因为指Web应用在服务器上拼接系统命令而造成的漏洞。

1.1.3.2 漏洞危害

在存在命令执行漏洞的情况下,如果Web 应用使用的是root权限,则该漏洞可以导致攻击者在服务器上执行任意命令,攻击者可以继承Web服务器程序的权限,去执行系统命令或读写文件、反弹shell、控制整个网站,甚至控制整个服务器。

1.1.3.3 检测条件

1、web业务正常运行且系统调用了执行命令的函数,例如exec、eval等。

2、系统执行命令函数的参数可以通过外部输入或者可控。

3、可控参数可拼接注入参数,并未进行参数校验。

利用命令注入漏洞发起攻击行为示意图如下:

1.1.3.4 检测方法

1、 通过网站的功能:部分网站有特殊功能,比如ping、数据库备份等,黑盒测试时的要点在于找到可能调用第三方命令的业务场景,通常在图片处理、大文件压缩、文件格式转化、日志处理以及数据库导出等功能比较容易调用一些小脚本进行辅助处理。能够确定某个业务模块使用到了第三方工具,就可以进一步对命令注入语句进行分析,是否存在各种限制,最常见的用各种fuzz推测后端对输入进行了哪些限制,对其进行相应的绕过,构造出可以利用的payload。

2、 常见注入连接符:

● 分号分割

● || && & 分割

● | 管道符

● \r\n %d0%a0 换行

● 反引号解析

● $() 替换

示例:ping功能

输入IP后点击ping按钮可以看到系统执行ping命令的结果:

使用常用的管道符命令(&、&&、|、||)进行poc拼接输入如下参数:

127.0.0.1&whoami 可以看到whoami 的执行结果:

由于get参数未做过滤所以可以使用连接符号讲命令与参数进行拼接,然后将拼接好的poc传入后台进行执行,从而达到命令注入。

切记测试命令注入漏洞一定要是用对系统无害的命令进行测试,测试显示结果即可。

1.1.3.6 修复建议

● 不使用时禁用相应函数

找到php.ini,查找到disable_functions,添加禁用的函数名

● 尽量不要执行外部的应用程序或命令

● 做输入的格式检查

● 在使用动态函数之前,确保使用的函数是指定的函数之一

● 在进入执行命令的函数方法之前,对参数进行过滤,对敏感字符调用addslashes进行转义

● 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤

escapeshellarg函数:会将用户引起参数或命令结束的字符进行转义

单引号"'"会被转义为"\’"

双引号“””会被转义为"\""

分号";"会被转义为"\;"

这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中包括的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的

● 转义命令中的所有shell元字符:shell元字符包括 #&;,|*?~<>^()[]{}$\

● 使用safe_mode_exec_dir指定可执行的文件路径

将php.ini文件中的safe_mode设置为On,然后将允许执行的文件放入一个目录,并使用safe_mode_exec_dir指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在safe_mode_exec_dir指定的目录中才会允许执行,否则执行将失败。

这篇关于命令执行漏洞-rce的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106358

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

Linux命令(4):fg与bg命令

fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停 三.jobs 查看当前有多少在后台运行的命令 四.fg 将后台中的命令调至前台继续运行 如果后台中有多个命令,可以

Linux命令(3):sz与rz命令

一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地; 与ssh有关的两个命令可以提供很方便的操作: sz:将选定的文件发送(send)到本地机器 rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive) rz,sz是便是Linux

Smarty模板执行原理

为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。 其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者