Web

OWASP Web Security Testing guidearrow-up-right

Enumeration

ChopChoparrow-up-right WhatWebarrow-up-right BlindElephantarrow-up-right FeroxBusterarrow-up-right List of interesting URLsarrow-up-right Another sweet set of listsarrow-up-right

  • robots.txt

  • .htaccess

  • API endpoints called by javascript/etc

Domains

DNS Dumpsterarrow-up-right DNS Historyarrow-up-right Domains sharing IParrow-up-right

Sneaky techniky

  • Does the server support HTTP PUT?

  • Do all API endpoints actually verify authentication?

    • Missing auth parameters?

    • Provided but invalid parameters?

  • Does the application use any binary librariesarrow-up-right?

  • What happens if you remove the Host header?

  • What other domains are hosted at the same IP?

Probing payloads

JWT

Toolarrow-up-right

Try setting alg: none or alg: nonE etc. Maybe that's enough.

Public key mixup

Tell me morearrow-up-right Toolarrow-up-right

If a JWT uses RS256, the backend can be tricked into validating with HS256 instead. A HS256 JWT is signed with the public key, which can perhaps be deduced from a few samples of RS256 JWTs.

Path Traversal

Java applications

Tell me morearrow-up-right

HTTP Response Splitting

Tell me morearrow-up-right Toolarrow-up-right Toolarrow-up-right

Unvalidated user input leaks into the early parts of a HTTP response. The attacker can inject CRLF, allowing them to control the rest of the response, including additional headers and content.

HTTP Request Smuggling

Sweet Infographicarrow-up-right A proxy in front of the server merges multiple incoming requests into a single connection to the backend server.

A malicious HTTP request has both a short Content-Length header (which is proper) and an additional Transfer-Encoding: Chunked header (which is ignored by the proxy). It is immediately followed by an authenticated request from a legitimate user.

The proxy concatenates the requests and passes them on to the backend server, still via HTTP. The server parses the malicious request as Transfer-Encoding: Chunked and ignores the Content-Length. As a result, the malicious result is parsed short, and the tail end of its data is interpreted by the server as the start of the next request.

As a result, the second request handled by the server is malformed. Malicious control over the HTTP command and headers, but includes the headers of the legitimate request as well. Oops.

40x bypassing

CORS misconfiguration

Toolarrow-up-right

WAF

Identification

wafalyzerarrow-up-right wafw00farrow-up-right

Bypassing

A Methodologyarrow-up-right Some tipsarrow-up-right Unicode shenanigansarrow-up-right, because of course

Mess with the HTTP request

Pass two different content-length headers. Maybe the WAF uses one and the target server uses the other?

Set Content-Type: */* if certain filetypes (XXE?) are blocked.

Try a POST instead of a GET. If the filtering is applied to the requested path but the naughty string is in the parameters...

Find the unprotected server

Tell me morearrow-up-right DNS historyarrow-up-right SSL historyarrow-up-right Subdomainsarrow-up-right CloudFailarrow-up-right for cloudflare-protected sites Lillyarrow-up-right (requires a shodan API key)

Maybe dev.target.com points to the actual server behind the WAF? Maybe target.com used to point straight to the server, and the server is still the same?

Bypass blocklists

URL-encode some part of your naughty string. Maybe the filter is applied before decoding?

Try multiple layers of encodingarrow-up-right, strange as it may sound.

NoSQL injection

Toolarrow-up-right

Exposed SCM data

ayfabtuarrow-up-right supports svn, mercurial and git. DVCS Ripperarrow-up-right (svm mercurial, git, BZR) GitToolsarrow-up-right gitjackerarrow-up-right git-dumperarrow-up-right

CSP

Evasion techniquesarrow-up-right

LFI

fimaparrow-up-right liffyarrow-up-right Kadimusarrow-up-right Kadabraarrow-up-right

Try to use it to get the source of the vulnerable script. That will show you any filtering etc.

PHP has all kinds of funky pseudo-file protocolsarrow-up-right, and these are valid wherever file paths are. fimap and liffy support some of these tricks.

SSRF

What to do with a blind SSRFarrow-up-right

SSTI

Tell me morearrow-up-right Toolarrow-up-right

Server Side Template Injection

SQLi

SQLite

Use a NULL byte to terminate the query and get rid of stuff you can't comment out. Neat.

XSS

Event handlers by tagarrow-up-right Mutation pointsarrow-up-right within an <a> tag

Last updated