盲注 SQL 和 HTTP 版本依赖?

信息安全 http sql注入 mysql
2021-08-27 23:12:32

我最近遇到了一个在 X-Forwarded-For 标头中具有盲 SQL 注入的虚拟机。

我使用 sleep() 来检测漏洞。
Payload 在 HTTP/1.0 而不是 HTTP/1.1 中工作。

有效载荷:

GET / HTTP/1.x
X-Forwarded-For: hacker' OR sleep(5) AND '1'='1 --+
Connection: close

结果:

  • 对于 HTTP/1.1:我立即收到400 Bad Request
  • 对于 HTTP/1.0:5 秒后我得到200 OK

    我使用 Burp Repeater 来制作数据包。

VM-Link:https

: //www.pentesterlab.com/exercises/from_sqli_to_shell_II 有人可以帮我理解这里的问题吗?
谢谢。

1个回答

Payload 在 HTTP/1.0 而不是 HTTP/1.1 中工作。

TL;DR:它在 HTTP/1.0 中工作,它因无效的 HTTP/1.1 请求而失败,但因有效的 HTTP/1.1 请求而成功。


查看发送的请求:

GET / HTTP/1.x
X-Forwarded-For: hacker' OR sleep(5) AND '1'='1 --+
Connection: close

虽然 HTTP/1.0 和 HTTP/1.1 看起来差不多,但还是有一些重要的区别。一种是 HTTP/1.1 要求客户端Host在请求中发送一个标头,例如Host: www.example.com. 虽然此标头在 HTTP/1.0 中也是可能的并且被广泛使用,但它在 HTTP/1.0 中不是强制性的,但在 HTTP/1.1 中是强制性的。这意味着您发送的请求实际上对 HTTP/1.1 无效,这解释了您从服务器返回的响应:

对于 HTTP/1.1:我立即收到 400 Bad Request

服务器的这种即时响应意味着请求被拒绝并且没有转发到易受攻击的 Web 应用程序。相反,格式良好的 HTTP/1.0 请求并未被拒绝并导致成功利用:

对于 HTTP/1.0:5 秒后我得到 200 OK

在 HTTP/1.1 请求被修复后,exploit 也在那里工作:

一旦我添加了主机头。SQLi 也适用于 1.1。