זיהום פרמטרים - 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
- לכל פלטפורמה, תעדו: האם לוקח ראשון, אחרון, או שניהם?
- בדקו גם עם POST (שנו את Content-Type בהתאם)
- בדקו מה קורה עם שלושה ערכים:
q=A&q=B&q=C
תרגיל 2 - עקיפת WAF עם HPP ב-PHP¶
סביבת ה-PHP עם ModSecurity חוסמת SQLi.
משימה:
1. שלחו את הבקשה הבאה וודאו שנחסמת:
2. נצלו את העובדה ש-PHP לוקח את הערך האחרון:
3. מצאו שילוב של ערכים כפולים שעוקף את ה-WAF
4. שלבו HPP עם קידוד URL חלקי להגברת ההצלחה
תרגיל 3 - ניצול שרשור ASP.NET¶
ב-ASP.NET, פרמטרים כפולים משורשרים עם פסיק.
משימה:
1. בנו מטען SQLi שמפוצל לפרמטרים כפולים כך שהפסיקים יפלו בתוך הערות SQL:
השרשור צריך להיות:
1'/*,*/UNION/*,*/SELECT/*,*/1--2. בנו מטען XSS מפוצל שעובד למרות הפסיקים
3. בנו מטען שמנצל את הפסיק כחלק מהתחביר (למשל, ב-SQL הפסיק מפריד עמודות)
תרגיל 4 - HPP בגוף JSON¶
משימה:
אפליקציה שמקבלת JSON:
- שלחו JSON עם מפתח כפול:
- בדקו: איזה ערך הפרסר לוקח?
- נסו גם עם מפתח
role:
- בדקו האם ה-WAF חוסם את הבקשה
תרגיל 5 - HPP משולב GET ו-POST¶
משימה:
שלחו בקשה שמכילה את אותו פרמטר גם ב-URL וגם בגוף:
- בדקו בכל פלטפורמה: איזה ערך גובר?
- נסו לנצל את ההבדל לעקיפת הרשאות
- מצאו תרחיש שבו ה-WAF בודק את פרמטר ה-GET, אבל השרת משתמש בפרמטר ה-POST
תרגיל 6 - HPP בעוגיות¶
משימה:
- בדקו: איזו עוגייה השרת לוקח?
- בנו תרחיש עקיפה שבו ה-WAF מפרסר את העוגייה הראשונה, אבל השרת לוקח את האחרונה
- נסו גם עם:
(ללא רווח אחרי הנקודה-פסיק)
תרגיל 7 - אתגר מסכם¶
שרת PHP עם ModSecurity CRS ברמת פרנויה 2. נקודת הזרקה:
הפרמטר filter מוזרק ישירות לשאילתת SQL:
משימה:
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")
- תעדו: אילו שילובים של HPP + קידוד הצליחו לעקוף, ואילו נחסמו