Làm thế nào tin tặc chiếm các trang web với SQL Injection và DDoS

Mục lục:

Làm thế nào tin tặc chiếm các trang web với SQL Injection và DDoS
Làm thế nào tin tặc chiếm các trang web với SQL Injection và DDoS

Video: Làm thế nào tin tặc chiếm các trang web với SQL Injection và DDoS

Video: Làm thế nào tin tặc chiếm các trang web với SQL Injection và DDoS
Video: Linux - Phân quyền cho tệp tin cơ bản - YouTube 2024, Tháng tư
Anonim
Ngay cả khi bạn chỉ theo dõi các sự kiện của nhóm hacker Anonymous và LulzSec, bạn có thể đã nghe nói về các trang web và dịch vụ bị tấn công, giống như các cuộc tấn công khét tiếng của Sony. Bạn đã bao giờ tự hỏi làm thế nào họ làm điều đó?
Ngay cả khi bạn chỉ theo dõi các sự kiện của nhóm hacker Anonymous và LulzSec, bạn có thể đã nghe nói về các trang web và dịch vụ bị tấn công, giống như các cuộc tấn công khét tiếng của Sony. Bạn đã bao giờ tự hỏi làm thế nào họ làm điều đó?

Có một số công cụ và kỹ thuật mà các nhóm này sử dụng và trong khi chúng tôi không cố gắng cung cấp cho bạn hướng dẫn để tự mình thực hiện việc này, thì việc hiểu những gì đang diễn ra sẽ rất hữu ích. Hai trong số các cuộc tấn công bạn thường xuyên nghe về chúng bằng cách sử dụng là "(Phân tán) từ chối dịch vụ" (DDoS) và "SQL Injection" (SQLI). Đây là cách chúng hoạt động.

Hình ảnh của xkcd

Tấn công từ chối dịch vụ

Image
Image

Nó là gì?

Một "từ chối dịch vụ" (đôi khi được gọi là tấn công từ chối dịch vụ "" DDoS) xảy ra khi một hệ thống, trong trường hợp này là máy chủ web, nhận được rất nhiều yêu cầu cùng một lúc tài nguyên máy chủ bị quá tải. và tắt. Mục tiêu và kết quả của một cuộc tấn công DDoS thành công là các trang web trên máy chủ đích không có sẵn cho các yêu cầu lưu lượng hợp pháp.

Làm thế nào nó hoạt động?

Hậu cần của một cuộc tấn công DDoS có thể được giải thích tốt nhất bằng một ví dụ.

Hãy tưởng tượng một triệu người (những kẻ tấn công) gặp gỡ với mục tiêu cản trở việc kinh doanh của Công ty X bằng cách gỡ bỏ trung tâm cuộc gọi của họ. Những kẻ tấn công phối hợp để vào thứ Ba lúc 9 giờ sáng, tất cả họ sẽ gọi đến số điện thoại của Công ty X. Nhiều khả năng, hệ thống điện thoại của Công ty X sẽ không thể xử lý một triệu cuộc gọi cùng một lúc để tất cả các đường dây đến sẽ bị những kẻ tấn công trói buộc. Kết quả là các cuộc gọi khách hàng hợp pháp (tức là những người không phải là kẻ tấn công) không được thông qua bởi vì hệ thống điện thoại bị ràng buộc xử lý các cuộc gọi từ những kẻ tấn công. Vì vậy, trong bản chất Công ty X có khả năng mất kinh doanh do các yêu cầu hợp pháp không thể vượt qua được.

Một cuộc tấn công DDoS trên một máy chủ web hoạt động chính xác theo cùng một cách. Bởi vì hầu như không có cách nào để biết lưu lượng truy cập nào có nguồn gốc từ các yêu cầu hợp pháp so với kẻ tấn công cho đến khi máy chủ web xử lý yêu cầu, kiểu tấn công này thường rất hiệu quả.

Thực hiện cuộc tấn công

