SQL Injection là gì?
SQL Injection hay SQLi là hình thức tấn công mạng bằng việc sử dụng những lỗ hổng trong các kênh đầu vào (Input) của website để nhắm mục tiêu vào cơ sở dữ liệu trong phần phụ trợ của ứng dụng web.
Tại nơi lưu trữ những thông tin nhạy cảm và giá trị nhất của website này, kẻ tấn công sẽ ăn cắp hoặc xáo trộn dữ liệu, cản trở tới sự hoạt động của các ứng dụng. Thậm chí, ở những trường hợp xấu hơn những kẻ xấu đó có thể chiếm quyền truy cập quản trị máy chủ cơ sở dữ liệu.
Sự nguy hiểm của SQL Injection
Cuộc tấn công SQL Injection có thể gây ra nhiều hậu quả như:
- Bị hack mất tài khoản cá nhân
- Bị ăn cắp hoặc sao chép dữ liệu của hệ thống hoặc trang web
- Thay đổi dữ liệu nhạy cảm trên hệ thống hoặc website.
- Bị xóa mất những dữ liệu nhạy cảm và quan trọng.
- Người dùng có thể đăng nhập vào hệ thống với tư cách người khác, thậm chí là tư cách quản trị viên.
- Người dùng có thể xem những thông tin cá nhân của người khác (hồ sơ, chi tiết giao dịch,…).
- Người dùng có thể sửa đổi, thậm chí là xóa các thông tin/cấu trúc, các bảng trong cơ sở dữ liệu của ứng dụng.
- Người dùng có thể kiểm soát máy chủ cơ sở dữ liệu và thực thi những lệnh theo ý muốn của họ.
Cách thức tấn công website của SQL Injection
Những cuộc tấn công SQL Injection Được thực hiện thông qua việc gửi lệnh SQL độc hại đến các máy chủ cơ sở dữ liệu dựa trên các yêu cầu người dùng mà website cho phép.
Mọi kênh input nào cũng có thể được sử dụng để xâm nhập và thực hiện các lệnh độc hại, bảo gồm cả thẻ <input>, chuỗi truy vấn (query strings), cookie và tệp tin.
Giả sử: Bạn có 1 form đăng nhập có 2 input chỉ cần điền Username/Email và Password để đăng nhập.
Người dùng sẽ nhập các thông tin đăng nhập của họ vào và nhấn nút Log in (đăng nhập). Các thông tin sẽ được gửi lại cho máy chủ website và ở đó, nó sẽ được kết hợp với lệnh SQL (chẳng hạn trong PHP sẽ trông như ảnh dưới đây).
Lệnh này sẽ được gửi đến một máy chủ cơ sở dữ liệu và tập dữ liệu kết quả sẽ xác định xem tên người dùng và mật khẩu đó có tương ứng với một tài khoản người dùng hợp lệ hay không.
Ví dụ:
Người dùng đăng nhập vào bằng username 123456 làm mật khẩu thì sẽ được chuyển mã theo lệnh như sau:
Vậy điều gì sẽ xảy ra nếu người dùng quyết định thử bằng tên và mật khẩu khác?
Chẳng hạn john’ or 1=1;– kết quả sẽ như sau:
Khi đó, kết quả trả về là thông tin đăng nhập người dùng tên là “john” mà không cần mật khẩu chính xác. Đây là một hình thức tấn công SQL injection đơn giản nhất. Chỉ với vài thủ thuật, kẻ tấn công có thể thêm tài khoản mới, xóa hoặc sửa đổi các thông tin của tài khoản người dùng hiện có.
Cùng một cách tấn công, hacker có thể dùng để lấy cắp hồ sơ, thông tin người dùng nếu chúng không bị giới hạn người truy cập hay số lần thay đổi nội dung hồ sơ.
Trong những trường hợp nghiêm trọng hơn, khi truy cập vào máy chủ cơ sở dữ liệu và thực hiện thông qua tài khoản quản trị như “root” trong MySQL “sa” trong MS SQL Server, kẻ xấu có thể đi sâu vào hệ điều hành máy chủ và sử dụng những lỗ hổng SQL injection để tạo cùng lúc nhiều tài khoản người dùng trên máy chủ bị xâm nhập, kích hoạt các tính năng Remote Desktop, cài đặt các thư mục chia sẻ SMB. Ngoài việc làm rối tung mọi thứ đã được lưu trữ, kẻ tấn công có thể tải những phần mềm độc hại gây ảnh hưởng nghiêm trọng tới hệ thống.
Những phần dễ bị tấn công
Kẻ tấn công bằng SQL injection có thể xâm nhập vào website hay hệ thống bằng rất nhiều đường khác nhau. Một số phần dễ bị tấn công bạn có thể gặp như:
- Các form đăng nhập
- Các form tìm kiếm
- Các form đánh giá/nhận xét
- Các liên kết của website
- Các trường lưu hoặc trường đầu vào của dữ liệu.
Trong mọi thử nghiệm chống lại các cuộc tấn công, người thực hiện không nên chỉ kiểm tra một hoặc một vài trường bởi không phải tất cả các trường đều sẽ được bảo vệ. Do đó, khi kiểm tra bạn cần phải thực hiện đối với tất cả các trường của website.
Cách phòng tránh các cuộc tấn công SQL Injection
Đừng để tới khi bị tấn công mới đi xử lý, bạn nên chuẩn bị cho mình những cách phòng tránh tấn công SQL Injection. Dưới đây là một số cách tự vệ với các cuộc tấn công SQL injection bạn nên tham khảo:
Không tin vào input của người dùng
Quy tắc đầu tiên về input người dùng nhập chính là không tin tưởng và cần xác minh. Điều này có nghĩa là tất cả những gì người dùng nhập vào phải được coi là độc hại trừ trường hợp có bằng chứng khác.
Việc này không chỉ thực hiện cho các hộp nhập liệu đơn giản như các vùng văn bản mà còn áp dụng cho mọi thứ khác như input ẩn, chuỗi tham số truy vấn, tệp tải lên, cookie,…
Browsers của trình duyệt không cho phép người dùng thao tác với một input không có nghĩa là nó không thể giả mạo. Các công cụ đơn giản như Burp Suite cho phép người dùng chiếm được HTTP requests và thực hiện bất kỳ sửa đổi nào kể cả các giá trị dạng ẩn trước khi gửi chúng tới máy chủ. Nếu bạn nghĩa mình có thể thông minh và sử dụng Base 64 mã hóa dữ liệu thì nó vẫn có thể được giải mã, sửa đổi và mã hóa bởi kẻ tấn công giàu kinh nghiệm.
Xác nhận chuỗi input từ phía máy chủ
Việc xác nhận sẽ giúp đảm bảo giữ liệu người dùng nhập vào là hợp lệ và vô hiệu hóa bất kỳ kênh độc hại tiềm ẩn nào có thể được nhúng vào chuỗi đó.
Ví dụ: Trong PHP, bạn có thể sử dụng lệnh mysql real escape string () để thoát các ký tự có thể thay đổi bản chất của lệnh SQL. Mã đăng nhập được đề cập đến trước đó sẽ được thay đổi như ảnh dưới đây.
Những sửa đổi đơn giản này sẽ tạo bảo vệ mã khỏi các cuộc tấn công SQL injection bằng cách thêm một ký tự thoát ở phía trước dấu nháy đơn đã được kẻ tấn công thêm vào.
Việc xác nhận sẽ rất tốt nếu bạn thêm vào các chức năng xác thực cả phía máy khách. Tuy nhiên, bạn không nên dựa vào nó như một biện pháp phòng thủ chống lại các cuộc tấn công SQL injection. Mặc dù các chức năng phía máy khách có thể làm nó khó gửi dữ liệu input nguy hiểm tới máy chủ của bạn nhưng những chức năng này sẽ dễ dàng bị phá vỡ bằng các browser tweak hay các công cụ khác. Do vậy, bạn cần bổ sung thêm việc xác định cả ở phía máy chủ.
Sử dụng lệnh tham số
Một lựa chọn khác tốt hơn giúp bạn thoát khỏi những cuộc tấn công SQL injection là sử dụng câu lệnh tham số. Những câu lệnh tham số được định nghĩa bằng cách thêm tên của placeholder vào các lệnh SQL mà những thứ sau này sẽ được thay thế bởi input của người dùng.
Phân định rõ ràng các kiểu input
Đây cũng là một cách hay tránh các cuộc tấn công SQL injection dành cho các ngôn ngữ PHP khi bạn thường không định nghĩa được các kiểu dữ liệu cho biến số. Việc định nghĩa rõ ràng kiểu input sẽ giúp loại bỏ những dữ liệu có thể gây sai sót cho câu lệnh SQL. Bởi vậy, nếu bạn đang mong đợi người dùng nhập “int” cho tham số “age” thì bạn có thể đảm bảo an toàn cho input với mã $age = (int)$_POST[‘age’];.
Tuy nhiên, đoạn này chủ giúp xác nhận kiểu input chứ không phải phạm vi của bó. Bạn sẽ phải chạy mã khác để đảm bảo người dùng không nhập dữ liệu không hợp lệ. Ngoài ra, hành động tốt hơn là tránh sử dụng các dấu nháy đơn trong câu lệnh SQL khi không có string được truyền vào.
Cách diệt tận gốc các lỗ hổng SQL Injection
Dù có cài đặt bảo mật cho website ở mức cao đi nữa, bạn vẫn nên sẵn sàng tới những ngày có thể bị tấn công SQL injection. Dưới đây là một số biện pháp giúp bạn đối mặt với các trường hợp xấu nhất đó.
- Nên sử dụng những tài khoản chỉ có quyền truy cập độc – viết đơn giản để vào từng cơ sở dữ liệu riêng biệt. Trong trường hợp web bị tấn công, phạm vi thiệt hại chỉ nằm trong ranh giới cơ sở dữ liệu đó.
- Với máy chủ MS SQL, bạn nên sử dụng mô hình Windows Authentication để hạn chế quyền truy cập của hacker vào cơ sở dữ liệu nhằm đảm bảo họ không thể sử dụng các kênh khác để truy cập vào cơ sở dữ liệu của bạn.
- Mã hóa dữ liệu nhạy cảm trong cơ sở dữ liệu (bao gồm mật khẩu, các câu hỏi và câu trả lời bảo mật, dữ liệu tài chính, thông tin y tế,…). Điều này sẽ giúp kẻ tấn công không thể khai thác được thông tin ngay trước khi bạn phát hiện ra những dấu hiệu sai phạm.
- Không lưu trữ dữ liệu nhạy cảm nếu không cần tới nó sẽ là cách tốt nhất tránh tình trạng bị hack mất.
Trên đây là một số chia sẻ giải mã tất tần tật các kiến thức cơ bản về SQL injection là gì? của KhoADS. Chúng tôi sẽ cập nhật thêm nhiều kiến thức về các cuộc tấn công khác và những thông tin chuyên sâu về chúng. Bạn hãy theo dõi website của chúng tôi để tìm hiểu thêm nhé.
Xem thêm:
- Thiết kế website an toàn
- Kiến thức cần biết về tấn công từ chối dịch vụ DDoS
- Cách nhận biết và phòng tránh Phishing Email (email lừa đảo)
- Local Attack là gì? Cách phòng tránh tấn công Local Attack hiệu quả