Tìm hiểu về SQL Injection
This post hasn't been updated for 3 years
Dùng SQL Injection có thể login vào một hệ thống cho dù bạn không có user_name&password.
Nghe nguy hiểm quá nhỉ?
Vậy SQL Injection là gì mà thần bí tới vậy?
SQL Injection là gì?
- Là một kĩ thuật chèn mã nhằm phá hủy cơ sở dữ liệu của hệ thống
- Là một trong những kĩ thuật dùng để hack web nổi tiếng nhất
- Thông qua trang web SQL Injection input vào các mã nhằm tấn công câu lệnh SQL trong hệ thống để can thiệp vào cách truy vấn, phá hủy dữ liệu
SQL Injection hoạt động như thế nào?
Ví dụ dưới đây đưa ra sẽ giúp bạn hiểu về cách hoạt động của nó hơn nhé.
1. SQL Injection Based on 1=1 is Always True
Ví dụ: Trang login của web-site có 2 ô textbox: Username, Password.
Hệ thống sẽ get username, password mà người dùng input bằng câu lệnh SQL có dạng như sau:
SELECT * FROM Users WHERE Username = "username" AND Password = "password";
Nếu tài khoản login là: nguyen.thi.hang/ 12345678 thì câu lệnh SQL khi truy vấn vào hệ thống sẽ là:
SELECT * FROM Users WHERE Username = "nguyen.thi.hang" AND Password = "12345678";
Câu lệnh giúp login thành công nếu tài khoản trên tồn tại trong hệ thống, ngược lại sẽ login fail.
SQL Injection dựa trên điều kiện 1=1 luôn luôn trả về True sẽ can thiệp vào câu SQL bằng cách sau:
Thực hiện nhập trên web-site username: hackne" OR 1 = 1 ;-- password: khongbiet. Lúc này sau khi nhận được data input SQL sẽ có dạng:
SELECT * FROM Users WHERE Username = "hackne" OR 1 = 1 ;--' AND Password = "khongbiet";
Sau dấu -- hệ thống sẽ hiểu đó là comment nên chương trình sẽ không thực thi những gì chạy sau dấu --
Rút gọn được câu trên ta sẽ có
SELECT * FROM Users WHERE Username = "hackne" OR 1 = 1 ;
Điều kiện Where sẽ luôn cho kết quả là True và nó có thể pass được câu lệnh SQL trong hệ thống một cách dễ dàng để có thể login thành công
Thực hiện demo trên page https://www.hacksplaining.com/exercises/sql-injection
Mình thực hiện truyền email = hackne' or 1=1-- password = khongbiet như hình dưới
Bạn để ý câu SQL khi mình truyền email, pass vào thì câu lệnh SQL rút gọn lại chỉ còn là
SELECT * FROM users WHERE email = 'hackne' or 1=1
Và đã cho kết quả là login success
2. SQL Injection Based on ""="" is Always True
Cũng ví dụ trên. SQL Injection dựa vào điều kiện ""="" luôn luôn trả về True. Nên đã can thiệp vào Username, Password như sau:
Thực hiện nhập trên web-site username: " or ""=" password: " or ""="
Lúc này SQL sẽ có dạng:
SELECT * FROM Users WHERE Username = "" or ""="" AND Password = "" or ""="";
Điều kiện Where ở trên cũng sẽ luôn cho kết quả True nhé
3. SQL Injection Based on Batched SQL Statements
Khi run câu lệnh SQL thì có thể Run cùng 1 lúc với nhiều câu lệnh khác nhau được tách biệt bởi dấu ;
Lợi dụng điểm này mà SQL Injection đã sử dụng các ô input để chèn vào những câu lệnh SQL nguy hiểm có thể gây phá hỏng dữ liệu trong hệ thống.
Cũng trong ví dụ trên nếu ô input username: ";DROP TABLE Users;-- password: khongbiet:
Lúc này SQL sẽ có dạng:
SELECT * FROM Users WHERE Username = "";DROP TABLE Users;--" AND Password = "khongbiet";
Sau dấu -- hệ thống sẽ hiểu đó là comment nên ta có thể rút gọn được câu như sau:
SELECT * FROM Users WHERE Username = "";DROP TABLE Users;
Lúc này chương trình sẽ chạy hẳn 2 câu lệnh SQL: 1 câu dùng để select, 1 câu sẽ thực hiện loại bỏ hẳn table Users trong hệ thống.
Thật sự quá nguy hiểm khi chỉ input data trên web thôi mà đã có thể can thiệp vào hẳn DB của hệ thống rồi. Đây là một vấn đề gây ảnh hưởng rất nghiêm trọng tới khách hàng và cả uy tín của công ty phần mềm.
Đã có rất nhiều hệ thống bị ảnh hưởng bởi SQL Injection mang đến. Và hiện nay cũng đã có rất nhiều biện pháp để ngăn ngừa SQL Injection. Cùng mình tìm hiểu thêm các biện pháp qua bài sau nhé.
Bài viết tìm hiểu dựa trên https://www.w3schools.com/sql/sql_injection.asp
All Rights Reserved