对301重定向到HTTPS前遭遇中间人攻击的分析

Posted 皖南笑笑生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对301重定向到HTTPS前遭遇中间人攻击的分析相关的知识,希望对你有一定的参考价值。

由于不能改变用户的输入习惯,很多网站在实现全站HTTPS后,选择通过配置强制301的方式让用户的http请求重定向到https,以保障网站的安全性。然而,在用户发起http请求的时候,仍然存在有中间人攻击的风险,这种方案并非是绝对安全的。下面就结合我们最近亲历的一次中间人攻击,来深入分析下这种劫持行为。
事情的起因,是当我们实现全站HTTPS后,对核心页面都部署了监控任务来分析页面的劫持情况。我们惊讶的发现,虽然劫持率有大幅度的下降,然而仍然存在零星的劫持现象。如下图所示,拨测访问http://www.suning.com/并没有按我们预期的那样301重定向到https://www.suning.com/。而是被302临时重定向到了另一个流量页面。

于是,我们下载了拨测中的抓包文件,进行了分析。如下图所示,是发生劫持的TCP流。


过滤出对应的HTTP流如下所示:

很明显,在客户端和服务端通信的链路上发生了中间人攻击,中间人在服务端响应返回之前迅速返回给客户端一个恶意的报文,报文内容是

http://101.201.79.5:12224/dsgeneral?c=suning1&u=https%3A%2F%2Fsucs.suning.com%2Fvisitor.htm%3FuserId%3D29792464%26webSiteId%3D1800%26adInfoId%3D0%26adBookId%3D104049%26channel%3D14%26vistURL%3Dhttp%3A%2F%2Fwww.suning.com%2F&a=hljheb"

(这个劫持的目的是让用户跳转到https://sucs.suning.com/visitor.htm?userId=29792464&webSiteId=1800&adInfoId=0&adBookId=104049&channel=14&vistURL=http://www.suning.com/,虽然最终也访问回到了网站首页,但是通过推广的链接过来的,后期劫持者可以根据推广号流量来结算获取非法收益)
我们来具体分析下整个劫持过程,首先熟悉下Tcp建立连接三次握手和关闭连接的四次挥手过程:


再来具体分析报文

No  Time    Source  Destination Protocol    Length  Info
# 先开始是TCP三次握手,客户端和服务端正常建连
1002    7.646618    192.168.43.112  221.180.236.216 TCP 66  5495580 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
1028    7.692035    221.180.236.216 192.168.43.112  TCP 66  8054955 [SYN, ACK] Seq=0 Ack=1 Win=14600 Len=0 MSS=1460 SACK_PERM=1 WS=128
1029    7.692128    192.168.43.112  221.180.236.216 TCP 54  5495580 [ACK] Seq=1 Ack=1 Win=65536 Len=0
# 客户端发起http://www.suning.com/请求 Len=645 Seq=1
1032    7.709001    192.168.43.112  221.180.236.216 HTTP    699 GET / HTTP/1.1 
# 注意!这个200响应是中间人返回的恶意报文! Ack=646 Len=481(中间人报文大小481) Seq=1
1067    7.737546    221.180.236.216 192.168.43.112  HTTP    535 HTTP/1.1 200 OK  (text/html)
# 客户端接受了恶意响应,发起四次挥手,关闭Tcp连接, 注意[Fin,Ack] Ack=482=481+1,是对恶意报文的Ack,服务端报文大小不是481这个值的
1094    7.748966    192.168.43.112  221.180.236.216 TCP 54  5495580 [FIN, ACK] Seq=646 Ack=482 Win=65024 Len=0
# 服务端应答[Fin,Ack],但481长度是中间人的报文大小,服务端一脸莫名其妙,所以他的Seq=1,而不是Seq=482(详见四次握手过程)
1099    7.752925    221.180.236.216 192.168.43.112  TCP 54  8054955 [ACK] Seq=1 Ack=646 Win=16000 Len=0
# 客户端纠结了,你为什么不给我Seq=482,于是决定不停重发[Fin,Ack],导致服务端被逼不断强制重新响应请求。整个连接因为完成不了四次挥手一直关闭不了,最终超时后客户端重置
1100    7.752960    192.168.43.112  221.180.236.216 TCP 54  [TCP Dup ACK 1094-1] 5495580 [ACK] Seq=647 Ack=482 Win=65024 Len=0
1101    7.753056    221.180.236.216 192.168.43.112  TCP 210 [TCP Out-Of-Order] 8054955 [PSH, ACK] Seq=1 Ack=646 Win=16000 Len=156
1102    7.753085    192.168.43.112  221.180.236.216 TCP 66  [TCP Dup ACK 1094-2] 5495580 [ACK] Seq=647 Ack=482 Win=65024 Len=0 SLE=1 SRE=157
# 服务端响应的正确报文Ack=646 Len=156(而不是481!) Seq=1
1143    7.817449    221.180.236.216 192.168.43.112  HTTP    210 [TCP Spurious Retransmission] HTTP/1.0 301 Moved Permanently 
1144    7.817487    192.168.43.112  221.180.236.216 TCP 66  [TCP Dup ACK 1094-3] 5495580 [ACK] Seq=647 Ack=482 Win=65024 Len=0 SLE=1 SRE=157
1178    7.885167    221.180.236.216 192.168.43.112  HTTP    210 [TCP Spurious Retransmission] HTTP/1.0 301 Moved Permanently 
...
4729    26.683012   192.168.43.112  221.180.236.216 TCP 54  5495580 [RST, ACK] Seq=647 Ack=482 Win=0 Len=0

最后,我们可以通过时序图让整个过程更清晰:

要解决这种中间人攻击的问题,建议采用HSTS策略,通过307 Internal Redirect来代替301 Move Permanently,详见《电商网站HTTPS实践之路(三)——性能优化篇》
另外,本文中的pcap包我共享在http://download.csdn.net/detail/zhuyiquan/9850246,过滤条件可使用tcp.stream eq 20

以上是关于对301重定向到HTTPS前遭遇中间人攻击的分析的主要内容,如果未能解决你的问题,请参考以下文章

301重定向:删除中间文件夹结构但保留结束文件

iis里URL重写重定向,http做301重定向https

如何使用 301 重定向而不是 302 将 HTTP 站点重定向到 HTTPS 站点

使用 301 或 303 将 http 重定向到 https

HTTP 到 HTTPS 301 重定向代码不起作用,它说重定向太多

最佳实践:301 将 HTTP 重定向到 HTTPS(标准域)