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 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 liên tục đượ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
- Vượt 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 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 gián tiếp (ví dụ, 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 có tham số (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. Kiểm tra và làm sạch đầu vào
Kiểm tra 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 framework ORM
Các framework 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 tối thiểu
Giới hạn quyền 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ỗ hổng 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ỗ hổng 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ó.
Thuật ngữ Liên quan
- XSS (Cross-Site Scripting)
- DAST (Dynamic Application Security Testing)
- OWASP Top 10
- Kiểm tra Bảo mật Ứng dụng