La carga útil funcionó en HTTP / 1.0 y no en HTTP / 1.1.
TL; DR: funcionó en HTTP / 1.0, falló con una solicitud HTTP / 1.1 no válida pero tuvo éxito con una solicitud HTTP / 1.1 válida.
Eche un vistazo a la solicitud que se envió:
GET / HTTP/1.x
X-Forwarded-For: hacker' OR sleep(5) AND '1'='1 --+
Connection: close
Si bien HTTP / 1.0 y HTTP / 1.1 tienen el mismo aspecto, hay algunas diferencias importantes. Uno es que HTTP / 1.1 requiere que el cliente envíe un encabezado Host
en la solicitud, es decir, algo como Host: www.example.com
. Si bien este encabezado era posible y se usaba ampliamente con HTTP / 1.0, tampoco era obligatorio en HTTP / 1.0, pero sí en HTTP / 1.1. Esto significa que la solicitud que envía no es válida con HTTP / 1.1, lo que explica la respuesta que recibe del servidor:
Para HTTP / 1.1: Inmediatamente recibo 400 solicitudes incorrectas
Esta respuesta inmediata del servidor significa que la solicitud se rechazó y no se reenvió a la aplicación web vulnerable. La solicitud HTTP / 1.0 bien formada, en cambio, no fue rechazada y resultó en una explotación exitosa:
Para HTTP / 1.0: obtengo 200 OK después de 5 segundos
Después de que se solucionó la solicitud HTTP / 1.1, el exploit también funcionó allí:
Una vez agregué Host Header. SQLi también trabajó con 1.1.