חולשות מסדר שני - תרגיל¶
תרגיל 1 - Second-Order SQLi¶
PortSwigger Lab: SQL injection with filter bypass via XML encoding
משימות¶
- הקימו סביבה מקומית עם Flask ו-SQLite
- צרו מערכת הרשמה והתחברות עם הקוד הפגיע מההרצאה
- הירשמו עם שם המשתמש:
admin'-- - התחברו עם המשתמש הזה
- שנו סיסמה - ובדקו מה קרה לסיסמת admin המקורי
- התחברו כ-admin עם הסיסמה החדשה
- תעדו את כל התהליך
תרגיל 2 - Second-Order XSS¶
משימות¶
- הקימו אפליקציה עם מערכת פרופילים ופאנל ניהול
- הירשמו עם שם תצוגה שמכיל payload של XSS:
- גשו לפאנל הניהול שמציג את כל המשתמשים
- וודאו שה-XSS מופעל
- כעת תקנו את הקוד ובדקו שהתיקון עובד
תרגיל 3 - זיהוי נקודות הזרקה¶
משימות¶
בהינתן אפליקציה עם הפונקציונליות הבאה:
- הרשמה (שם, אימייל, ביוגרפיה)
- העלאת קבצים
- תגובות על מוצרים
- פאנל ניהול שמציג פעילות משתמשים
- דוחות יומיים שנשלחים במייל
מפו את כל נקודות ההזרקה האפשריות למתקפות מסדר שני:
- לכל נקודת קלט - רשמו איפה הנתון נשמר
- לכל נתון שמור - רשמו איפה הוא מוצג/משמש
- לכל זוג קלט-פלט - קבעו איזה סוג payload מתאים (SQLi, XSS, SSTI, Command Injection)
- דרגו את הסיכון של כל זוג
תרגיל 4 - שרשור חולשות¶
משימות¶
- הקימו אפליקציה שפגיעה ל-Second-Order XSS
- השתמשו ב-XSS כדי:
- לגנוב cookie של מנהל
- ליצור משתמש admin חדש (דרך CSRF)
-
לחלץ מידע מפאנל הניהול
-
תעדו את כל שרשרת התקיפה:
שלב 1: הרשמה עם XSS payload בשם התצוגה
שלב 2: מנהל צופה ברשימת המשתמשים
שלב 3: XSS מופעל - cookie נשלח לתוקף
שלב 4: תוקף משתמש ב-cookie לגישה לפאנל
שלב 5: תוקף מחלץ מידע רגיש
תרגיל 5 - Second-Order Command Injection¶
משימות¶
- צרו אפליקציה שמאפשרת העלאת קבצים ומעבדת אותם ברקע:
# uploads handler
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
filename = file.filename
file.save(f'uploads/{filename}')
db.execute("INSERT INTO files (name, status) VALUES (?, 'pending')", (filename,))
return "File queued for processing"
# background processor
def process_pending():
files = db.execute("SELECT name FROM files WHERE status = 'pending'").fetchall()
for f in files:
os.system(f"file uploads/{f[0]} > results/{f[0]}.txt")
- העלו קובץ עם שם זדוני:
- הפעילו את ה-processor ובדקו אם הפקודה בוצעה
- תקנו את הקוד
תרגיל 6 - ניתוח קוד¶
משימות¶
בהינתן הקוד הבא, מצאו את כל החולשות מסדר שני:
from flask import Flask, request, session, render_template_string
import sqlite3, os
app = Flask(__name__)
@app.route('/register', methods=['POST'])
def register():
db = sqlite3.connect('app.db')
username = request.form['username']
email = request.form['email']
bio = request.form['bio']
db.execute("INSERT INTO users (username, email, bio) VALUES (?, ?, ?)",
(username, email, bio))
db.commit()
return "OK"
@app.route('/admin/report')
def admin_report():
db = sqlite3.connect('app.db')
users = db.execute("SELECT username, email, bio FROM users").fetchall()
html = "<h1>User Report</h1>"
for u in users:
html += f"<div><b>{u[0]}</b> ({u[1]}): {u[2]}</div>"
return html
@app.route('/change-email', methods=['POST'])
def change_email():
db = sqlite3.connect('app.db')
username = session['username']
new_email = request.form['email']
db.execute(f"UPDATE users SET email='{new_email}' WHERE username='{username}'")
db.commit()
return "Email updated"
@app.route('/export')
def export():
db = sqlite3.connect('app.db')
users = db.execute("SELECT username FROM users").fetchall()
for u in users:
os.system(f"echo {u[0]} >> /tmp/export.txt")
return "Exported"
@app.route('/custom-page')
def custom_page():
db = sqlite3.connect('app.db')
user = db.execute("SELECT bio FROM users WHERE id = ?",
(session['user_id'],)).fetchone()
template = f"<h1>Your Page</h1><div>{user[0]}</div>"
return render_template_string(template)
לכל חולשה:
1. הסבירו מה סוג החולשה
2. כתבו payload לניצול
3. הראו את התוצאה הצפויה
4. כתבו תיקון
אתגר מסכם¶
תרחיש¶
מצאתם אפליקציית בלוג עם הפונקציות הבאות:
- הרשמה והתחברות
- כתיבת פוסטים עם כותרת ותוכן
- תגובות על פוסטים
- פאנל ניהול שמציג את כל הפוסטים והתגובות
- ייצוא פוסטים ל-PDF (פעולה ברקע)
- תבניות מייל מותאמות אישית
משימות¶
- מפו את כל נקודות הקלט והפלט
- מצאו לפחות 3 חולשות מסדר שני שונות
- נצלו כל אחת מהן
- שרשרו שתי חולשות לפחות יחד
- כתבו דוח עם:
- תיאור כל חולשה
- צעדי הניצול
- השפעה
- המלצות תיקון