文章目录
- 1 HTTP请求
- 2 HTTP响应
- 3 HTTP方法
- 4 URL
- 5 HTTP消息头
- 5.1 常用消息头
- 5.2 请求消息头
- 5.3 响应消息头
- 6 cookie
- 7 状态码
- 8 HTTP代理
- 9 HTTP身份验证
HTTP(HyperText Transfer Protocol,超文本传输协议)是访问万维网使用的核心通信协议,也是今天web应用程序使用的通讯协议。
HTTP使用一种基于消息的模型:客户端发出一条请求消息,而后由服务端返回一条响应消息。
1 HTTP请求
所有HTTP消息(请求与响应)中都包含一个或几个单行显示的消息头,然后是一条强制空白行,最后是消息主体(可选)。以下是一个典型的HTTP请求(部分):
每个HTTP请求的第一行都由3个以空格相隔的项目组成:
- 一个说明HTTP方法的动词。最常见的方法是GET,它的主要作用是从web服务器获取一个资源。GET请求并没有消息主体,因此在消息头后的空行中没有其他资源。
- 所请求的URL。该URL通常由所请求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成,查询字符串以?字符标识。
- 使用的HTTP版本。
其他要点如下:
- Referer消息头表示发出请求的原始URL;
- User_Agent消息头提供与浏览器或其他生成请求的客户端软件相关的信息。请注意,由于历史原因,大多数浏览器都包含Mozilla前缀。
- Host消息头用于指定出现在被访问的完整URL中的主机名称。如果几个web站点以相同的一台服务器为主机,就需要使用Host消息头,因为请求第一行中的URL内通常并不包含主机名称。
- Cookie消息头用于提交服务器向客户端发布的其他参数。
2 HTTP响应
以下是一个典型的HTTP响应:
每个HTTP响应的第一行由3个以空格间隔的项目组成。
- 使用的HTTP版本。
- 表示请求结果的数字状态码。200是最常见的状态码,它表示成功提交了请求,正在返回所请求的资源。
- 一段文本形式的“原因短语”,进一步说明响应状态。
响应示例的其他一些要点如下:
- Server消息头中包含一个旗标,指明所使用的web服务器软件。有时还包含其他消息,如所安装的模块和服务器操作系统,其中包含的信息可能并不准确。
- Set-cookie消息头向浏览器发送另一个cookie,它将在随后向服务器发送的请求中由Cookie消息头返回;
- Pragma消息头指示浏览器不要将响应保存在缓存中。Expires消息头指出响应内容已经过期,因此不应保存在缓存中。当返回动态内容时常常发送这些指令,以确保浏览器随时获得最新内容。
- 几乎所有的HTTP响应在消息头后的空白行下面都包含消息主体,Content-Type消息头表示这个消息主体中包含一个HTML文档。
- Content-Length消息头规定消息主体的字节长度。
3 HTTP方法
当渗透测试人员攻击Web应用程序时,几乎肯定会遇到最常用的方法:GET和POST。
- GET方法的作用在于获取资源。它可以用于URL查询字符串的形式向所请求的资源发送参数。
- POST方法的主要作用是执行操作。使用这个方法可以在URL查询字符串与消息主体中发送请求参数。
此外,还有其他方法:
- HEAD。这个方法的功能与Get方法相似,不同之处在于服务器不会在其响应中返回消息主体。服务器返回的消息头应与对应GET请求的消息头相同。这种方法可用于检查某一资源在向其提交GET请求前是否存在。
- TRACE。这种方法主要用于诊断,服务器应在响应主体中返回其收到的请求消息的具体内容。这种方法可用于检测客户端与服务器之间是否存在任何操纵请求的代理服务器。
- OPTIONS。这种方法要求服务器报告对某一特殊资源有效的HTTP方法。服务器通常返回一个包含ALLOW消息头的响应,并在其中列出所有有效的方法。
- PUT。这个方法试图使用包含在消息主体中的内容,向服务器上传指定资源。
4 URL
URL(Uniform Resource Locator,统一资源定位符)是标识web资源的唯一标识符,通过它即可获取其标识的资源。最常用的URL格式如下:
5 HTTP消息头
HTTP支持许多不同的消息头,一些消息头可用在请求与响应中,而其他一些消息头只能专门用在某个特定的消息中。
5.1 常用消息头
- Connection:这个消息头告诉通信的另一端,在完成HTTP传输后是关闭TCP连接,还是保持连接开放以接受其他消息。
- Content-Encoding:这个消息头为消息主体中的内容指定编码形式。为了尽快传输,特指传输之前的编码方案。
- Content-Length:这个消息头用于规定消息主体的字节长度。(HEAD语法的响应例外,它在对应的GET请求的响应中指出主体的长度)
- Transfer-Encoding:这个消息头指的是传输时使用的编码形式。
5.2 请求消息头
- Accept:这个消息头用于告诉服务器,客户端愿意接受哪些内容,如图像类型等。
- Accept-Encoding:这个消息头用于告诉服务器,客户端愿意接受哪些内容编码(对应Content-Encoding)。
- Authorization:这个消息头用于为一种内置HTTP身份验证向服务器提交证书。
- Cookie:这个消息头用于向服务器提交它之前发布的cookie。
- Host:这个消息头用于指定出现在所请求的完成URL中的主机名称。
- IF-Modified-Since:这个消息头用于说明浏览器最后一次收到所请求的资源的时间。如果自那以后资源没发生变化,服务器就会发出一个带状态码304的响应,指示客户端使用资源的副本。
- IF-None-Match:这个消息头用于指定一个实体标签。实体标签是一个说明消息主体内容的标识符。当最后一次收到所请求的资源时,浏览器提交服务器发布的实体标签,服务器可以使用实体标签确认浏览器是否使用资源的缓存副本。
- Origin。这个消息头用在跨域Ajax请求中,用于指示提出请求的域。
- Referer。这个消息头用于指示提出当前请求的原始URL。
- User-Agent。这个消息头提供域浏览器或生成请求的其他客户端软件有关信息。
5.3 响应消息头
- Access-Contro-Allow-Origin。这个消息头用于指示是否通过跨域Ajax请求获取资源。
- Cache-Control。这个消息头用于向浏览器传送缓存指令。
- ETag。这个消息头用于指示一个实体标签,客户端可在将来的请求中提交这个标识符,获得和IF-None-Match消息头相同的资源,通知服务器浏览器当前缓存中保存的是哪个版本的资源。
- Expires。这个消息头用于向浏览器说明消息主体内容的有效时间。在这个时间之前,浏览器可以使用这个资源的缓存副本。
- Location。这个消息头用于在重定向(那些状态码以3开头的响应)中说明重定向的目标。
- Pragma。这个消息头用于向浏览器传送缓存指令。
- Server。这个消息头提供所使用的web服务器软件的相关信息。
- Set-Cookie。这个消息头用于向浏览器发布cookie,浏览器会在随后的请求中将其返回给服务器。
- WWW-Authenticate。这个消息头用在带401状态码的响应中,提供于服务器所支持的身份验证类型有关的信息。
- X-Frame-Options。这个消息头指示浏览器框架是否及如何加载当前响应。
6 cookie
服务器使用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器。具体而言,服务器使用Set-Cookie响应消息头发布cookie:
然后,用户的浏览器自动在随后的请求包中添加cookie消息头发给服务器:
cookie一般由一个名/值对构成,但也可包含任何不含空格的字符串。可以在服务器响应中使用几个Set-Cookie消息头发布多个cookie,并可在一个cookie消息头中用分号分隔不同的cookie,将它们全部返回给服务器。
7 状态码
每个HTTP响应消息都必须在第一行包含一个状态码,说明请求结果。根据状态码的一个位数字,可将状态码分为以下5类。
- 1XX——提供信息。
- 2XX——请求被成功提交。
- 3XX——客户端被重定向到其他资源。
- 4XX——请求包含某种错误。
- 5XX——服务器执行请求时遇到错误。
8 HTTP代理
HTTP代理服务器是一个协调客户端浏览器于目标web服务器之间访问的服务器。当配置浏览器使用代理服务器时,它会将请求提交到代理服务器,代理服务器再将请求传送到相关web服务器,并将响应返回给浏览器。
值得注意的是,如果使用代理服务器,HTTP的工作机制会出现两方面的差异:
- 当浏览器向代理服务器发布HTTP请求时,它会将完整的URL(包括协议前缀http://与服务器主机名称,在非标准URL中,还包括端口号)插入到请求中。代理服务器将提取主机名称和端口,并使用这些信息将请求只想正确的目标web服务器。
- 当使用HTTPS时,浏览器无法与代理服务器进行SSL握手,浏览器必须将代理作为一个纯粹的TCP级中继,由代理传递浏览器与目标web服务器之间的所有网络数据,并与浏览器进行正常的SSL握手。
9 HTTP身份验证
HTTP拥有以下机制用户身份验证机制:
- Basic。这是一种非常简单的身份验证机制,它在请求头中以Base64编码字符串的形式发送用户证书。
- NTLM。一种质询-响应式机制,它使用某个windows NTLM协议版本。
- Digest。一种质询-响应式机制,它随同用户证书一起使用一个随机值MD5校验和。
❗️❗️❗️因特网上的web应用程序基本很少使用这些身份验证机制。