Giải thích tấn công sql injection.
SQL Injection là một trong những hình thức tấn công vào website nguy hiểm nhất hiện nay. Nó gây ra những thiệt hại cho chính website của các doanh nghiệp. Vậy SQL Injection là gì? SQL Injection nguy hiểm như thế nào? Cách thức tấn công website của SQL Injection ra sao và chúng tấn công vào những đâu website? Cách nào phòng tránh và chữa lỗ hổng từ SQL Injection gây ra? Mona Media sẽ giúp bạn tìm câu trả lời cho các vấn đề trên thông qua bài viết dưới đây. Show
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 InjectionCuộc tấn công SQL Injection có thể gây ra nhiều hậu quả như:
Cách thức tấn công website của SQL InjectionNhữ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ẻ , 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ôngKẻ 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ư:
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ùngQuy 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 InjectionDù 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 đó.
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 Mona Media. 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:
|