The Payload worked in HTTP/1.0 and not in HTTP/1.1 .
TL; DR: ha funzionato in HTTP / 1.0, ha fallito con una richiesta HTTP / 1.1 non valida ma è riuscita con una richiesta HTTP / 1.1 valida.
Dai un'occhiata alla richiesta che è stata inviata:
GET / HTTP/1.x
X-Forwarded-For: hacker' OR sleep(5) AND '1'='1 --+
Connection: close
Mentre HTTP / 1.0 e HTTP / 1.1 sembrano uguali, ci sono alcune importanti differenze. Uno è che HTTP / 1.1 richiede che il client invii un'intestazione Host
nella richiesta, ad esempio qualcosa come Host: www.example.com
. Anche se questa intestazione era possibile e ampiamente utilizzata con HTTP / 1.0, non era obbligatoria in HTTP / 1.0 ma è obbligatoria in HTTP / 1.1. Ciò significa che la richiesta inviata non è effettivamente valida con HTTP / 1.1 che spiega la risposta che si ottiene dal server:
For HTTP/1.1 : I Immediately get 400 Bad Request
Questa risposta immediata dal server indica che la richiesta è stata rifiutata e non inoltrata all'applicazione Web vulnerabile. La richiesta HTTP / 1.0 ben strutturata invece non è stata rifiutata e ha portato allo sfruttamento di successo:
For HTTP/1.0 : I get 200 OK after 5 seconds
Dopo che la richiesta HTTP / 1.1 è stata corretta, l'exploit ha funzionato anche lì:
Once I added Host Header. SQLi worked with 1.1 as well.