经典 ASP:ServerVariables["HTTP_HOST"] 锻造
Classic ASP: ServerVariables["HTTP_HOST"] forging
根据这篇 MSDN 文章 https://msdn.microsoft.com/en-us/library/ms525396(v=vs.90).aspx,这些变量是基于 headers 设置的。我很好奇 HTTP_HOST 变量是否可欺骗。我已经 运行 一些测试表明它不可欺骗,但我想确定一下。
编辑:为清楚起见,我很好奇服务器代理、中间人或知道如何使用 netcat 的人是否可以伪造适当的 headers 以操纵 HTTP_HOST 在我的脚本中。
是的,它是可恶搞的。
您网站的恶意用户可以在其 HTTP 请求中设置他们想要的任何 host
header,HTTP_HOST
变量将反映:
GET / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
唯一需要注意的是它必须绑定在您的网络服务器上。例如,如果您使用 IIS 网络服务器,您可以指定您的网站绑定到哪些主机。对于 "any" 这可以是空白,或者您可以将其设置为特定的域名。如果是后者,则在攻击者发送
GET / HTTP/1.1
Host: www.foo.com
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
到您的 example.com
域不会访问您的 example.com
网站,但会访问默认的 IIS 网站,如果它本身是 运行 并且它有一个空白绑定。如果不是 运行 则返回错误。这些措施将保护您免受欺骗攻击 such as cache poisoning or spoofing malicious password reset emails。
另请注意,HTTPS 站点不使用主机 header。它们要么直接绑定到单个 IP,要么使用服务器名称指示 (SNI),这是作为 TLS/SSL 握手的一部分发送的,以确定向哪个网站发出请求。 IIS 8 及更高版本支持 SNI,这引入了一个绑定证书,其解释方式与普通 HTTP 的主机 header 相同。请注意,这可以被浏览器端的攻击者以相同的方式欺骗,因为他们可以发送他们想要的任何域名。
但是,Man-In-The-Middle 攻击者无法像使用普通 HTTP 请求那样更改 SNI 信息。这是因为浏览器会检查域名是否与请求的站点匹配,如果不匹配则会警告用户。普通 HTTP 没有这样的身份验证。在使用 HTTPS 的 MITM 场景中,我能想到的唯一攻击是使用通配符证书的攻击,并且 MITM 可以使用户访问与预期不同的站点,并且没有浏览器警告。但是,TLS 握手完成消息哈希不会计算它是否已被 MITM 更改,因此应该可以减轻这种攻击。
根据这篇 MSDN 文章 https://msdn.microsoft.com/en-us/library/ms525396(v=vs.90).aspx,这些变量是基于 headers 设置的。我很好奇 HTTP_HOST 变量是否可欺骗。我已经 运行 一些测试表明它不可欺骗,但我想确定一下。
编辑:为清楚起见,我很好奇服务器代理、中间人或知道如何使用 netcat 的人是否可以伪造适当的 headers 以操纵 HTTP_HOST 在我的脚本中。
是的,它是可恶搞的。
您网站的恶意用户可以在其 HTTP 请求中设置他们想要的任何 host
header,HTTP_HOST
变量将反映:
GET / HTTP/1.1 Host: www.example.com User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
唯一需要注意的是它必须绑定在您的网络服务器上。例如,如果您使用 IIS 网络服务器,您可以指定您的网站绑定到哪些主机。对于 "any" 这可以是空白,或者您可以将其设置为特定的域名。如果是后者,则在攻击者发送
GET / HTTP/1.1 Host: www.foo.com User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
到您的 example.com
域不会访问您的 example.com
网站,但会访问默认的 IIS 网站,如果它本身是 运行 并且它有一个空白绑定。如果不是 运行 则返回错误。这些措施将保护您免受欺骗攻击 such as cache poisoning or spoofing malicious password reset emails。
另请注意,HTTPS 站点不使用主机 header。它们要么直接绑定到单个 IP,要么使用服务器名称指示 (SNI),这是作为 TLS/SSL 握手的一部分发送的,以确定向哪个网站发出请求。 IIS 8 及更高版本支持 SNI,这引入了一个绑定证书,其解释方式与普通 HTTP 的主机 header 相同。请注意,这可以被浏览器端的攻击者以相同的方式欺骗,因为他们可以发送他们想要的任何域名。
但是,Man-In-The-Middle 攻击者无法像使用普通 HTTP 请求那样更改 SNI 信息。这是因为浏览器会检查域名是否与请求的站点匹配,如果不匹配则会警告用户。普通 HTTP 没有这样的身份验证。在使用 HTTPS 的 MITM 场景中,我能想到的唯一攻击是使用通配符证书的攻击,并且 MITM 可以使用户访问与预期不同的站点,并且没有浏览器警告。但是,TLS 握手完成消息哈希不会计算它是否已被 MITM 更改,因此应该可以减轻这种攻击。