paint-brush
Bảo vệ ứng dụng web của bạn: Hướng dẫn giới hạn tỷ lệ và ngăn chặn tấn công vũ phutừ tác giả@shad0wpuppet
27,347 lượt đọc
27,347 lượt đọc

Bảo vệ ứng dụng web của bạn: Hướng dẫn giới hạn tỷ lệ và ngăn chặn tấn công vũ phu

từ tác giả Konstantin Sakhchinskiy4m2024/01/22
Read on Terminal Reader
Read this story w/o Javascript

dài quá đọc không nổi

Việc triển khai các biện pháp giới hạn tốc độ mạnh mẽ là điều cần thiết cho các ứng dụng web để ngăn chặn các cuộc tấn công bạo lực và tình trạng quá tải dịch vụ tiềm ẩn. Kỹ thuật giới hạn tỷ lệ và hiểu biết sâu sắc về thử nghiệm và vượt qua giới hạn tỷ lệ. Bài viết đề cập đến cách tiếp cận tự động hóa, thao tác tiêu đề, biến thể điểm cuối và các chiến lược liên quan đến đăng nhập. Việc sử dụng Cloudflare để khôi phục IP của khách truy cập ban đầu cũng được khám phá, đồng thời thận trọng kiểm tra và đánh giá kỹ lưỡng các tác động tiềm ẩn đối với ứng dụng trước khi triển khai.
featured image - Bảo vệ ứng dụng web của bạn: Hướng dẫn giới hạn tỷ lệ và ngăn chặn tấn công vũ phu
Konstantin Sakhchinskiy HackerNoon profile picture
0-item


Nếu ứng dụng của bạn bao gồm các tính năng cơ bản như đăng nhập, đăng ký, đặt lại/khôi phục mật khẩu, gửi lại liên kết xác nhận và các chức năng cụ thể khác yêu cầu yêu cầu máy chủ thì điều quan trọng là phải triển khai các cơ chế chống lại các cuộc tấn công vũ phu và tạo ra tải trọng đáng kể cho dịch vụ của bạn. Nếu không có các cơ chế như vậy, ứng dụng của bạn có thể dễ gặp phải nhiều mối đe dọa khác nhau, bao gồm việc gửi quá nhiều email/OTP cho người dùng, có khả năng dẫn đến thiệt hại về tài chính và danh tiếng.


Nhiều ứng dụng web thiếu các biện pháp giới hạn tốc độ đầy đủ, chỉ dựa vào các giới hạn do logic kinh doanh của chúng áp đặt, chẳng hạn như hạn chế số lượng yêu cầu dựa trên mô hình thanh toán. Tuy nhiên, một số ứng dụng có kết hợp các giới hạn tốc độ, đặc biệt đối với các hoạt động như lần thử đăng nhập, đăng ký và các chức năng quan trọng khác. Những triển khai này thường phụ thuộc vào tiêu đề X-Forwarded-For để theo dõi địa chỉ IP.


Để minh họa một ví dụ đơn giản, tôi đã nghĩ ra đoạn mã này trên Flask


 from flask import Flask, request, jsonify from flask_limiter import Limiter from flask_limiter.util import get_remote_address app = Flask(__name__) limiter = Limiter(    app,    key_func=get_remote_address,    storage_uri="memory://",) def get_ipaddr():    # Retrieve the client's IP address from the request    # X-Forwarded-For header is used to handle requests behind a proxy    ip_address = request.headers.get('X-Forwarded-For', request.remote_addr)    return ip_address # Rate limit to 5 requests per minute per IP @limiter.limit("5 per minute") @app.route('/') def index(): ip_address = get_ipaddr() return ip_address

Trong các phần sau, tôi sẽ giải thích các cách tiếp cận khác nhau để thử nghiệm và cố gắng vượt qua giới hạn tốc độ trong ứng dụng của bạn.


Để kiểm tra hiệu quả loại lỗ hổng này trong ứng dụng của bạn, tự động hóa là một công cụ mạnh mẽ. Bạn có thể đạt được điều này bằng cách sử dụng các tập lệnh, chẳng hạn như các tập lệnh trong Python (như tôi thường làm) hoặc sử dụng các công cụ như Burp Suite (btw một công cụ tuyệt vời dành cho người kiểm tra và chuyên gia an ninh mạng). Ngoài ra, các công cụ như Postman có thể được sử dụng để tự động kiểm tra tương đối dễ dàng.

Giới hạn tỷ lệ thử nghiệm

Thay đổi giá trị IP trong tiêu đề X-Forwarded-For

 X-Originating-IP: 127.0.0.1

Sử dụng các giá trị IP khác nhau trong mọi yêu cầu bạn gửi.


Sử dụng tiêu đề X-Forwared-For kép.

 X-Forwarded-For: X-Forwarded-For: 127.0.0.1

Hãy thử tương tự với các tiêu đề khác nhau.

 X-Originating-IP: 127.0.0.1 X-Remote-IP: 127.0.0.1 X-Remote-Addr: 127.0.0.1 X-Client-IP: 127.0.0.1 X-Host: 127.0.0.1 X-Forwared-Host: 127.0.0.1

Thay đổi các tiêu đề khác

