Jira 文件读取分析(CVE-2021-26086)
字数 958 2025-08-05 00:15:37
Jira 文件读取漏洞分析(CVE-2021-26086)技术文档
1. 漏洞概述
CVE-2021-26086是Atlassian Jira软件中的一个文件读取漏洞,允许攻击者通过精心构造的URL读取服务器上的敏感文件,特别是WEB-INF和META-INF目录下的内容。
2. 环境准备
2.1 软件下载
- 下载有漏洞版本和无漏洞版本进行对比分析:
- 下载地址:https://www.atlassian.com/software/jira/update
2.2 远程调试设置
在Jira使用的Tomcat的catalina.bat启动文件中添加调试参数:
set JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=0.0.0.0:9999
3. 漏洞定位方法
3.1 文件差异对比
使用Python脚本比较有漏洞版本和修复版本的文件差异:
import os
import sys
import hashlib
files_md5 = {}
new_files_md5 = {}
def md5sum(path,files_md5_set):
for i in os.listdir(path):
md5 = hashlib.md5()
file = os.path.join(path, i)
if os.path.isfile(file):
with open(file,mode='rb') as fd:
while True:
data = fd.read(4096)
if data:
md5.update(data)
else:
file_modify = file[file.find("/"):]
files_md5_set[file_modify] = md5.hexdigest()
break
else:
md5sum(file,files_md5_set)
if __name__ == '__main__':
md5sum(sys.argv[1],files_md5)
md5sum(sys.argv[2],new_files_md5)
set1 = set(files_md5.items())
set2 = set(new_files_md5.items())
for item in (set1 ^ set2):
print(item,end='')
print("\n")
3.2 关键类定位
通过对比分析,定位到关键类:
CachingResourceDownloadRewriteRule
4. 漏洞分析
4.1 漏洞版本正则表达式(8.5.13)
Pattern PATHS_ALLOWED = Pattern.compile("^/s/(.*)/_/((?i)(?!WEB-INF)(?!META-INF).*)");
- 仅检查路径是否以WEB-INF或META-INF开头
- 允许路径中包含这些关键字,只要不是开头即可
4.2 修复版本正则表达式(8.5.14)
Pattern PATHS_DENIED = Pattern.compile("[^a-zA-Z0-9]((?i)(WEB-INF)|(META-INF))[^a-zA-Z0-9]")
- 检查WEB-INF或META-INF前后是否有非字母数字字符
- 如果匹配则返回null,阻止访问
4.3 防御机制
- 路径遍历防御:过滤
/xxx/../等路径遍历尝试 - 多重URL编码防御:防止通过编码绕过
5. 漏洞利用
5.1 利用方法
使用分号(;)绕过路径检查:
/s/xxx/_/;WEB-INF/web.xml
5.2 限制
- 主要能读取WEB-INF/web.xml等配置文件
- 无法直接读取系统任意文件
6. 修复建议
- 升级到最新版本Jira软件
- 如果无法立即升级,可考虑以下临时措施:
- 在反向代理层添加规则,拦截包含
;WEB-INF或;META-INF的请求 - 限制对
/s/路径的访问权限
- 在反向代理层添加规则,拦截包含
7. 相关资源
- Atlassian官方安全公告
- CVE-2019-11581(同类历史漏洞)分析资料
- Jira官方下载和更新页面
8. 总结
CVE-2021-26086是一个典型的路径检查不严导致的文件读取漏洞,攻击者可以通过特殊字符绕过路径限制,读取WEB-INF等受保护目录下的文件。开发人员在设计路径检查逻辑时,应充分考虑各种边界情况和特殊字符的绕过可能性。