Error Based SQL Injection là gì? 5 Biện pháp phòng ngừa

Error Based SQL Injection là gì? Tìm hiểu về cách thức khai thác lỗ hổng, các biện pháp bảo vệ website của bạn hiệu quả.

Error Based SQL Injection là gì? 5 Biện pháp phòng ngừa

Error Based SQL Injection là gì? 5 Biện pháp phòng ngừaLink to heading

Error Based SQL Injection - một trong những kỹ thuật tấn công phổ biến nguy hiểm nhất, đặc biệt đối với các hệ thống website không được lập trình an toàn. Kẻ tấn công lợi dụng thông báo lỗi từ cơ sở dữ liệu để truy xuất thông tin quan trọng như tên bảng, cột dữ liệu, thậm chí là tài khoản admin. Nếu bạn đang vận hành website mà chưa từng kiểm tra khả năng bị tấn công SQL Injection, thì rất có thể lỗ hổng đang âm thầm tồn tại mà bạn không hề hay biết. 

Trong bài viết này, chúng ta sẽ cùng tìm hiểu Error Based SQL Injection là gì, cách nhận biết, khai thác và quan trọng nhất là cách phòng tránh hiệu quả để bảo vệ website và dữ liệu khách hàng của bạn.

Error Based SQL Injection là gì?Link to heading

Error Based SQL Injection là một kỹ thuật tấn công In-band Injection cho phép kẻ tấn công lợi dụng thông báo lỗi từ cơ sở dữ liệu để thao túng và truy xuất thông tin bên trong. Bằng cách cố tình tạo ra lỗi, hacker buộc hệ thống hiển thị thông tin chi tiết về cấu trúc cơ sở dữ liệu mà lẽ ra không nên được tiết lộ.

Kỹ thuật In-band Injection giúp kẻ tấn công sử dụng cùng một kênh giao tiếp để vừa gửi yêu cầu tấn công, vừa nhận phản hồi dữ liệu. Cách khai thác này dựa vào một lỗ hổng cho phép thực thi mã độc hại, nhằm làm cho hệ thống trả về lỗi SQL thay vì dữ liệu thông thường. Dựa vào các thông báo lỗi này, hacker có thể phân tích và nắm bắt toàn bộ cấu trúc của hệ quản trị cơ sở dữ liệu mục tiêu.

>>> Có thể bạn quan tâm: SQL Injection là gì? Dấu hiệu nhận biết và cách khắc phục

Cách thức khai thác Error Based SQL InjectionLink to heading

Thêm cú pháp SQL vào dữ liệu người dùng nhập vàoLink to heading

Trong Error-based SQL Injection, kẻ tấn công cố gắng chèn một truy vấn độc hại với mục đích nhận được thông báo lỗi chứa thông tin nhạy cảm về cơ sở dữ liệu.

