Reflected XSS In


In July 2014, I found an obvious reflected XSS vulnerability in DesignCrowd. In the interest of responsible disclosure, I submitted a report to the company at that time, and I can’t remember if I ever heard back. This draft post has been collecting dust ever since, so I’m finally publishing it today.

DesignCrowd is a graphic design outsourcing web site where freelance designers compete to win a bounty placed on a particular project. One feature of their website is a “manage project” page where the user can see all of the designs that have been submitted. If you don’t like a design, you can eliminate it from the competition by clicking “Eliminate this design”. The site displays a message at the top saying “Design eliminated successfully!”

Confirmation message
Confirmation message

The developer in me could not help but notice a URL parameter called “successMsg”.  It is base64 encoded, so it’s not immediately clear what it means.

$ echo "RGVzaWduIGVsaW1pbmF0ZWQgc3VjY2Vzc2Z1bGx5IQ==" | base64 -d
Design eliminated successfully!

Hmm… This looks bad. Is this an XSS vector? Let’s base64 encode an attack.

$ echo "<script>alert(1)</script>" | base64

Now put this string into the URL parameter and push the big red button.

Demonstration of XSS
Demonstration of XSS

Clearly this is exploitable. What are the possible effects?

The site uses a cookie called CustomSessionID to identify the session, and that cookie is not HTTP-only, making it trivial to steal the session ID using the reflected XSS vulnerability. Fortunately, this site does not appear to store credit card data. It has some PII (name, address, phone, etc.), but that information is voluntary. There is one really bad thing the attacker can do: a password change doesn’t require the old password, so an attacker could easily change a user’s password!

I find this flaw interesting because of its implications for vulnerability analysis. Human intuition recognizes the flaw quite quickly: the name of the query parameter and the base64 encoding are red flags to any person who knows what to look for. At the same time, base64 encoding will almost certainly fool any heuristic vulnerability scanning tools.

The uncomfortable conclusion is that most automated vulnerability scanning tools are hopelessly naive. In the short term, this underlines the continued need for human expertise in infosec, but in the long term it points towards the types of security tools the industry needs to develop: tools that blend multiple forms of analysis and are capable of understanding the types of contextual clues that are obvious to humans.