Content-Type juggling
Theory
Content-Type juggling exploits the lack of checking on the Content-Type
header when submitting an HTTP request.
Most of the time, Content-Type juggling is a way to carry out other attacks such as unrestricted-file-upload or xxe-injection (see examples).
The Content-Type
header is used to indicate the MIME type of the resource.
In requests, (such as
POST
orPUT
), the client tells the server what type of data was actually sent.In responses, a
Content-Type
header tells the client what type of content is actually being returned. Browsers may try to detect the MIME type of content by inspecting it rather than by respecting the value of this header.
If the XCTO (X-Content-Type-Options) security header is present, it will be difficult to perform the Content-Type
juggling, as indicated in mime-sniffing. The XCTO security header can be used to indicate that the MIME types advertised in the Content-Type
headers should be followed and not be changed by the browser depending on the page's content. Websites that implement this security header with the nosniff
directive must also include a valid Content-Type
header in their responses.
Practice
Identify a target vulnerable to Content-Type juggling
In order to identify if the target is vulnerable to Content-Type
juggling, testers need to answer the following questions :
Is there a post request with value(s) and
Content-Type
header ?Is the
X-Content-Type-Options
security header not present ?Can the
Content-Type
header be edited, and thePOST
request still be submitted successfully ?
If the answer is yes to the questions above, then one should be able to perform Content-Type
juggling and might find a way to perform other attacks as a result:
If one can switch to
application/xml
, XXE should be tried.If one can switch to
application/zip
, uploading malicious zip file should be tried.If one can switch to
application/php
, uploading PHP payloads should be tried.If one can switch to
application/image
, uploading malicious image should be tried.
One should not stick to this list and always try several Content-Type values.
Example attacks
Resources
Last updated
Was this helpful?