您的位置:首页 >资讯列表 > 正文
发布时间:2021-03-12 16:41
天天给App 抓包,HTTP 代理是什么弄懂了吗?

  一、前言

  在HTTP协议中,最基本的是请求和响应消息,消息由消息头和消息实体组成。超文本传输协议的大多数使用场景取决于设置不同的超文本传输协议请求/响应的报头。

 

  既然要说代理,那就先以问两个问题为主线,从问题来解释HTTP代理。

 

  数据包捕获工具如何实现HTTP数据包捕获?

 

  对于HTTPS流量,在没有安装证书的情况下,通过包抓取工具的请求和响应仍然是正常的。

 

  现在的HTTP代理更多的是一个抽象的概念,其中原理是最关键的。

 

  二、HTTP代理

 

  2.1什么HTTP代理?

 

  说到HTTP代理,作为一个客户端开发,最熟悉的就是在使用FiddlerCharles等工具抓取包的时候,需要在手机上挂一个代理,方便我们排查一些网络问题,这只是代理的众多使用场景之一。

 

  其实HTTP代理(Web  proxy)是存在于网络中间的实体,可以提供各种功能。如果没有HTTP代理,客户端会直接与终端服务器交互。有了HTTP代理,客户端可以和代理通信,然后代理代表客户端和服务器交互。

 

  HTTP代理是最容易理解的概念,最贴近我们的生活。在我们的生活中,有各种各样的代理服务。

 

  比如你和女朋友要出国旅游,你需要在一些忍不住签的国家提前申请签证。我们不熟悉,自然觉得过程很复杂。这个时候可以选择旅行社办理签证。你只需要按照对方提供的清单准备材料,就可以非常方便的拿到签证。在这个过程中,你节省了时间,而旅行社给你赚了一点钱。

 

  每天抢App的套餐。你明白什么是HTTP代理吗?|实用HTTP

 

  代理服务是代表客户完成交易的中间人。它接管客户端的事务,而不是客户端与服务器交互。

 

  代理服务是一个抽象的中间实体,可以存在于网络的各个中间点,如浏览器、路由器、代理服务器、Web服务器的反向代理等。

 

  2.2 http代理的分类

 

  从最熟悉的包抓取工具开始,FiddlerCharles等包抓取工具都是打包得非常好的,即使我们完全不了解HTTP代理的细节,也可以通过简单的配置就可以使用。在使用过程中,你会发现两种情况:

 

  对于HTTP协议请求,您可以直接显示请求/响应消息的详细信息

 

  对于HTTPS,如果没有导入证书,请求仍然可以发送到服务器,数据可以正常返回,但不会显示消息详细信息。

 

  没有进口证明,我们无法知道HTTPS请求的细节,但这并不影响我们的请求和响应。

 

  这两种不同的表示也对应于两种不同的HTTP代理:

 

  总代理。基于修订后的RFC  2616,在HTTP/1.1中定义。这种代理人扮演着“中间人”的角色。对客户端来说是服务器,对真正的服务器来说是客户端,负责在两端之间传输HTTP消息。

 

  隧道特工。这种基于TCP协议的隧道代理通过HTTP协议的CONNECT方法完成通信,在HTTP模式下实现任何基于TCP的应用层协议代理。

 

  接下来,我们将分别解释这两个代理。

 

  2.3总代理

 

  普通代理理解起来并不复杂。它是网络中的中间实体,位于客户端和服务器之间,起着“中间人”的作用,在两端之间来回传递消息。

 

  这个“中间人”左手握客户,右手握服务器。当接收到客户端发送的请求消息时,他需要正确处理请求和连接状态,并向服务器发送新的请求。收到响应后,他将响应结果打包到一个响应体中,并将其返回给客户端。

 

  每天抢App的套餐。你明白什么是HTTP代理吗?|实用HTTP

 

  在普通代理的过程中,代理双方可能都没有意识到“中间人”的存在。

 

  比如我们想访问A网站,实际上是向代理服务器发送请求,代理服务器再向A网站发送请求,最后通过代理服务器将响应体返回给我们。从我们的角度来看,我们通常向网站服务器发送请求,对方也向我们返回正确的数据。在这个过程中,作为客户端,我会认为代理服务器是A网站的服务器,A网站的服务器认为代理服务器是真实的用户。

 

  这里说代理服务器可以隐藏自己作为“中间人”的存在,但是如果我们是一个“守规矩”的代理服务器,想把客户端的IP传给服务器,我们可以通过用户定义的Header  X-forward-IP告诉服务器客户端的真实IP地址。作为一种松散的协议,当服务器收到请求头X-Forwarded-IP时,HTTP协议无法验证其真实性。可能是代理服务器伪造的,也可能是真的。所以服务器从HTTP头获取IP时,需要格外小心。

 

  普通的代理很好理解,但也有缺陷。它只适用于HTTP协议。

 

  在普通的代理模式下,所有请求和响应的数据都是透明的,可以对经纪人随意操作,这会带来各种数据安全隐患。

 

  说到网络数据安全,首先想到的是HTTPS,但HTTPS这个证书认证机制也是中间人劫持的克星。严格来说,HTTPS治下不存在中间人攻击,除非是人为失误,证书没有严格把关,或者证书被泄露。

 

  在普通的HTTPS请求中,服务器不验证客户端的证书,中间人可以以服务器为客户端完成TLS握手。但是,因为代理没有证书密钥,所以无法伪造服务器和客户端简历之间的TLS连接,这将导致请求失败。

 

  在这种场景下,在标记包捕获工具的工作流程中,您会发现,如果您想使用Charles(Fiddler)捕获HTTPS网络数据包,您需要在手机上安装Charles  CA证书,以便手机设备可以信任该证书,然后才能完成包捕获。此时你采取的是普通代理的模式。

 

  另一方面,如果查尔斯提供的证书没有安装在手机上,并且请求和响应不受影响,查尔斯就无法解密HTTPS数据。这是怎么做到的?

 

  这需要使用隧道代理。

 

  2.4隧道代理

 

  隧道代理,也称为Web隧道,可以通过HTTP连接发送非HTTP流量,从而使其他协议的数据可以通过HTTP承载。

 

  隧道代理是利用HTTPCONNECT方法建立的。CONNECT方法最初并不是HTTP/1.1的核心规范,但却是一种广泛使用的扩展。只有在2014年发布的HTTP/1.1修订版中,CONNECT和隧道代理才有明确的描述。

 

  HTTP隧道代理的工作流程是怎样的?

 

  在一个普通的HTTP请求中,报头部分被标记为两个连续的CRLF(\r\n)。如果它后面有任何内容,它就是内容部分的内容,也称为请求/响应正文。如果有内容,有必要在标题中添加内容长度来标记内容部分的长度。接收器(服务器)将根据该长度读取数据。“连接”消息的请求没有内容,只有“请求行”和“标头”,它们仅由代理服务器使用,不会传输到终端服务器。一旦请求的报头部分结束(两组连续的CRLF),它后面的所有数据都被视为应该转发到终端服务器的数据,代理需要直接转发它们,而没有任何长度限制,直到来自客户端的TCP读取通道关闭。

 

  在代理服务器和终端服务器建立连接后,CONNECT的响应消息可以向客户端返回一个状态码200 Connect,表示与终端服务器的连接建立成功。一旦建立的200连接的报头部分完成(两组连续的CRLF),它后面的所有数据将是远程服务器返回的数据。同样,代理服务器会直接将终端服务器的数据转发给客户端,直到终端服务器的TCP读通道关闭。

 

  每天抢App的套餐。你明白什么是HTTP代理吗?|实用HTTP

 

  了解了HTTP隧道的工作流程后,我们知道了CONNECT方法是请求隧道网络管理器创建一个到任意目的服务器和端口的TCP连接,在客户端和服务器之间盲目转发后续数据而不动脑。

 

  通过隧道代理,代理服务器不再充当中间人,不再需要重写浏览器的请求,而是将浏览器和终端服务器的数据原样转发,让浏览器直接与终端服务器进行TLS握手,传输加密数据。

 

  2.4在进口证书后,查尔斯掌握了HTTPS进程

 

  Charles作为一个包抓取工具,在手机上没有导入证书的情况下,保证了通过隧道代理的数据传输。一旦证书导入,查理斯再次切换到普通代理的工作模式,然后我们就可以分析HTTPS的流量数据了。

 

  下面简单说明一下原理。

 

  导入证书后,手机在请求时会信任查尔斯的伪造证书,查尔斯会伪装成真实的客户端,与服务器建立正确的TLS连接。此时,查尔斯充当“中间人”,两端TLS流量都可以解密。

 

  第三,总结时刻

 

  这里我们知道HTTP代理的细节,其实是一个抽象的概念,很好理解。

 

  简单来说,HTTP代理可以分为两类,普通代理和隧道代理。普通代理人作为“中间人”存在。在请求中,客户端以纯文本形式请求代理服务器,代理服务器收到请求后,以纯文本形式请求终端服务器。在整个过程中,数据都是明文传输的,中间人可以重写传输的数据。这就是著名的中间人攻击,说明它是多么的不安全。

 

  这导致隧道代理支持HTTPS。此时,代理服务器不再充当中间人,不能重写客户端的请求。相反,它只是通过已建立的隧道将客户端的请求转发给终端服务器。


上一篇 高匿HTTP代理ip的好处