Cơ chế tấn công SQL Injection
Show Trang chủ • Blog • SQL injection là gì? Nguy hiểm đến mức nào và làm sao để phòng tránh? CyStack Editor 3 Th04 2018
Trong tất cả các cuộc tấn công nhằm vào website, tấn công SQL Injection là một trong những loại nguy hiểm và phổ biến nhất, nó đã gây ra những thiệt hại đáng kể cho nhiều doanh nghiệp và tổ chức trong những năm qua. SQL injection – còn được gọi là SQLi – 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 nằm trong phần phụ trợ của ứng dụng web, nơi lưu giữ những thông tin nhạy cảm và có giá trị nhất. Chúng có thể được kẻ tấn công sử dụng để ăn cắp hoặc xáo trộn dữ liệu, cản trở sự hoạt động của các ứng dụng, và, trong trường hợp xấu nhất, nó có thể chiếm được quyền truy cập quản trị vào máy chủ cơ sở dữ liệu. Dưới đây là những gì bạn cần biết về tấn công SQL Injection và cách bảo vệ website của bạn khỏi chúng. Cách thức website bị tấn công SQL InjectionCác cuộc tấn công SQL Injection được thực hiện bằng cách gửi lệnh SQL độc hại đến các máy chủ cơ sở dữ liệu thông qua các yêu cầu của người dùng mà website cho phép. Bất kỳ kênh input nào cũng có thể được sử dụng để gửi các lệnh độc hại, bao gồm các thẻ, chuỗi truy vấn (query strings), cookie và tệp tin. Để xem cách nó hoạt động, giả sử bạn có một form đăng nhập có 2 input username và password như dưới đây: Form đăng nhập gồm 2 input username và password.Khi người dùng nhập thông tin đăng nhập của họ và nhấn vào nút “log in”, thông tin sẽ được gửi lại cho máy chủ web của bạn, ở đó nó sẽ được kết hợp với một lệnh SQL. Ví dụ, trong PHP, mã sẽ giống như sau: $sql_command="select * from users where username = '".$_POST['username']; $sql_command.="' AND password = '".$_POST['password']."'";Lệnh này sau đó 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 username và password 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 nhập “john” làm username và “123456” làm password (đừng bao giờ sử dụng mật khẩu này) sẽ chuyển mã trên thành lệnh sau: SELECT * FROM users WHERE username='john' AND password='123456'Nhưng điều gì sẽ xảy ra nếu người dùng quyết định thử cái khác, chẳng hạn như sau: Lệnh kết quả sẽ là như sau: SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456'Kết quả trả về là thông tin đăng nhập của người dùng có tên là “john” mà không cần mật khẩu chính xác. Làm sao để tự vệ với các cuộc tấn công SQL Injection?Với vectơ chính cho các cuộc tấn công SQL Injection là các kênh input của người dùng, hầu hết các phương pháp phòng đều thủ liên quan đến kiểm soát input của người dùng Đừng bao giờ tin tưởng vào input của người dùngQuy tắc đầu tiên về input mà người dùng nhập là “don’t trust and verify” (không tin tưởng và cần xác minh”), 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ừ khi có bằng chứng khác. Nó không chỉ dành cho các hộp nhập liệu đơn giản như các vùng văn bản mà còn cho mọi thứ khác – như input ẩn, các chuỗi tham số truy vấn, cookie và tệp tải lên. Xác nhận các chuỗi input ở phía máy chủXác nhận là quá trình đảm bảo dữ liệu người dùng nhập vào
là hợp lệ và vô hiệu hóa bất kỳ lệnh độc hại tiềm ẩn nào có thể được nhúng trong chuỗi nhập. Ví dụ, trong PHP, bạn có thể sử dụng mysql \ _real \ _escape \ _string () để thoát các ký tự có thể thay đổi bản chất của lệnh SQL. Sửa đổi đơn giản này sẽ bảo vệ mã của bạn khỏi 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. Sử dụng các câu lệnh tham sốMột lựa chọn tốt hơn để thoát khỏi tấn công SQL Injection là sử dụng các câu lệnh tham số. Các 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, thứ sau này sẽ được thay thế bởi input của người dùng. ASP.NET có một bộ API rất trực quan và dễ sử dụng cho mục đích này. Bạn bắt đầu bằng cách tạo ra một SqlCommand object và sử dụng placeholder
@parameter_name trong chuỗi lệnh nơi mà dữ liệu người dùng nhập vào nên được chèn vào. Phân định rõ ràng kiểu inputMẹo này dành cho các ngôn ngữ như PHP, khi bạn thường không định nghĩa các kiểu dữ liệu cho các biến số Lưu ý rằng đoạn mã này chỉ xác nhận kiểu của input chứ không phải phạm vi của nó. Vì vậy, bạn sẽ phải chạy mã khác để đảm bảo người dùng không nhập vào dữ liệu không hợp lệ … sẽ an toàn hơn một chút nếu sử dụng lệnh sau: $sql_command = "select * from users where age = '" . $age . "'";Làm thế nào để diệt tận gốc các lỗ hổng SQL InjectionLàm thế nào để diệt tận gốc các lỗ hổng SQL injection.Bạn nên kiểm tra mã của mỗi trang, ở những nơi mà bạn kết hợp nội dung trang, các lệnh, các chuỗi, v.v … với dữ liệu đến từ người dùng. Rà soát lại mã nguồn, tìm kiếm lỗ hổng bảo mật phải là một phần thiết yếu trong quá trình phát triển phần mềm của bạn. Hàng rào phòng thủ cuối cùng của bạnCho dù bạn
cài đặt bảo mật cho website cao tới mức nào đi nữa, bạn vẫn phải sẵn sàng phòng bị cho ngày bị tấn công SQL injections. Chúng ta phải chiến thắng mọi cuộc chiến, nhưng tin tặc chỉ cần giành chiến thắng một lần. Tránh quyền quản trịSử dụng tài khoản “root” hoặc “sa” để kết nối ứng dụng web với máy chủ cơ sở dữ liệu là một trong những sai
lầm tồi tệ nhất mà bạn có thể mắc phải. Như đã được đề cập, một tài khoản quản trị bị xâm nhập có thể cho phép hacker truy cập vào toàn bộ hệ thống. Ngay cả những tài khoản không phải tài khoản quản trị nhưng được trao quyền truy cập vào tất cả các cơ sở dữ liệu bên trong một máy chủ cũng có thể gây tổn hại, đặc biệt nếu máy chủ cơ sở dữ liệu đang được chia sẻ giữa các ứng dụng và cơ sở dữ liệu khác nhau. Mã hóa dữ liệu nhạy cảmMã hóa những dữ liệu nhạy cảm trong cơ sở dữ liệu của bạn. Nó bao gồm mật
khẩu, câu hỏi và câu trả lời về bảo mật, dữ liệu tài chính, thông tin y tế và các thông tin khác có ích cho các tác nhân độc hại. Điều này sẽ đảm bảo rằng ngay cả khi tin tặc nắm trong tay dữ liệu của bạn, chúng sẽ không thể khai thác nó ngay lập tức, cho bạn thời gian để phát hiện ra sự vi phạm, đánh dấu và thực hiện các biện pháp phản ứng khác như thực thi khôi phục mật khẩu, đảm bảo rằng dữ liệu bị đánh cắp mất giá trị trước khi kẻ tấn công giải mã nó. Nếu bạn
đang hashing mật khẩu của mình, nên sử dụng các thuật toán mạnh như SHA-2, nó sẽ sớm trở thành tiêu chuẩn ngành công nghiệp để bảo vệ mật khẩu. MD5 và SHA-1 đã lỗi thời và có thể bị giải mã. Không lưu trữ dữ liệu nhạy cảm nếu bạn không cần nóKhi bạn lưu trữ thông tin trong cơ sở dữ liệu, hãy xem nó sẽ gây tác hại như thế nào nếu bị rơi vào tay kẻ xấu, và quyết định xem bạn có thực sự cần lưu trữ nó hay không. Cuộc tấn công của Ashley Madison đã làm lộ những bí mật đen tối và thông tin mật của khoảng 37 triệu người trên internet và đã gây ra một số thiệt hại nghiêm trọng, một phần trong sự thành công của kẻ tấn công là do nhà cung cấp web đã không dọn dẹp các thông tin nhạy cảm từ cơ sở dữ liệu. Vì vậy, điểm mấu chốt là, không lưu trữ thông tin nhạy cảm trong cơ sở dữ liệu trừ khi bạn thực sự cần. Và thậm chí sau đó, xóa thông tin khi không còn sử dụng. Kết luậnSQL Injection đã tồn tại quanh ta trong nhiều thập kỷ và có thể sẽ tiếp tục đứng đầu bảng xếp hạng các lỗ hổng nguy hiểm trong những năm tới. Chỉ mất một vài bước dễ dàng –nhưng sẽ là một sự toan tính rất tốt – để bảo vệ chính bạn và người dùng của bạn khỏi sự tấn
công này, và lỗ hổng này sẽ là một trong những ưu tiên hàng đầu khi kiểm tra mã nguồn cho các lỗ hổng bảo mật. Chúng tôi luôn sẵn sàng lắng nghe bạn. Nếu cần hỗ trợ các vấn đề cụ thể liên quan đến bảo mật cho sản phẩm và hệ thống doanh nghiệp của mình, liên hệ ngay với chúng tôi tại đây! Chia sẻ Đăng ký để cập nhật hàng tuần Bài viết liên quan |