SQL Injection (SQLi) là gì?
SQL Injection (SQLi) là một loại tấn công mà kẻ tấn công nhập câu lệnh SQL độc hại vào trường nhập liệu để thao túng cơ sở dữ liệu.
Cuộc tấn công này nhắm vào các ứng dụng không xử lý đúng cách việc xác thực, nhập liệu của người dùng, cho phép truy cập trái phép vào dữ liệu nhạy cảm như mật khẩu hoặc thông tin thẻ tín dụng, v.v.
Cách thức hoạt động của SQL Injection
Khi một ứng dụng trực tiếp bao gồm đầu vào của người dùng trong một truy vấn cơ sở dữ liệu mà không có xác thực đúng cách, kẻ tấn công có thể sửa đổi hành vi của truy vấn để nhập một câu lệnh SQL độc hại.
Ví dụ:
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
Kẻ tấn công có thể nhập:
' OR '1'='1
Dẫn đến:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Điều này luôn trả về đúng, cho phép truy cập trái phép.
Tại sao SQL Injection quan trọng trong an ninh mạng
SQL Injection là kỹ thuật nguy hiểm nhất và lâu đời nhất trong an ninh mạng. Loại tấn công này luôn được liệt kê trong OWASP Top 10.
Ngay cả những lỗ hổng nhỏ cũng cho phép kẻ tấn công:
- Truy cập, sửa đổi hoặc xóa dữ liệu
- Bỏ qua xác thực
- Thực hiện các thao tác quản trị trên cơ sở dữ liệu.
- Xâm phạm toàn bộ hệ thống.
Các Loại SQL Injection Phổ Biến
- Classic SQLi : Tiêm trực tiếp thông qua các biểu mẫu web hoặc tham số URL.
- Blind SQLi : Kẻ tấn công suy luận thông tin cơ sở dữ liệu một cách gián tiếp (ví dụ: thông qua thông báo lỗi hoặc thời gian phản hồi).
- Union-based SQLi : Sử dụng toán tử UNION để kết hợp kết quả từ nhiều truy vấn.
- Error-based SQLi : Dựa vào thông báo lỗi của cơ sở dữ liệu để trích xuất thông tin.
- Time-based Blind SQLi : Khai thác độ trễ phản hồi của máy chủ để đoán kết quả truy vấn.
Cách Ngăn Chặn SQL Injection
1. Sử Dụng Truy Vấn Tham Số Hóa (Prepared Statements)
Đảm bảo các lệnh SQL xử lý đầu vào của người dùng như dữ liệu, không phải mã thực thi.
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. Xác Thực và Làm Sạch Dữ Liệu Đầu Vào
Xác thực tất cả đầu vào từ người dùng, chỉ cho phép các ký tự mong đợi.
3. Sử Dụng Các Khung ORM
Các khung như Prisma, Hibernate, v.v., giảm thiểu việc xử lý SQL trực tiếp.
4. Nguyên Tắc Quyền Hạn Tối Thiểu
Giới hạn quyền của người dùng, chỉ cấp quyền cần thiết.
5. Kiểm Tra Bảo Mật Thường Xuyên
Sử dụng các công cụ kiểm tra bảo mật ứng dụng như SAST, DAST hoặc IAST để phát hiện các lỗi tiêm nhiễm sớm.
Ví dụ trong Thế giới Thực
Một trang web cửa hàng trực tuyến đã bị xâm nhập khi kẻ tấn công sử dụng một lỗi tiêm nhiễm SQL trong biểu mẫu đăng nhập để trích xuất thông tin thẻ tín dụng từ cơ sở dữ liệu của nó.