Solr 文件上传路径遍历漏洞(CVE-2024-52012)
漏洞介绍
Solr 在 Windows 上运行的实例容易受到任意文件路径写访问的攻击,这是由于“configset 上传”API 缺乏输入清理所致。恶意构造的 ZIP 文件可以使用相对文件路径将数据写入文件系统未预料到的部分。
影响范围
6.6 - 9.7.0
修复建议
用户建议升级到 9.8.0 版本,该版本修复了问题。无法升级的用户也可以通过使用 Solr 的“基于规则的认证插件”来限制对 configset 上传 API 的访问,以确保只能由一组受信任的管理员/用户访问,从而安全地防止问题发生。
漏洞复现
使用python构造一个恶意的zip文件。
import zipfile
# 创建ZIP文件并添加文件
with zipfile.ZipFile('0.zip', 'w') as zipf:
zipf.writestr("../0.txt", "hello world, 0")
zipf.writestr("../a.txt","hello world")
zipf.writestr("../a.class.","class test")
然后在目标环境发送put请求上传恶意的zip文件。
可以看到成功将a.txt和a.class上传到了上一级目录。
漏洞分析
看更新的主要代码,可以发下就是增加了isPathAChildOfParent函数检查目录逃逸。
在org.apache.solr.handler.configsets.UploadConfigSetAPI#uploadConfigSet函数中调用了这个上传函数,这里是一个常见的存在漏洞地方。解压缩导致目录穿越。直接使用了ZipInputStream处理了传入的压缩包,在java的原生处理中,并没有对压缩包中特殊的文件名比如../a.txt做处理。这一点在其他语言中也常见。然后这里也没有进行其他的处理,直接将压缩包中每一项的信息使用了uploadFileToConfig函数进行了保存,就是上面截图中的函数。所以可以直接上传一个恶意的压缩包文件。
在uploadFileToConfig函数中也可以看到在执行到写入文件钱还经历了两部分检测。第一个函数isFileForbiddenInConfigSets是黑名单后缀检测,禁止
"class", "java", "jar", "tgz", "zip", "tar", "gz"
这些后缀进行上传。第二个函数isFileForbiddenInConfigset是根据文件前字节的魔术字节匹配确定禁止的文件类型。
但是官方的漏洞介绍说在windows环境下存在这个风险,不知道是不是指可以通过Windows特性绕过后缀检测,比如a.class.这样。所以对描述中的Windows存在路径遍历还是不是很明白为什么这样说。