http是用于从万维网即web服务器传输超文本到本地浏览器的传送协议
http是一个基于TCP/IP通信协议来传递数据;
http默认端口号为80,但是可以修改为其他端口
##HTTP请求报文格式
分为三个部分,请求行、请求头和请求体
请求行(Request Line)分为三个部分:请求方法、请求地址 和 协议及版本,以CRLF(\r\n
)结束。
URL 是统一资源定位符,它代表了 Web 资源的唯一标识,如同电脑上的盘符路径。最常见的 URL 格式如下所示:
protocol://[user[:password]@]hostname[:post]/[path]/file[?param=value]
协议 分隔符 用户信息 域名 端口 路径 资源文件 参数键 参数值
下面是一张具体案例分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rewItIXN-1569760355219)(https://firmianay.gitbooks.io/ctf-all-in-one/content/pic/1.4.2_http_url.png)]
HTTP 方法
在提到 HTTP 方法之前,我们需要先讨论一下 HTTP 版本问题。HTTP 协议现在共有三个大版本,版本差异会导致一些潜在的漏洞利用方式。
版本 | 简述 |
---|---|
HTTP 0.9 | 该版本只允许 GET 方法,具有典型的无状态性,无协议头和状态码,支持纯文本 |
HTTP 1.0 | 增加了 HEAD 和 POST 方法,支持长连接、缓存和身份认证 |
HTTP 1.1 | 增加了 Keep-alive 机制和 PipeLining 流水线,新增了 OPTIONS、PUT、DELETE、TRACE、CONNECT 方法 |
HTTP 2.0 | 增加了多路复用、头部压缩、随时复位等功能 |
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
2. Header
Header可用于传递一些附加信息,格式: 键: 值
,注意冒号后面有一个空格!如:
Content-Length: 1024
Content-Type: text/plain
2.1 请求和响应常见通用Header
名称 | 作用 | |
---|---|---|
Content-Type | 请求体/响应体的类型,如:text/plain、application/json | |
Accept | 说明接收的类型,可以多个值,用, (半角逗号)分开 | |
Content-Length | 请求体/响应体的长度,单位字节 | |
Content-Encoding | 请求体/响应体的编码格式,如gzip,deflate | |
Accept-Encoding | 告知对方我方接受的Content-Encoding | |
ETag | 给当前资源的标识,和Last-Modified 、If-None-Match 、If-Modified-Since 配合,用于缓存控制 | |
Cache-Control | 取值为一般为no-cache 或max-age=XX ,XX为个整数,表示该资源缓存有效期(秒) |
2.2 常见请求Header
名称 | 作用 |
---|---|
Authorization | 用于设置身份认证信息 |
User-Agent | 用户标识,如:OS和浏览器的类型和版本 |
If-Modified-Since | 值为上一次服务器返回的 Last-Modified 值,用于确认某个资源是否被更改过,没有更改过(304)就从缓存中读取 |
If-None-Match | 值为上一次服务器返回的 ETag 值,一般会和If-Modified-Since 一起出现 |
Cookie | 已有的Cookie |
Referer | 表示请求引用自哪个地址,比如你从页面A跳转到页面B时,值为页面A的地址 |
Host | 请求的主机和端口号 |
2.3 常见响应Header
名称 | 作用 |
---|---|
Date | 服务器的日期 |
Last-Modified | 该资源最后被修改时间 |
Transfer-Encoding | 取值为一般为chunked,出现在Content-Length不能确定的情况下,表示服务器不知道响应版体的数据大小,一般同时还会出现Content-Encoding 响应头 |
Set-Cookie | 设置Cookie |
Location | 重定向到另一个URL,如输入浏览器就输入baidu.com回车,会自动跳到 https://www.baidu.com ,就是通过这个响应头控制的 |
Server | 后台服务器 |
3、状态码
状态码表明资源的请求结果状态,由三位十进制数组成,第一位代表基本的类别:
- 1xx,提供信息
- 2xx,请求成功提交
- 3xx,客户端重定向其他资源
- 4xx,请求包含错误
- 5xx,服务端执行遇到错误
常见的状态码及短语如下所示:
状态码 | 短语 | 描述 |
---|---|---|
100 | Continue | 服务端已收到请求并要求客户端继续发送主体 |
200 | Ok | 已成功提交,且响应主体中包含请求结果 |
201 | Created | PUT 请求方法的返回状态,请求成功提交 |
301 | Moved Permanently | 请求永久重定向 |
302 | Found | 暂时重定向 |
304 | Not Modified | 指示浏览器使用缓存中的资源副本 |
400 | Bad Request | 客户端提交请求无效 |
401 | Unauthorized | 服务端要求身份验证 |
403 | Forbidden | 禁止访问被请求资源 |
404 | Not Found | 所请求的资源不存在 |
405 | Method Not Allowed | 请求方法不支持 |
413 | Request Entity Too Large | 请求主体过长 |
414 | Request URI Too Long | 请求URL过长 |
500 | Internal Server Error | 服务器执行请求时遇到错误 |
503 | Service Unavailable | Web 服务器正常,但请求无法被响应 |
401 状态支持的 HTTP 身份认证:
- Basic,以 Base64 编码的方式发送证书
- NTLM,一种质询-响应机制
- Digest,一种质询-响应机制,随同证书一起使用一个随机的 MD5 校验和
##其他
HTTPS
HTTPS 用来弥补 HTTP 明文传输的缺陷。通过使用安全套接字 SSL,在端与端之间传输加密后的消息,保护传输数据的隐密性和完整性,并且原始的 HTTP 协议依然按照之前同样的方式运作,不需要改变。
Cookie
Cookie 是大多数 Web 应用程序所依赖的关键组成部分,它用来弥补 HTTP 的无状态记录的缺陷。服务器使用 Set-Cookie 发布 cookie,浏览器获取 cookie 后每次请求会在 Cookie 字段中包含 cookie 值。
Cookie 是一组键值对,另外还包括以下信息:
- expires,用于设定 cookie 的有效时间。
- domain,用于指定 cookie 的有效域。
- path,用于指定 cookie 的有效 URL 路径。
- secure,指定仅在 HTTPS 中提交 cookie。
- HttpOnly,指定无法通过客户端 JavaScript 直接访问 cookie。
4. 推荐调试工具
4.1 cURL
cURL 相当强大命令行工具,基本上你知道的上层协议它都支持,具体使用方法就自行发现了,下图为发起一个HTTP GET请求并打印请求和响应的详细内容。
4.2 bat
bat 是astaxie(谢孟军) 用Golang开发的类似cURL的命令行API调试工具,可以方便的打印出HTTP请求和响应,还能高亮Header、格式化JSON等功能,非常好用,API调式神器。
4.3 nc
nc 是 netcat 的简写,被称为“网络工具中的瑞士军刀”,不过我个人是把它当成Socket用,经常使用它来打印各种请求,当然它的作用可不只是这样,你也可以用它发起各式各样的请求,以前调式POP3也是用的它,只不过请求报文得自己写,上面有个图“HTTP请求和响应”就是用nc完成的。
5. HTTP的组成图示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-61PI5KwO-1569760355223)(E:\Typora\zw\Pictures\1200)]