Hacker có thể thử bất kỳ loại câu lệnh SQL nào vào trường nhập liệu — chẳng hạn như dấu nháy đơn ('), dấu nháy kép ("), hoặc các toán tử SQL như:

AND, OR, NOT.

Ví dụ dưới đây minh họa một URL chấp nhận tham số từ người dùng, trong trường hợp này là item:

https://example.com/index.php?item=123

Kẻ tấn công có thể thử thêm một dấu nháy đơn vào cuối giá trị tham số:

https://example.com/index.php?name=123’

Nếu cơ sở dữ liệu trả về một thông báo lỗi như sau, cuộc tấn công đã thành công:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘‘VALUE’’

Thông báo lỗi này cung cấp cho kẻ tấn công:

  • Thông tin về loại cơ sở dữ liệu đang sử dụng — MySQL
  • Cú pháp cụ thể gây ra lỗi — dấu nháy đơn '
  • Vị trí xảy ra lỗi cú pháp trong truy vấn — ngay sau giá trị tham số

Đối với một hacker có kinh nghiệm, chừng đó là đủ để xác định rằng máy chủ đang kết nối với cơ sở dữ liệu một cách không an toàn, từ đó lên kế hoạch cho các cuộc tấn công SQL Injection nguy hiểm hơn.

Ngoài ra, kẻ tấn công cũng có thể tự động hóa quá trình này bằng cách sử dụng các lệnh như:

grep extract

nhằm thử hàng loạt cú pháp SQL khác nhau vào các tham số đầu vào và xem cú pháp nào trả về lỗi.

Thực thi truy vấn riêng cho hệ quản trị cơ sở dữ liệuLink to heading

Nếu kẻ tấn công Error Based SQL Injection biết được nhà cung cấp và phiên bản của hệ quản trị cơ sở dữ liệu (DBMS), họ có thể sử dụng các kỹ thuật nâng cao hơn. Bằng cách sử dụng các truy vấn đặc thù của từng loại cơ sở dữ liệu, họ có thể trích xuất dữ liệu cụ thể để lên kế hoạch cho những cuộc tấn công tiếp theo.

Hãy xét lại ví dụ với URL trước đó, nhưng lần này kẻ tấn công biết rằng hệ thống đang sử dụng Oracle 10g. Họ có thể đưa một giá trị tham số như sau:

https://example.com/index.php?item=123||UTL_INADDR.GET_HOST_NAME( (SELECT user FROM DUAL) )--

Ở đây, kẻ tấn công đã nối thêm một truy vấn đặc biệt vào giá trị tham số. Truy vấn này kết hợp hai thành phần:

  • Hàm UTL_INADDR.GET_HOST_NAME(), được dùng để trả về tên máy chủ (hostname) trên cơ sở dữ liệu Oracle 10g.
  • Câu lệnh SQL SELECT user FROM DUAL. Bảng DUAL là một bảng đặc biệt tồn tại trong mọi hệ thống Oracle và thường dùng để thực hiện các phép tính hoặc truy vấn đơn giản.

Sự kết hợp này sẽ gây ra lỗi vì tên máy chủ không khớp với bất kỳ tên người dùng nào được trả về từ bảng DUAL. Lỗi có thể xuất hiện như sau:

ORA-292257: host DAVID unknown

Ngay khi kẻ tấn công nhận được thông báo lỗi này, họ có thể tiếp tục thử truyền nhiều giá trị khác nhau vào tham số đầu vào.

Sau đó, chúng có thể thao túng tham số được truyền vào hàm:

GET_HOST_NAME()

để tìm ra tên người dùng, dữ liệu từ các bảng khác hoặc thậm chí là đoán tên máy chủ cơ sở dữ liệu.

Một biến thể khác của kiểu tấn công này là thử nhiều truy vấn đặc biệt khác nhau tương ứng với từng loại hệ quản trị cơ sở dữ liệu và xem truy vấn nào "trúng đích" — điều này giúp kẻ tấn công xác định được website đang sử dụng loại cơ sở dữ liệu nào.

Tác hại của Error Based SQL InjectionLink to heading

Rò rỉ thông tin cơ sở dữ liệuLink to heading

Error Based SQL Injection cho phép kẻ tấn công khai thác các thông báo lỗi từ cơ sở dữ liệu để thu thập thông tin nhạy cảm về cấu trúc database. Qua đó, hacker có thể biết được tên bảng, tên cột, kiểu dữ liệu và các thông tin cấu hình quan trọng khác. Việc rò rỉ này gây nguy hiểm nghiêm trọng vì tạo điều kiện thuận lợi để thực hiện các cuộc tấn công sâu hơn, dẫn đến lộ lọt dữ liệu người dùng, tài khoản hoặc bí mật doanh nghiệp.

Mất quyền kiểm soátLink to heading

Khi đã biết cấu trúc cơ sở dữ liệu, hacker có thể chèn thêm các truy vấn độc hại nhằm thay đổi dữ liệu, thêm tài khoản quản trị mới hoặc xóa dữ liệu quan trọng. Từ đó, họ có thể chiếm quyền điều khiển backend của hệ thống, làm gián đoạn dịch vụ hoặc sử dụng server làm bàn đạp cho các cuộc tấn công khác như phát tán malware, tấn công DDoS hoặc xâm nhập hệ thống mạng nội bộ.

Nguy cơ bị tấn công liên chuỗiLink to heading

Error Based SQLi không chỉ gây ra thiệt hại trực tiếp mà còn có thể mở cửa cho các cuộc tấn công liên chuỗi nơi kẻ tấn công tận dụng lỗ hổng này để leo thang quyền hạn, kết hợp với các lỗ hổng khác trong hệ thống nhằm gây hậu quả nghiêm trọng hơn như truy cập trái phép vào các hệ thống nội bộ, đánh cắp thông tin tài chính, hoặc phá hoại toàn bộ hạ tầng mạng.

Các biện pháp phòng ngừa Error Based SQL InjectionLink to heading

Prepared StatementsLink to heading

Sử dụng prepared statements (câu lệnh đã chuẩn bị sẵn) với biến ràng buộc (variable bindings) là cách an toàn nhất để viết truy vấn cơ sở dữ liệu. Phương pháp này cũng dễ lập trình hơn so với truy vấn động.

Trong một truy vấn có tham số, lập trình viên phải định nghĩa trước toàn bộ câu lệnh SQL và sau đó truyền từng tham số vào câu truy vấn. Điều này giúp tách biệt giữa mã chương trình và dữ liệu, bất kể người dùng nhập gì, nhờ đó gần như loại bỏ hoàn toàn khả năng bị tấn công SQL Injection. Prepared statements ngăn không cho kẻ tấn công thay đổi mục đích của câu truy vấn, ngay cả khi họ chèn lệnh SQL độc hại vào dữ liệu đầu vào.

Trong một số trường hợp hiếm gặp, prepared statements có thể làm giảm hiệu suất hệ thống. Nếu gặp vấn đề về hiệu năng, bạn có thể cân nhắc các phương pháp phòng chống Error Based SQL Injection khác bên dưới, tuy nhiên hãy lưu ý rằng chúng kém an toàn hơn.

Stored ProceduresLink to heading

Stored procedures cũng là một phương pháp hiệu quả để ngăn chặn SQL Injection. Khi được sử dụng đúng cách, stored procedures có thể loại bỏ hoàn toàn lỗ hổng SQL Injection.

Stored procedures yêu cầu lập trình viên viết các câu lệnh SQL được hệ quản trị cơ sở dữ liệu tự động tham số hóa.

Điểm khác biệt giữa prepared statements và stored procedures là:

Với prepared statements, câu lệnh SQL được định nghĩa trong ứng dụng. Với stored procedures, câu lệnh SQL được lưu trữ trong cơ sở dữ liệu và ứng dụng sẽ gọi thủ tục đó để sử dụng.

Nguyên tắc quyền truy cập tối thiểuLink to heading

Để phòng chống Error Based SQL Injection, ứng dụng chỉ nên cho phép mỗi tiến trình hoặc thành phần phần mềm truy cập và thao tác trên những tài nguyên cần thiết.

Hãy cấp quyền dựa trên nhu cầu thực tế — ví dụ:

  • Nếu ứng dụng chỉ cần đọc dữ liệu từ cơ sở dữ liệu, thì không nên cấp quyền ghi hoặc xóa.
  • Nếu ứng dụng không cần tạo bảng, xóa bảng hay chỉnh sửa cấu trúc bảng trong lúc chạy, thì cũng không nên cấp quyền DDL (Data Definition Language).

Phần lớn ứng dụng không thay đổi cấu trúc cơ sở dữ liệu trong quá trình hoạt động, các thao tác như tạo bảng, xóa bảng hay chỉnh sửa cột thường chỉ thực hiện trong giai đoạn triển khai.

Do đó, tốt nhất là giới hạn quyền truy cập của ứng dụng trong thời gian chạy, chỉ cho phép truy vấn và chỉnh sửa dữ liệu cần thiết, nhưng không được phép thay đổi cấu trúc bảng. Với cơ sở dữ liệu SQL, điều này có nghĩa là tài khoản dịch vụ của ứng dụng chỉ nên được phép thực hiện câu lệnh DML (Data Manipulation Language), không phải DDL.

Xác thực đầu vào theo danh sách cho phépLink to heading

Một số phần trong truy vấn SQL không hỗ trợ biến ràng buộc — ví dụ: tên bảng, tên cột, hoặc thứ tự sắp xếp như ASC hoặc DESC. Trong trường hợp này, bạn cần sử dụng xác thực đầu vào hoặc thiết kế lại truy vấn để ngăn chặn các giá trị không hợp lệ.

Khi sử dụng tên bảng hoặc tên cột, các giá trị này nên được định nghĩa trong mã chứ không nên lấy từ đầu vào người dùng.

Nếu bạn phải lấy giá trị từ người dùng để xác định tên bảng hoặc cột, hãy ánh xạ các giá trị đó với danh sách cho phép chứa những tên hợp lệ, được xác định trước. Điều này sẽ ngăn ngừa người dùng nhập dữ liệu bất ngờ hoặc độc hại.

Lưu ý: Bên cạnh việc phòng chống Error Based SQL Injection, bạn cũng nên thiết lập lịch kiểm tra mã độc định kỳ để đảm bảo website luôn hoạt động ổn định, không bị chèn mã độc, script lạ hoặc truy vấn SQL bất thường. Nếu bạn chưa có công cụ phù hợp, hãy thử ngay trình quét mã độc website miễn phí của System443.

Kết luậnLink to heading

Tấn công Error Based SQL Injection có thể diễn ra âm thầm nhưng để lại hậu quả vô cùng nghiêm trọng, từ rò rỉ dữ liệu đến mất quyền kiểm soát hệ thống. Vì vậy, việc nhận biết, phòng tránh và kiểm tra định kỳ các lỗ hổng bảo mật liên quan đến Error Based SQL Injection là điều bắt buộc đối với mọi hệ thống web nào. Hãy chủ động bảo vệ website của bạn bằng cách áp dụng ngay các biện pháp phòng chống được System443 đề xuất!

Bạn muốn tìm hiểu thêm về các lỗ hổng bảo mật nguy hiểm khác như Blind SQL Injection, Union SQL Injection,... trên website? Hãy xem ngay các bài viết chuyên sâu trên Blog của System443!

Contact background

Bạn muốn nhận tư vấn về các dịch vụ của System443

Đội ngũ chuyên gia giàu kinh nghiệm của chúng tôi luôn sẵn sàng hỗ trợ bạn!

Mascot contact
Contact now