SSRF מתקדם - תרגיל¶
תרגיל 1 - SSRF עיוור עם Collaborator¶
רקע¶
יש לכם אפליקציית ווב שמאפשרת לבדוק האם אתר מסוים זמין (uptime checker). האפליקציה מחזירה רק "Online" או "Offline" - בלי את תוכן התשובה.
משימה¶
השלימו את המעבדה הבאה ב-PortSwigger:
Blind SSRF with out-of-band detection
https://portswigger.net/web-security/ssrf/blind/lab-out-of-band-detection
שלבים מנחים¶
- נתחו את הבקשות שהאפליקציה שולחת ומצאו פרמטר שמכיל כתובת URL
- השתמשו ב-Burp Collaborator כדי ליצור תת-דומיין ייחודי
- הזינו את כתובת ה-Collaborator בפרמטר הפגיע
- בדקו ב-Collaborator שהתקבלה בקשה מהשרת
- תעדו את סוג הבקשה שהתקבלה (DNS/HTTP) ואת ה-IP של השרת
תרגיל 2 - Blind SSRF עם חילוץ מידע¶
משימה¶
השלימו את המעבדה:
Blind SSRF with Shellshock exploitation
https://portswigger.net/web-security/ssrf/blind/lab-shellshock-exploitation
שלבים מנחים¶
- זהו את הפרמטר הפגיע ל-SSRF
- מצאו שירות פנימי על הרשת 192.168.0.x
- נצלו את חולשת Shellshock בשירות הפנימי כדי להריץ פקודות
- השתמשו ב-Collaborator כדי לחלץ את הפלט של הפקודות
תרגיל 3 - עקיפת פילטרים¶
משימה¶
השלימו את המעבדות הבאות:
SSRF with blacklist-based input filter
https://portswigger.net/web-security/ssrf/lab-ssrf-with-blacklist-filter
SSRF with filter bypass via open redirection
https://portswigger.net/web-security/ssrf/lab-ssrf-filter-bypass-via-open-redirection
שלבים מנחים למעבדה הראשונה¶
- נסו לגשת ל-
http://localhost/adminושימו לב לחסימה - נסו שיטות טשטוש IP שונות:
http://127.1/adminhttp://0x7f000001/adminhttp://2130706433/admin- נסו קידוד כפול של הנתיב:
%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65 - שלבו טכניקות עד שתצליחו לעקוף את הפילטר
שלבים מנחים למעבדה השנייה¶
- מצאו נקודת Open Redirect באפליקציה
- נצלו את ה-Redirect כדי לעקוף את בדיקת ה-SSRF
- גשו לפאנל הניהול דרך ה-Redirect
תרגיל 4 - SSRF דרך מחולל PDF¶
רקע¶
בנו לעצמכם סביבת תרגול עם הקוד הבא:
from flask import Flask, request, send_file
import pdfkit
import os
app = Flask(__name__)
@app.route('/')
def index():
return '''
<form action="/generate" method="POST">
<textarea name="html" rows="10" cols="50">
<h1>My Report</h1>
<p>Content here...</p>
</textarea>
<br><button type="submit">Generate PDF</button>
</form>
'''
@app.route('/generate', methods=['POST'])
def generate():
html = request.form.get('html', '')
output_path = '/tmp/output.pdf'
pdfkit.from_string(html, output_path)
return send_file(output_path, mimetype='application/pdf')
# שירות פנימי מדומה
@app.route('/internal-secret')
def secret():
return "SECRET_API_KEY=super_secret_key_12345"
if __name__ == '__main__':
app.run(port=5000)
משימות¶
- הזריקו HTML שקורא את הקובץ
/etc/passwdדרך ה-PDF - הזריקו HTML שגורם ל-SSRF לשירות הפנימי
/internal-secret - השתמשו ב-JavaScript בתוך ה-HTML כדי לבצע בקשת AJAX ולהציג את התוצאה ב-PDF
- נסו לקרוא קבצים רגישים נוספים:
/etc/hosts,/proc/self/environ
תרגיל 5 - הבדלי מפענחים¶
משימה¶
כתבו סקריפט Python שמקבל כתובת URL ומייצר ממנה וריאציות שונות שעשויות לעקוף פילטרים:
def generate_ssrf_bypasses(target_ip, target_port, target_path):
"""
קלט: IP פנימי, פורט, נתיב
פלט: רשימת כתובות URL שעשויות לעקוף פילטרים
"""
bypasses = []
# TODO: הוסיפו את כל הטכניקות מההרצאה
# 1. ייצוג עשרוני
# 2. ייצוג הקסדצימלי
# 3. ייצוג אוקטלי
# 4. IPv6
# 5. שימוש ב-@
# 6. דומיינים שמצביעים ל-127.0.0.1
# 7. קידוד URL
# 8. ייצוגים מעורבים
return bypasses
דרישות¶
- הסקריפט צריך לייצר לפחות 15 וריאציות שונות
- כל וריאציה צריכה להכיל כתובת URL תקינה
- הוסיפו אפשרות לבדוק אילו וריאציות עובדות נגד יעד נתון
תרגיל 6 - DNS Rebinding¶
רקע¶
נתון הקוד הבא שמנסה להגן מפני SSRF:
import socket
import ipaddress
import requests
from urllib.parse import urlparse
def safe_fetch(url):
parsed = urlparse(url)
hostname = parsed.hostname
# שלב 1: בדיקת DNS
ip = socket.gethostbyname(hostname)
addr = ipaddress.ip_address(ip)
if addr.is_private or addr.is_loopback:
return "Blocked: Internal IP detected"
# שלב 2: שליחת הבקשה (פגיע ל-DNS Rebinding!)
return requests.get(url).text
משימות¶
- הסבירו מדוע הקוד פגיע ל-DNS Rebinding
- השתמשו ב-
rbndr.usכדי ליצור דומיין שמחליף בין IP חיצוני ל-127.0.0.1 - כתבו סקריפט שמנסה לנצל את הפגיעות באמצעות ריצות מרובות
- תקנו את הקוד כך שיהיה עמיד ל-DNS Rebinding (רמז: שלחו את הבקשה ישירות ל-IP שאומת)
תרגיל בונוס - שרשור SSRF¶
משימה¶
חזרו על כל הטכניקות שלמדתם ובנו תרחיש תקיפה משולב:
- מצאו נקודת SSRF באפליקציה
- השתמשו בה כדי לסרוק את הרשת הפנימית (פורטים 80, 8080, 3000, 6379, 5432)
- מצאו שירות Redis פנימי
- השתמשו בפרוטוקול gopher כדי לשלוח פקודות ל-Redis
- כתבו webshell דרך Redis ל-webroot
סביבת תרגול מומלצת¶
- TryHackMe: "SSRF" room
- HackTheBox: חפשו מכונות עם תגית SSRF
- PortSwigger: השלימו את כל מעבדות ה-SSRF (כולל Expert)