Dữ liệu là một trong những thành phần quan trọng nhất của hệ thống thông tin. Các ứng dụng web hỗ trợ cơ sở dữ liệu được tổ chức sử dụng để lấy dữ liệu từ khách hàng. SQL là viết tắt của Structured Query Language(Ngôn ngữ truy vấn có cấu trúc). Nó được sử dụng để truy xuất và thao tác dữ liệu trong cơ sở dữ liệu.
SQL Injection là gì?
SQL Injection là một cuộc tấn công đầu độc các câu lệnh SQL động để comment ra các phần nhất định của câu lệnh hoặc bổ sung một điều kiện sẽ luôn đúng. Nó lợi dụng các lỗ hổng thiết kế trong các ứng dụng web được thiết kế kém để khai thác các câu lệnh SQL để thực thi mã SQL độc hại.
Cách hoạt động của SQL Injection
Các loại tấn công có thể được thực hiện bằng cách sử dụng SQL Injection khác nhau tùy thuộc vào loại công cụ cơ sở dữ liệu. Cuộc tấn công hoạt động trên các câu lệnh SQL động. Câu lệnh SQL động là một câu lệnh được tạo tại thời điểm chạy bằng cách sử dụng mật khẩu tham số từ biểu mẫu web hoặc chuỗi truy vấn URI.
Hãy xem xét một source code web đơn giản với một trang đăng nhập:
- Biểu mẫu trên chấp nhận địa chỉ email và mật khẩu, sau đó chúng gửi vào tệp PHP có tên là index.php.
- Nó có 1 tùy chọn lưu trữ phiên đăng nhập trong cookie. Chúng ta suy luận điều này từ hộp checkbox remember_me. Nó sử dụng phương pháp post method để submit data. Điều này có nghĩa là các giá trị không được hiển thị trên URL.
Giả sử câu lệnh truy vấn kiểm tra ID người dùng như sau:
SELECT * FROM users WHERE email = $_POST[‘email’] AND password = md5($_POST[‘password’]);
- Câu lệnh trên sử dụng trực tiếp các giá trị của mạng $_POST [] mà không cần xóa chúng
- Mật khẩu được mã hóa bằng thuật toán MD5.
Mình sẽ minh họa cuộc tấn công SQL Injection bằng cách sử dụng sqlfiddle. Mở URL sqlfiddle.com trên trình duyệt của bạn.
Nhập các câu lệnh và thực hiện các bước như sau:
Code tạo Table:
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(45) NULL,
password VARCHAR(45) NULL,
PRIMARY KEY (id));
insert into users (email,password) values ('m@m.com',md5('abc'));
Giả sử người dùng có địa chỉ email là : admin@admin.sys và mật khẩu là 1234. Câu lệnh được thực hiện sẽ là:
SELECT * FROM users WHERE email='admin@admin.sys' AND passwod=md5('1234');
Đoạn mã trên có thể được khai thác bằng cách comment vào phần mật khẩu và thêm vào 1 điều kiện luôn đúng. Giả sử kẻ tấn công cung cấp thông tin input trong địa chỉ email như sau:
xxx@xxx.xxx OR 1 = 1 LIMIT 1 -- ']
Câu lệnh sẽ được tạo như sau:
SELECT * FROM users WHERE email='xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- '] AND password = md5('1234')
- OR 1 = 1 LIMIT 1 -- ']là điều kiện luôn đúng và giới hạn kết quả trả về chỉ trong 1 bản ghi.
- AND… là một chú thích SQL loại bỏ phần mật khẩu.
Sao chép câu lệnh SQL ở trên và dán nó vào SQL FiddleRUN SQL sẽ được kết quả như hình.
Hoạt động lấy cắp dữ liệu : SQL Inject ứng dụng Web
Mình lấy một ứng dụng web đơn giản tại : techpanda.org. Đây là một ứng cho trang đăng nhập. Trang này cun cấp bảo mật cơ bản như đăng nhập từ email và mật khẩu.
Giả sử kẻ tấn công đăng nhập thông tin như sau:
- Email : Nhập xxx@xxx.xxx làm địa chỉ email
- Password: Nhập xxx') OR 1 = 1 -- ]
Click Submit > Bạn sẽ được chuyển đến trang index.php
Câu lệnh truy vấn SQL như sau:
SELECT * FROM user WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
Sơ đồ dưới đây giải thích về câu lệnh đã được thực hiện:
Nói chung, một cuộc tấn công SQL Injection thành công sẽ cố gắng thực hiện một số kỹ thuật khác nhau, chẳng hạn như các kỹ thuật mình đã nói ở trên để thực hiện một cuộc tấn công thành công.
Các kiểu tấn công SQL Injection khác
SQL Injection có thể gây hại nhiều hơn là chỉ chuyển các thuật toán đăng nhập. Một số cuộc tấn công bao gồm như :
- Xóa dữ liệu
- Cập nhật dữ liệu
- Chèn dữ liệu
- Thực thi các lệnh trên máy chủ có thể tải xuống và cài đặt các chương trình độc hại như Trojan.
- Xuất dữ liệu có giá trị như thẻ tín dụng,email,mật khẩu.v.v.
- Lấy chi tiết đăng nhập của người dùng,v.v
Một số Tools tự động SQL Injection
Trong ví dụ trên, mình đã sử dụng các kỹ thuật tấn công thủ công dựa trên kiến thức. Có những công cụ tự động có thể thực hiện các cuộc tấn công hiệu quả hơn và trong thời gian ngắn nhất có thể như:
- SQLSmack
- SQLMap
Cách ngăn chặn các cuộc tấn công SQL Injection
Một tổ chức có thể áp dụng các chính sách sau để tự bảo vệ mình khỏi các cuộc tấn công SQL Injection
- Input của người dùng không bao giờ được tin cậy: Nó phải luôn được làm sạch trước khi được sử dụng trong các câu lệnh SQL động.
- Stored Procedures: những store có thể đóng gói các câu lệnh SQL và coi tất đầu vào là các tham số.
- Quyền truy cập của người dùng kết nối cơ sở dữ liệu: chỉ những quyền truy cập cần thiết nên được cấp cho các tài khoản được sử dụng để kết nối cơ sở dữ liệu. Điều này có thể giúp giảm những gì các câu lệnh SQL có thể thực hiện trên máy chủ.
- Thông báo lỗi: Những thông báo này không được tiết lộ thông tin nhạy cảm và chính xác nơi xảy ra lỗi.
Thực tế : Sử dụng Havij cho SQL Injection
Trong tình huống thực tế, chúng tôi sẽ sử dụng chương trình Haviji Advanced SQL Injection để quét các lỗ hổng bảo mật trên trang web.
TÓM LƯỢC
- SQL Injection là một kiểu tấn công khai thác các câu lệnh SQL xấu.
- SQL Injection có thể được sử dụng để bỏ qua các thuật toán đăng nhập, truy xuất, chèn, cập nhật,và xóa dữ liệu.
- Một số tool SQL Injection như SQLMap, SQLPing và SQLSmack,v.v.
- Một chính sách bảo mật tốt khi viết câu lệnh SQL có thể giúp giảm các cuộc tấn công SQL Injection.
Cộng Đồng