תקיפת WebSockets - תרגיל¶
תרגיל 1: ניתוח handshake¶
נתונה בקשת handshake הבאה:
GET /live-chat HTTP/1.1
Host: vulnerable-store.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13
Origin: https://vulnerable-store.com
Cookie: session=eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiY2FybG9zIn0.abc123
א. אילו נתונים נשלחים עם ה-handshake שיכולים להיות מנוצלים ל-CSWSH?¶
ב. אם השרת לא בודק Origin, כתבו בקשת handshake שתוקף יכול ליצור מדף שלו.¶
ג. מה הם Sec-WebSocket-Key ו-Sec-WebSocket-Accept? האם הם מספקים אבטחה?¶
תרגיל 2: חטיפת WebSocket בין אתרים - CSWSH¶
שרת הצ'אט באתר https://chat.example.com משתמש ב-WebSocket:
// הלקוח
let ws = new WebSocket('wss://chat.example.com/ws');
ws.onopen = function() {
ws.send(JSON.stringify({ type: 'getHistory', limit: 50 }));
};
ws.onmessage = function(event) {
let data = JSON.parse(event.data);
displayMessage(data);
};
א. כתבו דף HTML מלא שמבצע CSWSH וגונב את היסטוריית הצ'אט.¶
ב. כתבו דף HTML שמבצע CSWSH ושולח הודעות בשם הקורבן.¶
ג. כתבו דף HTML שמאזין להודעות חדשות בזמן אמת ומעביר אותן לשרת התוקף.¶
תרגיל 3: XSS דרך WebSocket¶
האתר מציג הודעות צ'אט כך:
ws.onmessage = function(event) {
let data = JSON.parse(event.data);
if (data.type === 'message') {
let chatDiv = document.getElementById('chat');
chatDiv.innerHTML += '<div class="msg"><b>' + data.username + ':</b> ' + data.text + '</div>';
}
};
א. כתבו הודעת WebSocket שתבצע XSS.¶
ב. כתבו הודעה שתגנוב cookies ותשלח לשרת התוקף.¶
ג. כתבו הודעה שתשנה את ה-DOM ותוסיף טופס login מזויף.¶
תרגיל 4: מניפולציה של הודעות¶
אתר מסחר אלקטרוני משתמש ב-WebSocket לעדכוני מחירים בזמן אמת:
// שרת
ws.on('message', function(message) {
let data = JSON.parse(message);
if (data.type === 'placeOrder') {
let product = db.getProduct(data.productId);
let order = {
userId: ws.user.id,
productId: data.productId,
quantity: data.quantity,
price: data.price, // המחיר מגיע מהלקוח!
total: data.quantity * data.price
};
db.createOrder(order);
ws.send(JSON.stringify({ type: 'orderConfirmed', orderId: order.id }));
}
});
א. מה הבעיה בקוד?¶
ב. כתבו הודעת WebSocket שמנצלת את החולשה.¶
ג. כתבו תיקון לקוד השרת.¶
תרגיל 5: מעבדות PortSwigger¶
מעבדה 1: מניפולציה של הודעות WebSocket¶
- כתובת: Manipulating WebSocket messages to exploit vulnerabilities
- רמה: Apprentice
- משימה: הזריקו XSS דרך הודעת WebSocket בצ'אט חי
מעבדה 2: חטיפת WebSocket בין אתרים¶
- כתובת: Cross-site WebSocket hijacking
- רמה: Practitioner
- משימה: השתמשו ב-CSWSH כדי לגנוב את היסטוריית הצ'אט של קורבן ולמצוא בה סיסמה
מעבדה 3: XSS דרך WebSocket עם sanitization¶
- כתובת: Manipulating the WebSocket handshake to exploit vulnerabilities
- רמה: Practitioner
- משימה: עקפו WAF שחוסם XSS דרך WebSocket
תרגיל 6: כתיבת כלי ניטור¶
כתבו סקריפט JavaScript שרץ ב-DevTools Console ומבצע:
- עוטף את
WebSocketconstructor כדי ליירט יצירת חיבורים חדשים - עוטף את
sendכדי לתעד הודעות יוצאות - עוטף את
onmessageכדי לתעד הודעות נכנסות - מתעד open/close/error events
- שומר את כל התעבורה במערך גלובלי
// השלימו את הקוד
(function() {
let log = [];
window.__wsLog = log;
let OriginalWebSocket = window.WebSocket;
window.WebSocket = function(url, protocols) {
console.log('[WS] New connection to:', url);
// השלימו...
};
// שמרו על prototype
window.WebSocket.prototype = OriginalWebSocket.prototype;
})();
תרגיל 7: אבטחת שרת WebSocket¶
כתבו שרת WebSocket מאובטח עם Node.js שכולל:
- ולידציית Origin
- אימות עם JWT
- הרשאות ברמת פעולה
- rate limiting
- ולידציית מבנה הודעות
- sanitization לפני שידור
const WebSocket = require('ws');
const jwt = require('jsonwebtoken');
// השלימו את הקוד
function createSecureWebSocketServer(httpServer, config) {
const wss = new WebSocket.Server({
server: httpServer,
verifyClient: function(info) {
// השלימו - ולידציית origin
}
});
wss.on('connection', function(ws, req) {
// השלימו - אימות, הרשאות, rate limiting
});
return wss;
}