HTTP协议

来自个人维基
跳转至: 导航搜索

目录

 [隐藏

HTTP协议

超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。原本设计用于传输HTML网页,目前协议的应用场景更多了,但万变不离其宗。理解了HTTP协议,就能够掌握万维网通信的标准,从而判断出客户端、服务器等的一系列信息。

HTTP和HTTPS

HTTPS和HTTP一字之差,而这个S代表“Secure”——安全。HTTP不是安全的,而且攻击者可以通过监听和中间人攻击等手段,获取网站帐户和敏感信息等。HTTPS的设计可以防止前述攻击,在正确配置时(当这整句不存在吧)是安全的。

HTTPS的原理如下:

① 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器; ② 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数; ③ 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服务器; ④ 客户端与服务器端根据 pre_master_secret 以及客户端与服务器的随机数值独立计算出加密和 MAC密钥(参考 DH密钥交换算法); ⑤ 客户端将所有握手消息的 MAC 值发送给服务器; ⑥ 服务器将所有握手消息的 MAC 值发送给客户端。

结合目前主流的HTTPS数据包解析工具,不难看出:

工具Fiddle通过中间人攻击,变更网站的SSL证书为自签名证书,完全掌控了整个加密过程。

而工具Burp suit同样类似。要抓取HTTPS数据包,客户端必须安装Burp Suit提供的自签证书,随后的过程与Fiddle相似。(对于安全有所疑虑的同学,可以选择虚拟机进行安装证书的操作,以免自己的计算机有被中间人攻击并通过Burp Suit破译数据包的风险。)

所以,Wireshark不支持HTTPS数据包解析的方法也很明显了:因为Wireshark并没有设计介入客户端的功能。

获取数据包

除了使用专业工具Burp Suit以外,在本地对网站进行调试的过程中,可以通过浏览器自带的开发人员工具获取数据包。以Microsoft Edge(Chrome内核通用)为例,通过开发人员工具的“网络”工具,浏览器能够将数据包的请求数据包、对应的相应数据包、状态码等全部分门别类地显示出来。当然了,作为初学者,最好使用没有自动化工具的浏览器。(比如Opera)

提示:如果你使用Burp Suit通过代理进行数据包的抓取,请尽量使用非工作用、可以设置独立代理的、最好是绿色版的浏览器。

请求数据包

请求数据包由三个部分组成:请求行、请求头与请求数据。

请求数据包的格式如下:

Qqff.png

请求行

请求行一般包括请求方法、请求URL和HTTP协议版本三个信息。

请求方法:

GET:向指定的资源发出“显示”的请求。返回值为指定的资源。

HEAD:获取“关于该资源的信息”。对比GET,返回值不包括资源本身,响应数据包里没有响应数据,只有文件头。一般用于节省资源地判断目标资源的状态。

POST:将本地数据提交到服务器。比如文本框中的内容,或者是文件。多用于上传数据,但也有低效的修改功能。

PUT:将本地对某些数据的修改提交到服务器。比起POST,PUT更加高效。一般会被防火墙拦截

DELETE:请求服务器删除指定的资源。一般会被防火墙拦截

TRACE:回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。

OPTIONS:获取http服务器支持的http请求方法。

CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页,然后把数据返回回来,连接成功后,就可以正常的get、post了。

提示:一般的浏览器仅支持GET和POST请求方法。PUT和DELETE由于具有一定的破坏性,一般会被拦截。

关于请求行的更多研究,可以参考这篇博文:HTTP协议的六种请求方法 - 周伯通的麦田 - 博客园 (cnblogs.com)

请求URL

通过请求URL,我们可以看见

HTTP协议

协议的版本

请求头

请求头一般描述了客户端的属性和一些信息。类型如下表。

Headers.png

表格来源

关于Referer

Referer是一个非常敏感的请求头,它代表了访问页面的来源。根据这个参数,一些网页能够限制访问的来源。

特殊请求头 X-Forward-For

X-Forward-For是一个特殊的请求头,仅对于php web程序有限,是一个判断访问IP地址的请求头。
这个请求头的特殊之处在于,在请求数据包中直接添加,也能大概率骗过php程序,使其检测到的IP地址为数据包中指定的IP。
请求头格式:

X-Forward-For:ip.ip.ip.ip

微信的特殊请求头

微信的自带浏览器在请求包的User-Agent中会添加特殊的识别标志来判断访问系统。当然了,除去NetType参数,也可以用于伪装自己的设备。NetType参数用于判断网络环境。
对不同的测试对象进行区分后,得到以下结论:

  • 安卓
    • Mozilla/5.0 (Linux; Android [系统版本号]; [手机型号,注意格式] ; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/043807 Mobile Safari/537.36 MicroMessenger/[微信版本,如6.6.1.1220(0x26060135)] NetType/[网络环境,如5G、4G,3G,2G,WIFI等] Language/[微信的语言] [如果是小程序访问,还有"miniProgram"字段]
  • iOS
    • Mozilla/5.0 ([默认为iPhone,也可填写"设备型号 Build"。注意,iPhone X的标识为iphone x(全小写)]; CPU iPhone OS [系统版本,比如9_3_2] like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69 MicroMessenger/[微信版本,比如6.2.1,注意和安卓的格式区别] NetType/[网络环境,具体见上] Language/[微信的语言]

具体的研究可以看这里:
传送门

请求数据

一般,请求数据与请求头之间有一行空行作为请求数据的标识。

返回数据包

返回数据包主要包括:状态行、响应头标和响应数据。

主要结构如图:

HTTP.jpg

状态行

状态行通常包括协议版本、状态码和状态描述。

状态码

状态码的分类如下图:

Codeshttp.png

状态码表:

Ztmb.png

表格来自:HTTP状态码 | 菜鸟教程 (runoob.com)

状态码的特殊运用

状态码可以反映服务器上的某个页面的状态。配合常见的网站后台字典,通过穷举法,理论上能够快速获取网站的后台地址。例如Web Path Brute工具或者“御剑”系列工具等。

响应头标

包括了服务器的一些信息。类型表如图

Sops.png

表格来自:HTTP 响应头信息 | 菜鸟教程 (runoob.com)