【23-07-03:HTTP协议的结构学习】


HTTP协议主要分为请求和响应两部分。请求和响应都是采用标准的HTTP格式,分为“头(header)”和“体(Body)”两部分,使用单独的一行空行来隔开。请求头和响应头都是必需的(在HTTP/0.9,没有响应头,不做讨论),而请求体和响应体则可以缺省

在这里插入图片描述

HTTP 请求的结构

HTTP 请求的整体架构

在这里插入图片描述

请求方法(Method)

请求方法体现了本次请求的目的

方法名说明
GET最为常见的方法,单击链接打开网页通常使用的都是GET方法,表示一次普通的请求
POST提交数据时常用POST方法,主要用于登录、提交表单、上传文件等
OPTIONS返回服务器针对特定资源所支持的HTTP请求方法
HEAD与GET请求基本一致,但不返回响应体
PUT早期用于向服务器上传文件,后来被RESTFul架构所重用,用来更新资源
DELETE早期用于删除服务器上指定文件,后来被RESTFul架构所重用,用来删除资源
TRACE回显服务器收到的请求,主要用于调试和诊断
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
  • 此外,被许多服务器认可的方法还有:ACL、CANCELUPLOAD(cancelupload),CHECKOUT、COPY、LOCK、MKCALENDAR、MKCOL、MOVE、UPDATE、SEARCH等

请求路径(URI)

(URI表示了请求的资源路径。)
(统一资源标识符(Uniform Resource Identifier,URI))

  • 请求方法与URI之间是以若干个空格或TAB(制表符)来分隔的,通常是一个空格
  • 传统架构下,URI对应了网站目录结构。在新型的web架构下,会配置Web路由,根据URI映射不同的处理接口。当服务器被配置为HTTP代理时,这里通常是一串形如“http://xxxx”或“http://xxxxx”的数据。但在一般情况下,这里都是一串以“/”开头的资源路径。若所请求的资源是该服务器主页时,往往写作“/”即网站根目录,这时Web Server会根据当前的配置返回默认的首页,通常是”/index.html“或”/index“等。

GET 参数(Parameters for GET)

GET参数通常是一些细化请求的描述

  • 例如:文章id、页码、请求时间等。MVC架构主要以GET参数作为请求路径和接口对应。在URI之后如果还需要提交 GET 参数会以"?"作为分割符,在问号之后是一串参数序列。
  • 特殊情况下,如果请求的是首页并且存在“?”,此时“/”可以缺省,但是这个特性仅限于Apache服务器,Nginx则不行。
  • “?”后面的一串参数序列也有特定的格式约束,总体来说是以“&”作为不同参数的分割。每个参数由“key=value”的形式组成,key和value以第一个“=”划分。当参数出现数组时,以"key[name]=value"的形似进行提交。

协议说明(Protocol)

协议说明表示了当前请求使用的协议和版本。

  • 以“HTTP/”开头,然后加上版本号,例如“HTTP/1.1”。URI(没有GET参数的情况)或GET参数与协议说明之间也是采用若干个空格或TAB(制表符)分割的,通常是一个空格。
  • 到这里,第一行的内容已经结束了,此时一般需要一个“\r\n”作为换行符,之后的几行是HTTP请求的头部字段,各字段之间的换行符默认均为“\r\n”,在一些Web Server中也是支持单独的“\n”.

头部字段(Headers)

头部字段说明了本次请求的域名(HOST)、使用的浏览器(User-Agent)以及Cookie等。头部字段有很多,下面列举几个常见的

字段名说明
Host指定所访问的域名,对于一台服务器搭建了多个网站的情况,Web Server 依据Host不同来决定分别交给哪个网站应用来处理请求。一般所说的修改本机Host文件,在HTTP请求中也可以通过修改HTTP包中的Host字段来完成
Referer当由一个页面A 单击超链接跳转到另外一个页面B,或通过提交表单到另外一个页面时,浏览器会自动将页面A的URL放在请求B页面的Referer字段中,这个字段主要时是告诉服务器这个请求时哪里来的。
User-Aagent浏览器特征说明会告诉服务器当前用户所用的操作系统以及浏览器的类型和版本号,方便网站呈现在适合当前用户的前端展示效果
Cookie这个字段十分重要,它会用来存储一些用户的状态,服务器通过读取这个字段可以清楚地了解用户当前地身份信息以及其他状态信息。

请求体(Body)

