לדלג לתוכן

תקיפת 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:

// the client
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 לעדכוני מחירים בזמן אמת:

// server
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, // the price comes from the client!
      total: data.quantity * data.price
    };
    db.createOrder(order);
    ws.send(JSON.stringify({ type: 'orderConfirmed', orderId: order.id }));
  }
});

א. מה הבעיה בקוד?

ב. כתבו הודעת WebSocket שמנצלת את החולשה.

ג. כתבו תיקון לקוד השרת.


תרגיל 5: מעבדות PortSwigger

מעבדה 1: מניפולציה של הודעות WebSocket

מעבדה 2: חטיפת WebSocket בין אתרים

  • כתובת: Cross-site WebSocket hijacking
  • רמה: Practitioner
  • משימה: השתמשו ב-CSWSH כדי לגנוב את היסטוריית הצ'אט של קורבן ולמצוא בה סיסמה

מעבדה 3: XSS דרך WebSocket עם sanitization


תרגיל 6: כתיבת כלי ניטור

כתבו סקריפט JavaScript שרץ ב-DevTools Console ומבצע:

  1. עוטף את WebSocket constructor כדי ליירט יצירת חיבורים חדשים
  2. עוטף את send כדי לתעד הודעות יוצאות
  3. עוטף את onmessage כדי לתעד הודעות נכנסות
  4. מתעד open/close/error events
  5. שומר את כל התעבורה במערך גלובלי
// complete the code
(function() {
  let log = [];
  window.__wsLog = log;

  let OriginalWebSocket = window.WebSocket;

  window.WebSocket = function(url, protocols) {
    console.log('[WS] New connection to:', url);
    // complete this...
  };

  // preserve the prototype
  window.WebSocket.prototype = OriginalWebSocket.prototype;
})();

תרגיל 7: אבטחת שרת WebSocket

כתבו שרת WebSocket מאובטח עם Node.js שכולל:

  1. ולידציית Origin
  2. אימות עם JWT
  3. הרשאות ברמת פעולה
  4. rate limiting
  5. ולידציית מבנה הודעות
  6. sanitization לפני שידור
const WebSocket = require('ws');
const jwt = require('jsonwebtoken');

// complete the code
function createSecureWebSocketServer(httpServer, config) {
  const wss = new WebSocket.Server({
    server: httpServer,
    verifyClient: function(info) {
      // complete this - origin validation
    }
  });

  wss.on('connection', function(ws, req) {
    // complete this - authentication, permissions, rate limiting
  });

  return wss;
}