Hãy thử thay đổi tác nhân người dùng, loại nội dung, ngôn ngữ chấp nhận, v.v. hoặc cookie, bất kỳ thứ gì có thể được sử dụng làm mã định danh người dùng.


Nếu có giới hạn tốc độ là 3 lần thử cho mỗi IP, cứ sau ba lần thử, hãy thay đổi giá trị IP của tiêu đề (hoặc các tiêu đề hoặc thông số khác trong yêu cầu của bạn).

Thêm ký tự trống trong thông số

Hãy thử thêm vào thông số bạn gửi

 %00, %0d%0a, %0d, %0a, %09, %0C, %20

Ví dụ

 param1=value1%%0d%0a param2=value2%00

Ví dụ: nếu bạn đang yêu cầu OTP để xác minh email và bạn chỉ có 3 lần thử, hãy sử dụng 3 lần thử cho

 [email protected] [email protected]%00 [email protected]%0d%0a And so on

Sử dụng các điểm cuối tương tự

Ví dụ: nếu bạn đang thử nghiệm điểm cuối/API/v1/đăng ký, hãy thử thực hiện mạnh mẽ đối với /Đăng ký, /Đăng ký, /đăng ký. Hãy thử thêm ký tự trống (từ bên trên) vào điểm cuối ban đầu.

Thêm thông số bổ sung vào điểm cuối API được yêu cầu

Nếu giới hạn nằm ở các yêu cầu của điểm cuối /api/v1/resetpassword, hãy thử ép buộc nó bằng cách thêm một số thông số truy vấn - ví dụ: sau khi đạt đến giới hạn tốc độ, hãy thử /api/v1/resetpassword?param1=value1

Vấn đề đăng nhập

Có thể xảy ra trường hợp ứng dụng có logic sai sót - nếu bạn đăng nhập vào tài khoản của mình trước mỗi lần thử/chuỗi lần thử, giới hạn tốc độ sẽ được đặt lại cho IP của bạn và bạn có thể tiếp tục cuộc tấn công vũ phu bằng mật khẩu của mình. Nếu bạn đang thử nghiệm tính năng đăng nhập, bạn có thể thực hiện việc này trong Burp Suit bằng đòn tấn công Pitchfork trong cài đặt (hoặc bạn có thể viết tập lệnh của riêng mình cho việc này) cho mỗi lần thử/chuỗi lần thử.


Đây là ví dụ của tôi về cách tôi tự động kiểm tra đơn giản cho tiêu đề X-Forwarded-For chỉ để nhận POW:


 from random import randint import requests import json url = "https://yourapp.net/api/v1/regconfirm-resend" data = {   "email": "[email protected]" } N = 100 def generate_random_ip():   return '.'.join(       str(randint(0, 255)) for _ in range(4)   ) for _ in range(N):   headers = {       "Host": "yourapp.net",       "Content-Type": "application/json",       "X-Forwarded-For": generate_random_ip()   }   response = requests.post(url, headers=headers, data=json.dumps(data))   print(headers)   print(f"Status Code: {response.status_code}, Response: {response.text}")

Khôi phục IP của khách truy cập ban đầu

Một giải pháp khả thi có thể là sử dụng Cloudflare và các cơ chế của nó. Bạn có thể tìm thấy lời giải thích chi tiết tại đây Restore-Original-visitor-ips . Tôi sẽ chỉ cung cấp một cái nhìn tổng quan ngắn gọn về cơ chế bảo vệ của nó.


Nếu bạn sử dụng các ứng dụng phụ thuộc vào địa chỉ IP đến của khách truy cập ban đầu, địa chỉ IP Cloudflare sẽ được ghi lại theo mặc định. Địa chỉ IP của khách truy cập ban đầu xuất hiện trong tiêu đề HTTP được thêm vào có tên CF-Connecting-IP. Bằng cách làm theo hướng dẫn về máy chủ web của chúng tôi, bạn có thể đăng nhập địa chỉ IP của khách truy cập ban đầu tại máy chủ gốc của mình. Nếu tiêu đề HTTP này không có sẵn khi yêu cầu đến máy chủ gốc của bạn, hãy kiểm tra cấu hình Quy tắc chuyển đổi và Chuyển đổi được quản lý của bạn.


Nếu Pseudo IPv4 được đặt thành Ghi đè tiêu đề - Cloudflare sẽ ghi đè các tiêu đề Cf-Connecting-IP và X-Forwarded-For hiện có bằng địa chỉ IPv4 giả trong khi vẫn giữ địa chỉ IPv6 thực trong tiêu đề CF-Connecting-IPv6.


LƯU Ý: Hãy nhớ rằng, khi triển khai cơ chế bảo vệ như vậy, hãy thực hiện kiểm tra kỹ lưỡng. Cách tiếp cận này sau đó có thể được áp dụng cho toàn bộ cụm và có thể ảnh hưởng xấu đến một số chức năng và dịch vụ vi mô nhất định nếu không cần thiết. Tóm lại, trong khi khắc phục vi phạm bảo mật, hãy thận trọng vì nó có thể ảnh hưởng đến toàn bộ ứng dụng. Phân tích phần nào trong hệ thống của bạn có thể bị ảnh hưởng tiêu cực và kiểm tra mọi thứ trước khi chuyển các thay đổi sang môi trường sản xuất.


Cũng được xuất bản ở đây .