לדלג לתוכן

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

שלבים מנחים

  1. נתחו את הבקשות שהאפליקציה שולחת ומצאו פרמטר שמכיל כתובת URL
  2. השתמשו ב-Burp Collaborator כדי ליצור תת-דומיין ייחודי
  3. הזינו את כתובת ה-Collaborator בפרמטר הפגיע
  4. בדקו ב-Collaborator שהתקבלה בקשה מהשרת
  5. תעדו את סוג הבקשה שהתקבלה (DNS/HTTP) ואת ה-IP של השרת

תרגיל 2 - Blind SSRF עם חילוץ מידע

משימה

השלימו את המעבדה:

Blind SSRF with Shellshock exploitation
https://portswigger.net/web-security/ssrf/blind/lab-shellshock-exploitation

שלבים מנחים

  1. זהו את הפרמטר הפגיע ל-SSRF
  2. מצאו שירות פנימי על הרשת 192.168.0.x
  3. נצלו את חולשת Shellshock בשירות הפנימי כדי להריץ פקודות
  4. השתמשו ב-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

שלבים מנחים למעבדה הראשונה

  1. נסו לגשת ל-http://localhost/admin ושימו לב לחסימה
  2. נסו שיטות טשטוש IP שונות:
  3. http://127.1/admin
  4. http://0x7f000001/admin
  5. http://2130706433/admin
  6. נסו קידוד כפול של הנתיב: %25%36%31%25%36%34%25%36%64%25%36%39%25%36%65
  7. שלבו טכניקות עד שתצליחו לעקוף את הפילטר

שלבים מנחים למעבדה השנייה

  1. מצאו נקודת Open Redirect באפליקציה
  2. נצלו את ה-Redirect כדי לעקוף את בדיקת ה-SSRF
  3. גשו לפאנל הניהול דרך ה-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)

משימות

  1. הזריקו HTML שקורא את הקובץ /etc/passwd דרך ה-PDF
  2. הזריקו HTML שגורם ל-SSRF לשירות הפנימי /internal-secret
  3. השתמשו ב-JavaScript בתוך ה-HTML כדי לבצע בקשת AJAX ולהציג את התוצאה ב-PDF
  4. נסו לקרוא קבצים רגישים נוספים: /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

משימות

  1. הסבירו מדוע הקוד פגיע ל-DNS Rebinding
  2. השתמשו ב-rbndr.us כדי ליצור דומיין שמחליף בין IP חיצוני ל-127.0.0.1
  3. כתבו סקריפט שמנסה לנצל את הפגיעות באמצעות ריצות מרובות
  4. תקנו את הקוד כך שיהיה עמיד ל-DNS Rebinding (רמז: שלחו את הבקשה ישירות ל-IP שאומת)

תרגיל בונוס - שרשור SSRF

משימה

חזרו על כל הטכניקות שלמדתם ובנו תרחיש תקיפה משולב:

  1. מצאו נקודת SSRF באפליקציה
  2. השתמשו בה כדי לסרוק את הרשת הפנימית (פורטים 80, 8080, 3000, 6379, 5432)
  3. מצאו שירות Redis פנימי
  4. השתמשו בפרוטוקול gopher כדי לשלוח פקודות ל-Redis
  5. כתבו webshell דרך Redis ל-webroot

סביבת תרגול מומלצת

  • TryHackMe: "SSRF" room
  • HackTheBox: חפשו מכונות עם תגית SSRF
  • PortSwigger: השלימו את כל מעבדות ה-SSRF (כולל Expert)