Do tính chất “bạo lực” của một cuộc tấn công DDoS, bạn cần phải có rất nhiều máy tính được phối hợp để tấn công cùng một lúc. Xem lại ví dụ về trung tâm cuộc gọi của chúng tôi, điều này sẽ yêu cầu tất cả những kẻ tấn công phải biết lúc gọi lúc 9 giờ sáng và thực sự gọi vào thời điểm đó. Trong khi nguyên tắc này chắc chắn sẽ hoạt động khi tấn công một máy chủ web, nó trở nên dễ dàng hơn đáng kể khi các máy tính zombie, thay vì các máy tính có người lái thực tế, được sử dụng.

Như bạn có thể đã biết, có rất nhiều biến thể của phần mềm độc hại và trojans, một khi trên hệ thống của bạn, nằm im và thỉnh thoảng "điện thoại nhà" để được hướng dẫn. Ví dụ: một trong những hướng dẫn này có thể gửi yêu cầu lặp lại đến máy chủ web của Công ty X vào lúc 9 giờ sáng. Vì vậy, với một bản cập nhật duy nhất cho vị trí nhà của phần mềm độc hại tương ứng, một kẻ tấn công có thể ngay lập tức phối hợp hàng trăm nghìn máy tính bị xâm phạm để thực hiện một cuộc tấn công DDoS lớn.

Vẻ đẹp của việc sử dụng máy tính zombie không chỉ là hiệu quả của nó, mà còn ẩn danh vì kẻ tấn công không thực sự phải sử dụng máy tính của họ để thực hiện cuộc tấn công.

Tấn công SQL Injection

Image
Image

Nó là gì?

Tấn công “SQL injection” (SQLI) là một khai thác tận dụng các kỹ thuật phát triển web kém và, thường được kết hợp với, bảo mật cơ sở dữ liệu bị lỗi. Kết quả của một cuộc tấn công thành công có thể dao động từ mạo danh tài khoản người dùng đến một sự thỏa hiệp hoàn toàn của cơ sở dữ liệu hoặc máy chủ tương ứng. Không giống như một cuộc tấn công DDoS, một cuộc tấn công SQLI là hoàn toàn và dễ dàng ngăn chặn nếu một ứng dụng web được lập trình thích hợp.

Thực hiện cuộc tấn công

Bất cứ khi nào bạn đăng nhập vào một trang web và nhập tên người dùng và mật khẩu của bạn, để kiểm tra thông tin đăng nhập của bạn, ứng dụng web có thể chạy một truy vấn như sau:

SELECT UserID FROM Users WHERE UserName='myuser' AND Password='mypass';

Lưu ý: giá trị chuỗi trong truy vấn SQL phải được đặt trong dấu nháy đơn, đó là lý do tại sao chúng xuất hiện xung quanh giá trị đã nhập của người dùng.

Vì vậy, sự kết hợp của tên người dùng đã nhập (myuser) và mật khẩu (mypass) phải khớp với một mục nhập trong bảng Người dùng để trả về UserID. Nếu không có kết quả phù hợp, không có UserID được trả về để thông tin xác thực đăng nhập không hợp lệ. Mặc dù việc triển khai cụ thể có thể khác nhau nhưng các cơ chế khá chuẩn.

Bây giờ, hãy xem xét truy vấn xác thực mẫu mà chúng tôi có thể thay thế các giá trị mà người dùng nhập vào biểu mẫu web:

SELECT UserID FROM Users WHERE UserName='[user]’ AND Password='[pass]’

Thoạt nhìn, điều này có vẻ giống như một bước đơn giản và hợp lý để dễ dàng xác nhận người dùng, tuy nhiên nếu thay thế đơn giản giá trị người dùng nhập được thực hiện trên mẫu này, nó dễ bị tấn công SQLI.

Ví dụ: giả sử “myuser’–” được nhập vào trường tên người dùng và “sai đường” được nhập vào mật khẩu. Sử dụng sự thay thế đơn giản trong truy vấn mẫu của chúng ta, chúng ta sẽ nhận được điều này:

SELECT UserID FROM Users WHERE UserName='myuser'--' AND Password='wrongpass'

Một chìa khóa để tuyên bố này là sự bao gồm của hai dấu gạch ngang

(--)