GET请求通常没有请求体,而POST请求通常会有。

  • 注意,这里使用了了两个“通常”,表示都不是绝对地。HTTP协议地任何字段都是可以人为修改的,这也是我在接触和学习web安全非常重要的心得体会,不少漏洞正是存在这样的修改之中。
  • 请求体主要用于提交大量不便于在请求头中传递的信息,之所以不便于在请求头中传递,主要是受长度限制和字符编码等因素影响,另外,如密码之类的信息,也比较适合放在请求体中传递,能够起到一定的保护作用。请求体的应用常见于POST方式提交的请求中。

HTTP 响应的结构

在这里插入图片描述

协议说明(Protocol)

  • 协议说明用于说明当前响应是基于HTTP协议的哪一个版本,通常以“HTTP/”开头,后面加协议版本号,如:“HTTP/1.1”

状态码(StatusCode)与状态说明(StatusDescription)

  • 这个字段相当重要,它说明了当前请求执行的结果。对有些漏洞的检测就是以响应状态码来判断的,比如大家熟知的“200 OK”"404 Not Found"等,常见的状态码及说明如下表
    在这里插入图片描述
状态码状态码说明中文说明
100Continue继续。常见于服务器接收大文件上传
101Switching Protocol切换协议。一般用于HTTP协议升级,在HTTP/1.1转向HTTP/2.0中使用较多
200OK一切正常。这是最为常见的状态码、
201Created创建成功。在PUT文件成功后会提示
301Moved Permanently永久跳转。网站永久跳转的新地址。在HTTP请求转为HTTPS时经常遇到
302Moved Temporarily临时跳转。一般用于登录等功能,常见于URL跳转
304Not Modified未改动。说明网站启用了缓存服务,与头部字段中的Cache-Control 字段信息相关,与安全也有联系。
400错误。常见于构造后的HTTP数据包不被Web Server 认可,是一个非常重要的状态码
401Unauthorized未授权。一般出现该请求头说明需要进行HTTP身份认证。HTTP身份认证是直接与Web Server 做登录交互,与普通的网站登录是有区别的。在某些Web Server 管理界面(如Tomcat),保留了HTTP认证的方式
403Forbidden禁止浏览。在目录浏览漏洞中会介绍
404Not Found找不到。请求的资源不存在,这是除200以外,日常生活中遇到最多的状态码
405Method Not Allowed方法不被允许。通常是指请求最开始的方法,如GET,POST,有些网站不允许使用GET方法访问POST接口
500Internal Server Error服务器内部错误。说明服务器执行的程序出现问题。开发人员经常和它打交道,在反序列化漏洞中会经常遇到
502Bad Gateway网关错误。通常是域名没有配置正确或提交的Host字段有错误造成的
  • HTTP状态码与安全息息相关。在漏洞挖掘中,不同的状态码表达了不同的服务器内部情况,细心的人往往能通过服务器细微的变化来感知漏洞是否存在。

头部字段(Header)

  • 这一点与请求基本类似,但略有区别。服务器响应中的头部字段Server 往往会包含服务器的Banner信息,从这一字段可以看出服务器使用的软件和版本号。此外,有一些响应的头部字段还约束者前端漏洞是否存在,是否能够被大范围利用。

响应体(Body)

  • 响应头与响应体以一个独立的换行作为分割。对于大多数网站来说,主要采用HTML语言返回内容。HTML的中文全称为超文本标记语言。超文本是一种组织信息的方式,它通过超级链接方法将文本中的文字、图表与其他信息媒体相关联,HTML采用的是以左右尖括号包裹的标签和标签对的形式。浏览器会对HTML语言进行解析,解析完成之后,原本普通的标签文本就变成了文字、图片、链接、视频等多种元素混合的、丰富多彩的网页。除了HTML形式以外,还有二进制流数据(octet-stream),这种格式下会直接传递二进制字节信息,主要场景是文件下载;JSON格式主要用于AJAX架构的数据交互;还有XML格式以及基于XML的SOAP格式等。

HTTP 协议的交互

  • 相比于TCP协议,HTTP协议的交互要简单得多,因为连接已经建立,不需要再“握手”和“挥手”了。HTTP协议基于采用“一问一答”的形式,即客户端发送一个HTTP请求(Request),服务器端返回了一个HTTP响应(Response)
  • 在弄清楚HTTP协议和TCP协议的关系时,需要掌握以下几点
  • 1、一个HTTP报文可能存在多个TCP分片
有些请求或响应中,由于内容过长,导致被TCP分到了多个不
同的分片
  • 2、一次TCP会话可能含有多个HTTP报文
  • 完成“三次握手”之后,连接发送了多次GET请求,这些请求时属于同一个TCP会话的。
  • 3、 一份HTTP报文可能包含多个HTTP请求或响应
  • 在这里直接将HTTP协议简单拼接,把三次请求放在同一个数据包内。但是,这样的请求服务器端未必当作三次来响应。