Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
WS_RaceCondition_PoC — حجة بسيطة لإثبات حالات التسابق على Websockets | Kitploit
أدوات/GitHubGitHub/redrays-io/ws_racecondition_poc
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبأمن الويبالتعلم والتعليم
GitHubredrays-io/ws_racecondition_poc

WS_RaceCondition_PoC

حجة بسيطة لإثبات حالات التسابق على Websockets

عرض المستودع
5455منذ 3 سنواتتمت المراجعة من قبل Kitploit
الموقع الإلكتروني

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

حالات التسابق في WebSockets

في مجال تكنولوجيا المعلومات، يُعد ضمان موثوقية البيانات وسلامتها أمرًا بالغ الأهمية، خاصةً مع وجود ملايين المستخدمين وتيرابايتات من البيانات في المعادلة. ومع ذلك، مع تزايد تعقيد أنظمة البرمجيات، قد تنشأ مشكلات مثل حالات التسابق، مما يؤثر بشكل كبير على تشغيل النظام ويؤدي إلى نتائج غير متوقعة.

ما هي حالات التسابق؟

حالات التسابق هي أخطاء تحدث في البرامج متعددة المهام عندما يحاول خيطان أو عمليتان أو أكثر تعديل بيانات أو موارد مشتركة في وقت واحد دون مزامنة. يمكن أن يؤدي ذلك إلى نتائج غير متوقعة وغير قابلة للتنبؤ لأن ترتيب تنفيذ العمليات يعتمد على أي الخيوط أو العمليات تنتهي أولاً. يُعد اكتشاف حالات التسابق مشكلة صعبة في أنظمة البرمجيات نظرًا لطبيعتها غير القابلة للتنبؤ.

المصادر وقراءات إضافية:

  • "Race Condition" على ويكيبيديا
  • "Smashing the State Machine: the True Potential of Web Race Conditions" بقلم James Kettle

بينما تتوفر موارد عديدة على الإنترنت حول حالات التسابق الكلاسيكية، تستكشف هذه المقالة ما إذا كان يمكن أن تحدث حالات التسابق في WebSockets.

WebSockets

WebSockets هي تقنية متطورة تحسّن بشكل كبير التفاعل في تطبيقات الويب من خلال توفير اتصال ثنائي الاتجاه مفتوح بين متصفح الويب الخاص بالمستخدم وخادم الويب. يتيح هذا الاتصال السلس تبادل البيانات دون الحاجة إلى بدء طلبات HTTP جديدة باستمرار، مما يجعلها مثالية لإنشاء تطبيقات تفاعلية.

مزايا WebSockets:

  1. زمن استجابة منخفض: تقلل WebSockets من تأخيرات تبادل البيانات، مما يجعلها خيارًا ممتازًا للتطبيقات التي يكون فيها الوقت الفعلي مهمًا، مثل الألعاب عبر الإنترنت أو تطبيقات الدردشة.
  2. كفاءة الموارد: تدعم WebSockets اتصالاً دائمًا، مما يقلل من الحمل المرتبط بإنشاء الاتصالات وإنهائها مقارنةً بالعديد من طلبات HTTP المتتالية.
  3. تبادل بيانات ثنائي الاتجاه: يمكن لكل من العميل والخادم إرسال البيانات إلى بعضهما البعض دون انتظار طلب، مما يجعل WebSockets أداة ممتازة لإنشاء تطبيقات ويب تفاعلية.
  4. التوافق: يمكن استخدام WebSockets في لغات وتقنيات برمجة متنوعة، مما يجعلها أداة عالمية لإنشاء تطبيقات ويب تفاعلية.

لتوضيح المفهوم، تتضمن هذه المقالة كود Java يمثل خادم WebSocket يتفاعل مع قاعدة بيانات PostgreSQL. يستخدم الخادم مكتبة Java-WebSocket للتعامل مع اتصالات WebSocket وينفذ المهام التالية:

  1. بعد تشغيل البرنامج، يتصل كود Java بقاعدة البيانات ويتحقق مما إذا كان جدول "example" موجودًا. إذا لم يكن موجودًا، فإنه ينشئ الجدول ويدرج بيانات عشوائية:

    • RandomName0
    • RandomName1
    • ...
    • RandomName9
  2. يوجد الكود الأكثر إثارة للاهتمام في دالة "onMessage".

