云时代两大RCE王牌:SSRF打云元数据与SSTI打模板引擎,hack-skills攻击链详解
【免费下载链接】hack-skillsHelping AI Agent become an awesome practical hacker!项目地址: https://gitcode.com/gh_mirrors/ha/hack-skills
如果你做安全测试或CTF,一定听过这两个名字:**SSRF(服务器端请求伪造)**和SSTI(服务端模板注入)。在云计算时代,它们已经从"普通Web漏洞"升级为"拿云凭据、直接RCE"的王牌级漏洞——SSRF 可以驱动服务器去请求169.254.169.254这个云元数据地址,把云厂商的临时密钥读出来;SSTI 则能让模板引擎替你执行任意系统命令。本文基于 hack-skills 这个 AI Agent 安全知识库中的两大技能文档,用最通俗的方式拆解这两条通往 RCE(远程代码执行)的攻击链,帮你快速建立完整的思路框架。
一、先搞懂:SSRF 和 SSTI 为什么是"云时代王牌"?
💡 简单类比一下:
- SSRF:你让服务器"帮忙打开一个网页",结果你给的网址其实是服务器自己机房里的门。服务器替你开门,你把机房里的东西(云凭据、内网管理面板、Redis)都看了一遍。
- SSTI:网站用模板引擎渲染页面(比如把
{{用户名}}替换成真实名字),如果攻击者的输入没被过滤,模板引擎就会把{{恶意表达式}}当成代码直接执行。
两者的共同点:最终都能实现 RCE——一个通过"读云凭据 → 拿到云账号控制权",一个通过"模板引擎直接执行命令"。
hack-skills 将这两类漏洞分别沉淀为独立的技能目录,每个目录包含主文档SKILL.md和配套的场景、载荷扩展文档:
- SSRF 技能:skills/ssrf-server-side-request-forgery/SKILL.md
- SSTI 技能:skills/ssti-server-side-template-injection/SKILL.md
二、SSRF 打云元数据:一条 URL 如何偷走云凭据
1. 找到 SSRF 入口:哪些参数会"代你发请求"
任何接收URL、IP、主机名的参数都可能是 SSRF 入口。常见的参数名有url、imageUrl、redirect、callback、src、dest等,更隐蔽的入口还包括:PDF/截图生成器、Webhook 配置字段、通过 URL 导入 CSV 等功能。
完整入口清单和验证方法见 skills/ssrf-server-side-request-forgery/SKILL.md 的第 1、2 节。
2. 打云元数据:169.254.169.254 是什么?
所有主流云厂商的虚拟机,都有一个"本地小门"提供元数据接口,包含实例信息、临时 IAM 凭据等:
| 云环境 | 元数据入口 |
|---|---|
| AWS EC2 (IMDSv1) | http://169.254.169.254/latest/meta-data/ |
| AWS EC2 (IMDSv2) | 需先 PUT 获取 token,再带 token 访问 |
| Google Cloud | http://metadata.google.internal/computeMetadata/v1/ |
| Azure | http://169.254.169.254/metadata/instance?api-version=... |
| 阿里云 | http://100.100.100.200/latest/meta-data/ |
| Kubernetes | 读取挂载的 ServiceAccount token 文件 |
⚠️关键技巧:AWS 的 IMDSv2 虽然要 token,但如果 SSRF 支持自定义请求头,攻击者完全可以自己完成"先 PUT 拿 token、再 GET 读凭据"的两步操作——这意味着 IMDSv2 并不能挡住 SSRF。
各云厂商的完整端点目录在 skills/ssrf-server-side-request-forgery/URL_PARSER_TRICKS.md 中有专门整理。
3. 绕过 IP 黑名单:同一个地址的"马甲"
很多应用会直接封掉127.0.0.1和169.254.169.254,但这个地址有几十种写法:
- 十进制:
2852039166(即 169.254.169.254 的数值形式) - 十六进制:
0xa9fea9fe - 八进制:
0251.0376.0251.0376 - IPv6 映射:
[::ffff:169.254.169.254] - DNS Rebinding:用
TTL=0的域名,第一次解析返回公网 IP 通过检查,第二次解析返回内网 IP 完成攻击
DNS Rebinding 的完整时序分析和绕过矩阵,参考 skills/ssrf-server-side-request-forgery/SCENARIOS.md 第 2 节。
4. SSRF → Redis → RCE 经典链
当元数据打不动时,SSRF 还有另一条通往 RCE 的路:打内网 Redis。
- 用
gopher://或dict://协议向内网 Redis(6379 端口)发送命令 - 让 Redis 把一段计划任务(crontab)写到
/var/spool/cron/目录 - 计划任务到期执行,反弹 shell,RCE 达成
这条完整的真实案例链(含 WebLogic CVE-2014-4210 场景)在 skills/ssrf-server-side-request-forgery/SCENARIOS.md 第 1 节有完整拆解。
三、SSTI 打模板引擎:一行表达式如何变成任意命令执行
1. 探测:7*7 = 49 就够了
SSTI 探测的第一课:用数学题代替漏洞利用。发送{{7*7}},如果页面返回49而不是原文,说明 Jinja2 或 Twig 在服务端求值了;${7*7}返回 49 则是 FreeMarker / Velocity / Java EL;<%= 7*7 %>则是 ERB / EJS。
一个巧妙的区分技巧:发送{{7*'7'}}——返回7777777是 Jinja2(Python 字符串乘法),返回49是 Twig(PHP 强制转数字)。完整引擎指纹识别决策树见 skills/ssti-server-side-template-injection/ENGINE_PAYLOADS.md 第 1 节。
2. 引擎 → RCE 的对应关系
识别出模板引擎后,每条引擎都有成熟的 RCE 链,核心思路是"利用模板引擎访问底层运行时":
| 模板引擎 | 技术栈 | RCE 核心思路 |
|---|---|---|
| Jinja2 | Python / Flask | 通过config.__globals__拿到os模块,调用popen执行命令 |
| FreeMarker | Java / Spring | 实例化freemarker.template.utility.Execute对象直接执行 |
| Twig | PHP / Laravel | 注册未定义过滤器回调到exec函数 |
| Velocity | Java | 反射调用java.lang.Runtime.exec() |
| ERB | Ruby / Rails | <%= system('命令') %>直接执行 |
| Thymeleaf | Java / Spring Boot | 借 SpEL 表达式T(java.lang.Runtime)执行 |
各引擎的完整 RCE 载荷矩阵在 skills/ssti-server-side-template-injection/ENGINE_PAYLOADS.md 中按引擎逐一整理。
3. 沙箱绕过:Jinja2 的高级玩法
Flask 等框架常用 Sandbox(沙箱)限制模板能力,但 Jinja2 沙箱有多条成熟逃逸路线:
- MRO 子类遍历:
''.__class__.__mro__[1].__subclasses__()可以列出对象体系的所有子类,找到subprocess.Popen后直接执行命令——这是不依赖 Flask 特定对象的"万能链" - 下划线被过滤:用十六进制编码
attr('\x5f\x5fclass\x5f\x5f')代替__class__ - 点号被过滤:改用
[]下标写法
这些沙箱绕过技巧详细记录在 skills/ssti-server-side-template-injection/SKILL.md 第 4 节。
4. 真实 CVE 场景:SSTI 不止存在于 Web 表单
skills/ssti-server-side-template-injection/SCENARIOS.md 收录了多个真实案例,值得特别记住两个:
- Jira SSTI(CVE-2019-11581):命令输出不出现在页面,而是出现在发给管理员的邮件里——这就是"盲 SSTI"的典型,需要借助 OOB 回连验证
- Maccms 8.x 模板 eval:搜索框输入直接进入
eval(),配合 base64 绕过引号过滤直接写 webshell
四、两条攻击链对比:何时用哪个?
| 维度 | SSRF 打云元数据 | SSTI 打模板引擎 |
|---|---|---|
| 前置条件 | 存在可传 URL 的参数 | 用户输入进入模板渲染 |
| 最终目标 | 云凭据 → 云账号接管 / 内网服务 RCE | 直接 RCE |
| 防御焦点 | URL 校验(黑名单/白名单) | 模板输入净化、避免render_template_string |
| 核心难点 | 绕过 IP 过滤与协议限制 | 引擎指纹识别与沙箱绕过 |
💡 实战中两者常组合出现:先用 SSTI 拿到 RCE,再在服务器内直接请求元数据接口读云凭据;或者用 SSRF 打内网 Redis 落地 crontab,两条链殊途同归。
五、如何用 hack-skills 学习这两条链?
hack-skills 是一个面向 AI Agent 的可组合安全知识库,采用"主入口 → 分类入口 → 深度技能"的三层结构。对本文涉及的两大主题,推荐阅读路径:
- 主入口 skills/hack/SKILL.md:了解整套技能库的导航方式
- SSRF 主线:skills/ssrf-server-side-request-forgery/SKILL.md(快速开始 + 过滤器绕过决策树)→ SCENARIOS.md(CVE 案例与 DNS Rebinding 深挖)→ URL_PARSER_TRICKS.md(跨语言 URL 解析差异与全云厂商端点目录)
- SSTI 主线:skills/ssti-server-side-template-injection/SKILL.md(多语探测序列 + 各引擎 RCE 链)→ ENGINE_PAYLOADS.md(按引擎的指纹与载荷矩阵)→ SCENARIOS.md(Jira、Confluence、Spring Cloud Gateway 等真实 CVE 场景)
项目总览与结构说明见 README.md 和 README_CN.md。
结语
云时代的安全攻防,SSRF 和 SSTI 是绕不开的两条主线:SSRF 考验的是"URL 校验的完整性",SSTI 考验的是"模板边界的清晰性"。理解169.254.169.254的多种伪装形态、掌握7*7探测法和各引擎的 RCE 思路,你就掌握了从普通 Web 漏洞走向云环境 RCE 的完整路径。更多细节与真实案例,都藏在 hack-skills 的上述技能文档里,值得逐节精读。
【免费下载链接】hack-skillsHelping AI Agent become an awesome practical hacker!项目地址: https://gitcode.com/gh_mirrors/ha/hack-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考