HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是访问万维网使用的核心通信协议,也是今天所有Web应用程序使用的通信协议。
HTTP是一种基于消息的模型:客户端发送出一条请求消息,而后由服务器返回一条消息。
HTTP请求
GET http://www.yanghelong.top/skins/Casper/js/common.min.js?1602727597090 HTTP/1.1
Host: www.yanghelong.top
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: */*
Referer: http://www.yanghelong.top/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: LATKE_SESSION_ID=1z8oYapHEN1TcsZa
每个HTTP请求的第一行都由三个以空格间隔的项目组成:
- HTTP请求方法:常用的GET,POST。
- 请求的URL:URL通常由请求的资源名称和提交的参数。
- HTTP版本
其他组成部分:
- Referer消息头用于表达发出请求的原始URL
- User-Agent消息头提供与浏览器或其他生成请求的客户端软件有关的信息。
- Host消息头用于指定出现在被访问的签证URL中的主机名称
- Cookie消息头用于提交服务器向客户端发送的其他参数
HTTP响应
HTTP/1.1 200 OK
Server: nginx/1.19.1
Date: Thu, 15 Oct 2020 02:52:19 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
set-cookie: LATKE_SESSION_ID=1z8oYapHEN1TcsZa; Path=/; HTTPOnly
Content-Length: 56614
<!DOCTYPE html>
<html>
<head>
......
每个HTTP响应的第一行都由三个以空格间隔的项目组成:
- HTTP版本
- 请求结果状态码
- 文本形式的响应状态
其他组成部分:
- Server消息头包含一个旗标,指明所使用的Web服务器软件,有时还包含服务器的其他信息。
- Set-Cookie消息头向浏览器发送另一个Cookie,它将在随后向服务器发送的请求中由Cookie消息头返回
- Content-Length消息头表明消息主体的字节长度
HTTP方法
| HTTP方法 | 用途 | 解析 |
|---|---|---|
| GET | 获取资源 | 用URL查询字符串的形式向请求的资源发送参数 |
| POST | 执行操作 | 在URL查询字符串与消息主体中发送请求参数 |
| HEAD | 与GET类似 | 服务器不会在其响应中返回消息主体,可用于检测某一资源在向其提交GET请求前是否存在 |
| TRACE | 诊断 | 服务器在响应主体中返回其收到的请求消息的具体内容,可用于检测客户端与服务器之间是否存在任何操纵请求的代理服务器 |
| OPTIONS | 要求服务器报告对某一特殊资源的有效地HTTP方法 | 服务器通常返回一个包含Allow消息头的响应,并在其中列出所有有效地方法 |
| PUT | 使用包含在请求主体中的内容,向服务器上传指定的资源 | 如果激活这个方法,渗透测试员就可以利用它来攻击应用程序 |
URL
URL(Uniform Resource Locator,统一资源定位符)是表示Web资源的唯一标识符,通过它即可获取其标识的资源。常用的URL格式如下:
protocol://hostname[:port]/[path/]file[?param=value]
REST
表述性状态转移(REST,Representational State Transfer)是分布式系统的一种体系架构,在这类体系架构中,请求和响应包含系统资源当前状态的表示。万维网,包括HTTP协议和URL格式中使用的核心技术,均符合REST体系架构的风格。
消息头
常用消息头
| Cnnection | 告诉通信的另一端,在完成HTTP传输后是关闭TCP连接,还是保持连接开发以接受其他消息 |
|---|---|
| Content-Encoding | 为消息主体中的内容指定编码格式 |
| Connection-LEngth | 规定消息主体的字节长度 |
| Content-Type | 规定消息主体的内容类型 |
| Transfer-Encoding | 指定为方便其通过HTTP传输而对消息主体使用的任何编码 |
请求消息头
| Accept | 告诉服务器,客户端原意接受那些内容 |
|---|---|
| Accept-Encoding | 告诉服务器,客户端愿意接受那些内容编码 |
| Authorization | 为一种内置的HTTP身份验证向服务器提交证书 |
| Cookie | 向服务器提交它之前发布的cookie |
| Host | 制订出现在骑牛的完整URL中的主机名称 |
| If-Modified-Since | 用于说明浏览器最后一次收到所请求的资源的事件。如果那之后资源没有发生变化,服务器就会发出一个带有状态码304的响应,指示客户端使用资源的缓存副本 |
| If-None-Match | 指定一个实体标签。实体标签是一个说明消息主体内容的标识符。当最后一次收到所请求的资源时,浏览器提交服务器发布的实体标签。服务器可以使用实体标签确定浏览器是否使用资源的缓存副本 |
| Origin | 用在跨域ajax请求中,用于指示提出请求的域 |
| Referer | 指示提出当前请求的原始URL |
| User-Agent | 提供与浏览器或生成请求的其他客户端团建有关的信息 |
响应头
| Access-Control-Allow-Origin | 指示可否通过跨域ajax请求获取资源 |
|---|---|
| Cache-Control | 用于向浏览器传送缓存执行 |
| ETag | 指定一个实体标签。客户端可在将在的请求中提交这个标识符,获得和If-None-Match消息头中相同的资源,通知服务器浏览器当前缓存的是哪个版本的资源 |
| Expires | 向浏览器说明消息主体内容的有效时间。在指责格事件之前,浏览器可以使用这个资源的缓存副本 |
| Location | 用于重定向响应(状态码以3开头的响应)中说明重定向的目标 |
| Pragma | 向浏览器传送缓存指令 |
| Server | 提供所使用的Web服务器软件的相关信息 |
| Set-Cookie | 向浏览器发布cookie,浏览器会在随后的请求中将其返回给服务器 |
| WW_Authenticate | 用在带有401状态码的响应中,提供与服务器所支持的身份验证类型有关的信息 |
| X-Frame-Options | 只是浏览器矿建是否及如何加载当前响应 |
Cookie
Cookie 是大多数 Web 应用程序所依赖的HTTP协议的一个关键组成部分,攻击者常常通过它来利用Web应用程序中的漏洞。服务器使用cookie 机制向客户端发送数据,客户端保存 cookie 并将其返回给服务器。
cookie 一般是由一个 键值对构成,但也可能包含任何不含空格的字符串。可以在服务器响应中使用几个 Set-Cookie 消息头发送多个 cookie,并可在统一个 cookie 消息头中用分号分隔不同的 cookie ,将他们全部返回给服务器。
除了 cookie 的实际值,Set-Cookie消息头还可包含以下可选属性:
- expires : 用于设定 cookie的有效时间。这样会使浏览器将 cookie 保存在永久性的存储器中,在随后的浏览器会话中反复利用,指导到期时间位置。如果没有这个属性,cookie 仅用在当前会话中。
- domain : 用于指定 cookie 的有效域。这个域必须和收到的 cookie域相同,或者是它的父域。
- path : 用于指定 cookie 的有效 URL 路径。
- secure : 设置这个属性,将无法通过客户端的 JavaScript 直接访问 cookie 。
状态码
每个 HTTP 响应第一行都包含一个状态码,说明请求的结果。状态码可分为五类:
- 1xx : 提供信息
- 2xx : 请求被成功提交
- 3xx : 客户端被重定向至其他资源
- 4xx : 请求包含某种错误
- 5xx : 服务器执行请求时遇到错误
还有大量特殊状态码,其中许多状态码仅用在特殊情况下。下面列出常见的:
- 100 Continue : 当客户端提交一个包含主体的请求时,将发送这个响应。该响应表示已接收到请求头,客户端应继续发送主体。请求完成后,再由服务端返回另一个响应。
- 200 Ok : 本状态码表示已成功提交请求,且响应主体中包含请求结果。
- 201 Created : PUT请求的响应返回这个状态码,表示请求已成功提交。
- 301 Moved Permanently : 本状态码将浏览器永久重定向到另外一个在 Location 消息头中指定的 URL 。以后客户端应使用新得 URL 替换原始 URL 。
- 302 Found : 本状态码将浏览器暂时重定向到另外一个在 Location 消息头中指定的 URL 。客户端在随后的请求中恢复使用原始 URL 。
- 304 Not Modified : 本状态码指示浏览器使用缓存中保存的所请求资源的副本。服务器使用 If-Modified-Since 和 If-None-Match 消息头确定客户端是否拥有最新版本的资源。
- 400 Bad Request : 本状态码表示客户端提交了一个无效的 HTTP 请求。当以某种无效的方式修改请求时,可能会遇到这个状态码。
- 401 Unauthorized : 服务器在请求许可前要求 HTTP 进行身份验证。WWW-Authenticate 消息头详细说明所支持的身份验证类型。
- 403 Forbidder : 不管是否通过身份验证,禁止任何人访问被请求的资源。
- 404 Not Found : 骑牛的资源不存在。
- 405 Method Not Allowed : 表示指定的 URL 不支持请求中使用的方法。
- 413 Request Entity Too Large : 如果在本地状态码中探查缓冲器溢出漏洞并就此提交超长数据传,则表示请求的 URL 过大,服务器无法处理。
- 414 Request Entity Too Long : 与上一个相依类似,表示请求的 URL 过长,服务器无法处理。
- 500 Internal Server Error : 服务器在执行请求时遇到错误。当提交无法预料的输入、在应用程序处理过程中造成无法处理的错误时,会收到本状态码。
- 503 Service Unavailable : 表示尽管 Web 服务器运转正常,并且能够响应请求,但服务器访问的应用程序还是无法做出响应。应当进行核实,是否因为执行了某种行为而造成这个结果。
HTTPS
HTTP 使用普遍的非加密 TCP 最为传输机制,因此在网络适当位置的攻击能够截取这个机制。HTTPS 本质上和 HTTP 一样,都属于应用层协议,但是 HTTPS 通过安全传输机制 --- 安全套阶层 (Secure Socket Layer : SSL)传输数据,这种机制可以保护通过网络传出的所有数据的隐秘性和完整性,显著降低非入侵性拦截攻击的可能性。
HTTP代理
HTTP 代理服务器是一个协调客户端浏览器与目标 Web 服务器之间访问的服务器。当配置流浪器使用代理服务器是,它会将所有的请求提交到代理服务器,代理服务器再将请求传送给相关 Web 服务器,并将相应返回给浏览器。
注意点:
- 当浏览器向代理服务器发布 HTTP 请求时,它会将完整的 URL 插入到请求中。代理服务器将提交主机名称和端口,并使用这些信息将请求提交给指定服务器。
- 当使用 HTTPS 时,浏览器无法与代理服务器进行 SSL 握手,因为这样会破坏安全隧道,是通信易于收到拦截攻击。因此,浏览器必须将代理作为一个纯粹的 TCP 级中继,由它传递浏览器与目标 Web 服务器支架的呢所有网络数据,并与浏览器进行正常的 SSL 握手。浏览器使用 CONNECT 方法向代理服务器提交一个 HTTP 请求,并制定 URL 中的目标主机名称与端口号,从而建立中继。如果代理允许该请求,它会返回一个含 200 状态码的 HTTP响应,一直开放 TCP 连接,从此以后作为目标 Web 服务器的纯粹 TCP 级中继。
从某种程度上来说,攻击 Web 应用程序时最有用的工具是一个处理浏览器与Web服务器之间的专用代理服务器,使用它可以拦截并修改所有使用 HTTPS 的请求和响应。
HTTP身份验证
HTTP 拥有自己的用户身份验证机制:
- Basic : 一种非常简单的身份验证机制,他在请求消息头中随每条消息以 Base64 编码字符串的形式发送用户证书
- HTML : 一种质询-响应机制,它使用某个 Windows NTLM 协议版本
- Digest :一种质询-响应机制,它随用户证书一起使用一个随机值 MD5 校验和。
组织内部经常使用这些身份验证协议访问内联网服务,但因特网上的 Web 应用程序基本很少使用他们。
作者:ZZUGeneral
地址:http://www.yanghelong.top