. Đây là mã thông báo bắt đầu cho các câu lệnh SQL, vì vậy bất cứ điều gì xuất hiện sau khi hai dấu gạch ngang (bao gồm) sẽ bị bỏ qua. Về cơ bản, truy vấn trên được thực thi bởi cơ sở dữ liệu như sau:

SELECT UserID FROM Users WHERE UserName='myuser'

Việc thiếu sót rõ ràng ở đây là việc thiếu kiểm tra mật khẩu.Bằng cách bao gồm cả hai dấu gạch ngang như một phần của trường người dùng, chúng tôi hoàn toàn bỏ qua điều kiện kiểm tra mật khẩu và có thể đăng nhập là “myuser” mà không biết mật khẩu tương ứng. Hành động thao tác truy vấn này để tạo ra các kết quả không mong muốn là tấn công SQL injection.

Những gì thiệt hại có thể được thực hiện?

Một cuộc tấn công SQL injection là do mã hóa ứng dụng cẩu thả và vô trách nhiệm và hoàn toàn có thể ngăn chặn được (tuy nhiên chúng tôi sẽ giới thiệu trong một thời điểm), tuy nhiên mức độ thiệt hại có thể được thực hiện tùy thuộc vào thiết lập cơ sở dữ liệu. Để ứng dụng web giao tiếp với cơ sở dữ liệu phụ trợ, ứng dụng phải cung cấp thông tin đăng nhập vào cơ sở dữ liệu (lưu ý, điều này khác với đăng nhập của người dùng vào chính trang web). Tùy thuộc vào các quyền mà ứng dụng web yêu cầu, tài khoản cơ sở dữ liệu tương ứng này có thể yêu cầu bất kỳ điều gì từ quyền đọc / ghi trong các bảng hiện có chỉ để truy cập cơ sở dữ liệu đầy đủ. Nếu điều này không rõ ràng bây giờ, một vài ví dụ sẽ giúp cung cấp một số rõ ràng.

Dựa trên ví dụ trên, bạn có thể thấy rằng bằng cách nhập, ví dụ:

'youruser'--', 'admin'--'

hoặc bất kỳ tên người dùng nào khác, chúng tôi có thể đăng nhập ngay lập tức vào trang web với tư cách người dùng đó mà không cần biết mật khẩu. Khi chúng tôi ở trong hệ thống không biết chúng tôi không thực sự là người dùng đó để chúng tôi có toàn quyền truy cập vào tài khoản tương ứng. Quyền cơ sở dữ liệu sẽ không cung cấp một mạng lưới an toàn vì điều này, thông thường, một trang web phải có ít nhất quyền truy cập đọc / ghi vào cơ sở dữ liệu tương ứng của nó.

Bây giờ chúng ta hãy giả sử trang web có toàn quyền kiểm soát cơ sở dữ liệu tương ứng của nó, cho phép xóa các bản ghi, thêm / xóa bảng, thêm các tài khoản bảo mật mới, v.v. Điều quan trọng cần lưu ý là một số ứng dụng web có thể cần kiểu quyền này không phải là điều xấu mà toàn quyền kiểm soát được cấp.

Vì vậy, để minh họa thiệt hại có thể được thực hiện trong tình huống này, chúng tôi sẽ sử dụng ví dụ được cung cấp trong truyện tranh ở trên bằng cách nhập thông tin sau vào trường tên người dùng:

'Robert'; DROP TABLE Users;--'.

Sau khi thay thế đơn giản, truy vấn xác thực trở thành:

SELECT UserID FROM Users WHERE UserName='Robert'; DROP TABLE Users;--' AND Password='wrongpass'

Lưu ý: dấu chấm phẩy trong một truy vấn SQL được sử dụng để biểu thị sự kết thúc của một câu lệnh cụ thể và bắt đầu một câu lệnh mới.

Được cơ sở dữ liệu thực hiện như sau:

SELECT UserID FROM Users WHERE UserName='Robert'

Người dùng DROP TABLE

Vì vậy, chỉ cần như vậy, chúng tôi đã sử dụng một cuộc tấn công SQLI để xóa toàn bộ bảng người dùng.

