如果可以让浏览器向http://targetaddress.com/whatever
. 浏览器默认会发出一个普通的 HTTP 请求,而不是 HTTPS 请求,因为 没有缓存响应/whatever
,只有/
.
这可以通过多种方式实现。一种方法是在浏览器和通过纯 HTTP 访问的任何网站之间进行 MITM 并插入<img>
标签。另一种方法是通过社交工程欺骗用户targetaddress.com/whatever
在地址栏中输入。
一旦浏览器向目标域发出明文请求,MITM 就赢得了比赛。
HTTP 使客户端能够对实体执行操作。执行哪个操作取决于请求中指定的 HTTP方法。对哪个实体执行操作取决于请求中指定的URL。
不同的URL可以引用同一个实体,但浏览器不知道这一点。当浏览器缓存 HTTP响应时,它会针对给定的URL进行缓存。
http://www.target.com/
是一个网址。http://target.com/
是另一个。http://www.target.com/whatever
又是一个。也是如此http://www.target.com/?
。
现在,假设http://www.target.com/
浏览器中有一个缓存条目。这是否意味着上面列出的任何其他URL都有一个?不,不是的。
因此,回到这个问题,让浏览器在 HTTP 端口上的 Web 应用程序返回永久重定向的情况下发送纯文本请求是制作一个与缓存条目不匹配的URL并欺骗用户访问此URL。
证明这个有效:
127.0.0.1 - - [13/Apr/2016:10:01:17 +0200] "GET / HTTP/1.1" 301 226 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:01:35 +0200] "GET / HTTP/1.1" 301 226 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:02:10 +0200] "GET /whatever HTTP/1.1" 301 234 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:02:36 +0200] "GET /whatever HTTP/1.1" 301 234 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:08:16 +0200] "GET / HTTP/1.1" 301 226 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:08:25 +0200] "GET /? HTTP/1.1" 301 227 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
即使为所有内容配置了永久重定向,我也能够使用相同的浏览器向同一个网站发出六个(任意数字)明文 HTTP 请求。(不,我没有清除浏览器的缓存!)
解决永久重定向的其他明显方法包括诱使用户切换到匿名浏览器模式(无缓存)或切换到另一个浏览器(“我在使用 IE 访问应用程序时遇到问题。你能看看吗?”)。