public static int a = 0;

@Override
public void onMessage(WebSocket conn, String message) {
    if (a == 0) {
        try {
            // some activity with db
            int rowCount = getCountFromExampleTable();

        } catch (SQLException e) {
            System.out.println("Error executing query: " + e.getMessage());
        }
        conn.send("Echo: " + message);
        a = a + 1;
        System.out.println(a);
    }
}

يوجد متغير عام "a" مُهيأ إلى 0. عندما يتصل عميل بالخادم ويرسل رسالة، فإنه يتحقق مما إذا كان "id == 0"، مما يشير إلى ما إذا كانت هذه الدالة قد نُفذت بالفعل. إذا لم تكن كذلك، يتم تنفيذ أمر SQL بسيط لتحديد عدد الصفوف من جدول "example". ثم يتم زيادة "a" بمقدار 1، وتُطبع قيمته. ومن الناحية النظرية، يجب ألا تُنفذ الدالة مرتين.

فيما يتعلق بالعميل، تم إنشاء نوعين من العملاء: "WebSocketParallel_Success"

package io.redrays.ws.concept.client;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class WebSocketParallel_Success {

    public static void main(String[] args) {
        // Define the WebSocket server URI
        String serverUri = "ws://127.0.0.1:8080";

        // Number of WebSocket clients to create
        int numClients = 100;

        // Create an ExecutorService to manage multiple WebSocket client threads
        ExecutorService executor = Executors.newFixedThreadPool(numClients);

        // Create a list to store WebSocket client instances
        List<WebSocketClient> clients = new ArrayList<>();

        // Loop to create and configure multiple WebSocket clients
        for (int i = 0; i < numClients; i++) {
            int clientId = i + 1;
            try {
                // Create a WebSocket client for each connection
                WebSocketClient webSocketClient = new WebSocketClient(new URI(serverUri)) {
                    @Override
                    public void onOpen(ServerHandshake handshakedata) {
                        // Handle WebSocket connection opened event
                        System.out.println("Client " + clientId + " connected to the WebSocket server");
                        this.send("Hello, WebSocket server! From client " + clientId);
                    }

                    @Override
                    public void onMessage(String message) {
                        // Handle incoming WebSocket messages
                        System.out.println("Client " + clientId + " received message: " + message);
                    }

                    @Override
                    public void onClose(int code, String reason, boolean remote) {
                        // Handle WebSocket connection closed event
                        System.out.println("Client " + clientId + " connection closed: " + reason);
                    }

                    @Override
                    public void onError(Exception ex) {
                        // Handle WebSocket error
                        System.out.println("Client " + clientId + " error occurred: " + ex.getMessage());
                    }
                };

                // Add the WebSocket client to the list
                clients.add(webSocketClient);

                // Connect the WebSocket client in a separate thread
                executor.submit(webSocketClient::connect);

            } catch (URISyntaxException e) {
                System.out.println("Invalid WebSocket server URI: " + e.getMessage());
            }
        }

        // Shutdown the executor after all tasks are submitted
        executor.shutdown();

        // Wait for all WebSocket client threads to complete
        try {
            executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException e) {
            System.out.println("Interrupted while waiting for tasks to complete: " + e.getMessage());
        }
    }
}

و "WebSocketParallel_Failed".

package io.redrays.ws.concept.client;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class WebSocketParallel_Failed {

    public static void main(String[] args) {
        String serverUri = "ws://127.0.0.1:8080"; // WebSocket server URI
        int numParallelRequests = 285; // Number of parallel WebSocket requests

        try {
            WebSocketClient webSocketClient = new WebSocketClient(new URI(serverUri)) {

                // This method is called when the WebSocket connection is successfully opened.
                @Override
                public void onOpen(ServerHandshake handshakedata) {
                    System.out.println("Connected to the WebSocket server");

                    // Create a fixed thread pool to manage parallel requests
                    ExecutorService executor = Executors.newFixedThreadPool(numParallelRequests);
تنزيل الأداة