Tất nhiên, điều tồi tệ hơn có thể được thực hiện như, tùy thuộc vào quyền hạn của SQL, kẻ tấn công có thể thay đổi giá trị, đổ bảng (hoặc toàn bộ cơ sở dữ liệu) thành tệp văn bản, tạo tài khoản đăng nhập mới hoặc thậm chí chiếm đoạt toàn bộ cài đặt cơ sở dữ liệu.

Ngăn chặn tấn công SQL injection

Như chúng tôi đã đề cập một vài lần trước đây, một cuộc tấn công SQL injection có thể dễ dàng ngăn chặn được. Một trong những nguyên tắc cơ bản của phát triển web là bạn không bao giờ mù quáng tin vào đầu vào của người dùng như chúng tôi đã làm khi chúng tôi thực hiện thay thế đơn giản trong truy vấn mẫu của chúng tôi ở trên.

Một cuộc tấn công SQLI dễ dàng bị cản trở bởi những gì được gọi là khử trùng (hoặc thoát) đầu vào của bạn. Quá trình khử trùng thực sự khá tầm thường vì tất cả những gì nó thực sự là xử lý bất kỳ dấu nháy đơn nào (‘) một cách thích hợp sao cho chúng không thể được sử dụng để kết thúc sớm một chuỗi bên trong câu lệnh SQL.

Ví dụ: nếu bạn muốn tra cứu “Oneil” trong cơ sở dữ liệu, bạn không thể sử dụng thay thế đơn giản vì dấu nháy đơn sau O sẽ khiến chuỗi kết thúc sớm. Thay vào đó bạn khử trùng nó bằng cách sử dụng ký tự thoát của cơ sở dữ liệu tương ứng. Giả sử ký tự thoát cho một trích dẫn nội tuyến đơn lẻ là đặt trước mỗi dấu trích dẫn bằng ký hiệu. Vì vậy, "O’neal" sẽ được khử trùng thành "O " neil ".

Hành động vệ sinh đơn giản này ngăn cản một cuộc tấn công SQLI. Để minh họa, hãy xem lại các ví dụ trước của chúng tôi và xem các truy vấn kết quả khi đầu vào của người dùng được vệ sinh.

myuser'--

/ sai đường:

SELECT UserID FROM Users WHERE UserName='myuser'--' AND Password='wrongpass'

Bởi vì báo giá duy nhất sau khi myuser được thoát (có nghĩa là nó được coi là một phần của giá trị đích), cơ sở dữ liệu theo nghĩa đen sẽ tìm kiếm UserName của

'myuser'--'.

Ngoài ra, vì dấu gạch ngang được bao gồm trong giá trị chuỗi và không phải là chính câu lệnh SQL, chúng sẽ được coi là một phần của giá trị đích thay vì được hiểu là nhận xét SQL.

Robert'; DROP TABLE Users;--

/ sai đường:

SELECT UserID FROM Users WHERE UserName='Robert'; DROP TABLE Users;--' AND Password='wrongpass'

Chỉ đơn giản là thoát khỏi trích dẫn đơn sau Robert, cả dấu chấm phẩy và dấu gạch ngang được chứa trong chuỗi tìm kiếm của UserName để cơ sở dữ liệu theo nghĩa đen sẽ tìm kiếm

'Robert'; DROP TABLE Users;--'

thay vì thực hiện xóa bảng.

Tóm tắt

Trong khi các cuộc tấn công web phát triển và trở nên phức tạp hơn hoặc tập trung vào một mục nhập khác, điều quan trọng là phải nhớ bảo vệ chống lại các cuộc tấn công cố gắng và thực sự, là nguồn cảm hứng của một số "công cụ hacker" có sẵn miễn phí được thiết kế để khai thác chúng.

Một số loại tấn công nhất định, chẳng hạn như DDoS, không thể dễ dàng tránh được trong khi những loại khác, chẳng hạn như SQLI, có thể. Tuy nhiên, thiệt hại có thể được thực hiện bởi các loại tấn công này có thể dao động từ bất tiện đến thảm họa tùy thuộc vào các biện pháp phòng ngừa được thực hiện.

Đề xuất: