🕵️♀️ SQL Injection là cách hacker khai thác lỗ hổng từ lập trình để tấn công vào cơ sở dữ liệu nhằm:
- Đánh cắp dữ liệu trong database
- Phá hoại cơ sở dữ liệu như thay đổi hoặc xóa dữ liệu
🕵️♀️SQL Injection dựa trên sơ hở trong lập trình khi bạn viết câu lệnh truy vấn cơ sở dữ liệu mà không có sự phòng ngừa.
🕵️♀️Ví dụ như sau: Bạn có một website cho phép đăng nhập dùng username và password. Khi người dùng nhập 2 thông tin đó thì bạn sẽ tiến hành kiểm tra thông tin xem có đúng như trong database hay không.
Đoạn code mẫu sau sẽ bị lỗi SQL Injection:
// lấy thông tin username và password gửi lên
username = request(‘username’);
password = request(‘password);
// validate với thông tin trong database:
sql = “select * from users where username = ‘“ + username + “‘ and password=’” + password “‘“;
result = executeSQL(sql);
🕵️♀️Khi đó hacker sẽ nhập vào thông tin như sau:
username = john’ or 1=1 --
password=abc
Khi đó câu lệnh sql sẽ trở thành:
select * from users where username = ‘john’ or 1=1 --’ and password=’abc’
🕵️♀️Lúc này do dấu -- được hiểu là dòng comment trong SQL nên toàn bộ đoạn lệnh sau đó sẽ không được thực thi, còn logic của việc kiểm tra username do có or 1=1 nên luôn đúng. Bằng cách này hacker có thể xâm nhập được tài khoản của người dùng John.
🕵️♀️Với cách tương tự, hacker có thể chèn thêm câu lệnh phá hoại như xóa toàn bộ dữ liệu hoặc xóa các bảng dữ liệu trong cơ sở dữ liệu như sau:
username = john’;drop table users;--
password=abc
🕵️♀️Trường hợp này câu lệnh sẽ trở thành:
select * from users where username = ‘john’ ;drop table users;--’ and password=’abc’
Và khi đó toàn bộ dữ liệu của bạn sẽ bị biến mất.
🕵️♀️Cách tránh lỗi SQL Injection:
📌1. Bạn cần kiểm tra dữ liệu nhập của người dùng để loại bỏ các ký tự không được phép: ví dụ là ‘ hay --.
📌2. Luôn luôn sử dụng câu lệnh SQL thực thi với tham số (parameter). Các ngôn ngữ lập trình đều hỗ trợ viết câu lệnh SQL với tham số, TUYỆT ĐỐI không dùng ghép chuỗi để tạo câu lệnh như bài trên.
Ví dụ:
username = request(‘username’);
password = request(‘password);
// validate với thông tin trong database:
sql = “select * from users where username = ? and password=?”;
result = executeSQL(sql, username, password);
👉BÌNH LUẬN:
📌1. Đây là một trong các ví dụ về tấn công SQL Injection. Về việc quản lý đăng nhập; cho dù bạn đã chống được SQL Injection thì việc so sánh username và password như bài vừa trình bày cũng tiềm ẩn những rủi ro về bảo mật. Mình sẽ nói ở topic khác.
📌2. Mình đã kinh nghiệm việc tấn công SQL Injection này thông qua hình thức khác tinh vi hơn: DNS lookup. Cái này được gọi là kỹ thuật OAST. Như bạn đã biết, nếu như việc kiểm tra login ở trên chỉ báo thành công hoặc không thành công, thì hacker không thể lấy được các thông tin về dữ liệu ở các table khác. Thông qua việc chèn thêm các mã độc vào trong câu truy vấn (ví dụ như chèn thêm mã độc vào username ở trên), dữ liệu sau đó được chuyển thành định dạng của DNS Lookup trên một domain mà hacker quản lý. Trên server này hacker sẽ ung dung chờ dữ liệu được bắn về. Đây là một kĩ thuật vô cùng hiệu quả và tinh vi. Đối tượng bị hại sẽ không biết rằng dữ liệu mình đã bị đánh cắp.
📌3. SQL Injection là hình thức tấn công dữ liệu đơn giản nhưng hiệu quả với hacker. Vì thế khi bạn viết phần mềm hoặc sử dụng phần mềm không rõ nguồn gốc, hãy luôn cẩn thận. Ngoài kia có hàng triệu con mắt (robot) sẵn sàng quét và dò ra lỗ hổng của bạn.
Đăng nhận xét
Cảm ơn bạn đã quan tâm và bày tỏ :D