HTTP协议
HTTP协议简介
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP的发展是由蒂姆·伯纳斯-李于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1。
2014年12月,互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。 HTTP/2标准于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。
HTTP协议主要特点:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决这个问题, Web程序引入了Cookie机制来维护状态。
HTTP协议版本介绍
版本:HTTP0.9:该版本只允许 GET 方法,具有典型的无状态性,无协议头和状态码,支持纯文本
版本:HTTP1.0:增加了 HEAD 和 POST 方法,支持长连接、缓存和身份认证
版本:HTTP1.1:增加了 Keep-alive 机制和 PipeLining 流水线,新增了 OPTIONS、PUT、DELETE、TRACE、CONNECT 方法
版本:HTTP2.0:增加了多路复用、头部压缩、随时复位等功能
URI
什么是URI?
URI,统一资源标志符(Uniform Resource Identifier, URI),表示的是web上每一种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行标识的。URI的结构组成
URI通常由三部分组成:
①资源的命名机制;
②存放资源的主机名;
③资源自身的名称。(注意:这只是一般URI资源的命名方式,只要是可以唯一标识资源的都被称为URI,上面三条合在一起是URI的充分不必要条件)
URI举例
我们可以这样解释它:
①这是一个可以通过https协议访问的资源, ②位于主机 bilibili.com上, ③通过“/account/history”可以对该资源进行唯一标识(注意,这个不一定是完整的路径) 注意:以上三点只不过是对实例的解释,以上三点并不是URI的必要条件,URI只是一种概念,怎样实现无所谓,只要它唯一标识一个资源就可以了。
URL
URL是URI的一个子集。它是Uniform Resource Locator的缩写,译为“统一资源定位符”。
通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL是URI概念的一种实现方式。
URL的一般格式为(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
例如 http://95.183.96.9:8080/login.asp
URL的格式由三部分组成:①第一部分是协议(或称为服务方式)。 ②第二部分是存有该资源的主机IP地址(有时也包括端口号)。 ③第三部分是主机资源的具体地址,如目录和文件名等。
第一部分和第二部分用“://”符号隔开,
第二部分和第三部分用“/”符号隔开。
第一部分和第二部分是不可缺少的,第三部分有时可以省略。
URI和URL之间的区别
从上面的例子来看,你可能觉得URI和URL可能是相同的概念,其实并不是,URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。
URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。
URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。只要能唯一标识资源的就是URI,在URI的基础上给出其资源的访问方式的就是URL
本段内容摘抄自 https://blog.csdn.net/qq_32595453/article/details/80563142
HTTP报文发送接收流程
Burpsuite抓http报文
HTTP协议GET请求报文结构
GET /login.asp HTTP/1.1 //请求方式GET 请求页面login.asp Host: 95.183.96.9:8080 //请求主机与端口 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 //请求报头域允许客户端将它的 操作系统,浏览器和其他属性告诉服务器。登录一些网站时,很多时候都可以见到显示我们的 浏览器,系统信息,这些都是此头的作用, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 //MIME类型 Accept-Language: en-US,en;q=0.5 //表示浏览器所支持的语言类型 Accept-Encoding: gzip, deflate//HTTP编码格式 告诉服务器, 浏览器支持gzip压缩 Connection: close //表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了 Upgrade-Insecure-Requests: //升级不安全请求
HTTP协议GET请求响应报文结构
HTTP/1.1 200 OK //HTTP状态码 Server: nginx/1.14.0 //服务容器为nginx 攻击者通过查看此头,可以探测WEB服务器名称。所以建议在服务器端进行修改此头信息 Date: Tue, 05 Jan 2021 09:25:03 GMT //时间 Content-Type: text/html //内容类型为 text/html Content-Length: 4269 //内容长为4269 Connection: close //表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了 Cache-Control: no-cache, no-store, must-revalidate//不使用缓存 必须重新验证 Expires: Tue, 05 Jan 2021 09:25:02 GMT Cache-Control: no-cache //不使用缓存 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, proxy-revalidate, max-age=0//不使用缓存 必须重新验证 Last-Modified: Tue, 05 Jan 2021 09:25:02 GMT //最后修改时间 Accept-Ranges: bytes //此字段的值表示可用于定义范围的单位。
HTTP协议POST请求报文结构
POST /goform/auth HTTP/1.1 //以post方式提交认证 Host: 95.183.96.9:8080 //主机/端口 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 //用户信息 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 //接收的MIME类型 Accept-Language: en-US,en;q=0.5 //语言为英语 Accept-Encoding: gzip, deflate //HTTP压缩,其实就是HTTP内容编码的一种 告诉服务器, 浏览器支持gzip压缩 Content-Type: application/x-www-form-urlencoded //内容类型 是浏览器默认的编码格式 Content-Length: 43 //内容长度为43 Origin: http://95.183.96.9:8080 //Origin字段标识最初请求是从哪里发起的 只存在于POST请求 Connection: close //表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了 Referer: http://95.183.96.9:8080/login.asp //告诉浏览器我从何处来 Upgrade-Insecure-Requests: 1 // username=admin&password=1234&submit-url=%2F //提交了表单 admin 和1234 这两个参数
Origin字段只存在于POST请求,而Referer则存在于所有类型的请求。
HTTP协议POST响应报文结构
HTTP/1.1 302 Moved Temporarily //http 302状态码 表示临时性重定向 Server: nginx/1.14.0 //服务容器类型为nginx Date: Tue, 05 Jan 2021 09:28:43 GMT //日期时间 Content-Type: text/html //内容类型为txt/html Connection: close //表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了 Location: http://95.183.96.9:8080/login.asp//跳转 但是这个跳转只有浏览器知道,不管体内容里有没有东西,用户都看不到。 Set-Cookie: Wrong-Pass=1; Max-Age=10; Path=/ //向客户端设置Cookie,通过查看此头,可以清楚的看到服务器向客户端发送的 Cookie 信息。 Cache-Control: no-cache, no-store, must-revalidate Content-Length: 218 //内容长度为218
HTTP请求方法:
GET
GET 方法用于获取请求页面的指定信息(以实体的格式)。
如果请求资源为动态脚本(非HTML),那么返回的文本是WEB容器解析后的HTML 源码,而不是源文件。
例如请求 index.jsp,返回的不是idex.jsp的源文件,而是经过解析后的HTML代码。GET请求如下
GET /index.php?id=1 HTTP/1.1
HOST: www.xxser.com使用GET请求 index.php,并且id参数为1,
在服务器端脚本语言中可以选择性地接收这些参数
比如id=1&name=admin,一般都是由开发者内定好的参数项目才会接收,比如开发者只接收id参数项目,
若加了其他参数项,如:index.php?id=1&username=admin //多个参数项以”&“分隔
服务器端脚本不会理会你的加入内容,依然指挥接收id参数,并且去查询数据,最终向服务器发送解析过的HTML数据,不会因为你的干扰而乱套。
HEAD
HEAD 方法除了服务器不能在响应里返回消息主体外,其他都与GET 方法相同。
此方法经常被用来测试超文本链接的有效性,可访问性和最近的改变。
攻击者编写扫描工具时,就经常用此方法,因为只测试资源是否存在,而不返回消息主体,所以速度一定是最快的。
一个典型的HTTP HEAD 请求如下:
HEAD /index.php HTTP/1.1
HOST: www.xxser.com
POST
POST 方法也与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST 是有请求内容的 。
POST 请求 最多用于向服务器发送大量的数据。
GET虽然也能发送数据。但是有大小(长度)的限制,并且GET请求会将发送的数据显示在浏览器端,而POST则不会,所以安全性相对来说高一点。例如,上传文件,提交留言等,只要是向服务器传输大量的数据,通常都会使用POST 请求。
一个经典的 HTTP POST 请求如下:POST /login.php HTTP/1.1 //post提交到了login.php页面 HOST: www.xsser.com //主机/域名为 www.xsser.com content-Length: 26 //内容长度 为26 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //客户端可以处理的内容类型 User-Agent: MoZILLA/5.0(Windows NT 6.1)Applewebkit/537.17 (KHTML,like Gecko) //用户访问信息 Content-Type: application/x-www-form-urlencoded //内容类型 Accept-Language:zh-cN,zh;q=0.8 //支持的语言为中文 Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3 //编码为utf-8 user=admin&pw=123456789 //传递参数 user=admin&pw=123456789.
用POST方法向服务器请求login.php,并且传递参数 user=admin&pw=123456789.
PUT
PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版。
如果请求指定的资源不存在,将会创建这个资源,且数据位请求正文,请求如下:PUT/input.txt HOST:www.xxser.com Content-Length:6 123456
这段HTTP PUT 请求将会在主机根目录下创建 input.txt,内容位123456。
通常情况下,服务器都会关闭PUT方法,因为它会位服务器建立文件,属于危险的方法之一。
DELETE
DELETE 方法用于请求资源服务器删除请求的指定资源。服务器一般都会关闭此方法,因为客户端可以进行删除文件操作,属于危险方法之一。
TRACE
TRACE 方法被用于激发一个远程的应用层的请求消息回路,也就是说,会先服务器收到的请求。TRACE 方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用那些数据信息去厕所或诊断。但此方法非常少见。
CONNECT
HTTP 1.1 协议规范保留了CONNECT方法,此方法是为了用于能动态切换到隧道代理。
OPTIONS
OPTIONS 方法是用于请求获得由URI标识的资源在请求/响应的通信过程中可以使用的功能选项。 通过这个方法,客户端可以采取具体资源请求之前,决定对该资源擦去何种必要措施,或者了解服务器的性能。
HTTP OPTIONS 请求如下:
OPTIONS / HTTP/1.1 HOST: www.xsser.com HTTP/1.1 200 OK Allow: OPTIONS,TRACE,GET,HEAD,POST X-powered-By: ASP,.NET Date: Sun,14 jul 2013 15:5058 Content-Length : 0
以上位 HTTP/1.1标准方法,但HTTP中的请求方法还不止这些。
HTTP 消息头
Connection //告知通信另一端,在完成HTTP传输后是关闭 TCP 连
接,还是保持连接开放
ContentEncoding //规定消息主体内容的编码形式 请求和响应消息头都包含
ContentLength //规定消息主体的字节长度 请求和响应消息头都包含
Content-Type //规定消息主体的内容类型 请求和响应消息头都包含
Accept //告知服务器客户端愿意接受的内容类型 属于请求消息头
Accept Encoding //告知服务器客户端愿意接受的内容编码 属于请求消息头
Authorization //进行内置 HTTP 身份验证 属于请求消息头
Cookie //用于向服务器提交 cookie 属于请求消息头
Host //指定所请求的完整 URL 中的主机名称 属于请求消息头
Oringin // 跨域请求中的请求域 属于请求消息头
Referer //指定提出当前请求的原始 URL 属于请求消息头
User-Agent //提供浏览器或者客户端软件的有关信息 属于请求消息头
Cache Control //向浏览器发送缓存指令 属于响应消息头
Location //重定向响应 属于响应消息头
Server //提供所使用的服务器软件信息 属于响应消息头
Set-Cookie //向浏览器发布 cookie 属于响应消息头
x-forward-for //即XXF头,它代表请求端的IP,可以有多个,中间以逗号隔开。 属于请求消息头
Cookie
Cookie 是大多数 Web 应用程序所依赖的关键组成部分,它用来弥补 HTTP 的无状
态记录的缺陷。
服务器使用 Set-Cookie 发布 cookie ,浏览器获取 cookie 后每次请求 会在 Cookie 字段中包含 cookie 值。
Cookie 是一组键值对,另外还包括以下信息:
expires,用于设定 cookie 的有效时间。
domain,用于指定 cookie 的有效域。
path,用于指定 cookie 的有效 URL 路径。
secure,指定仅在 HTTPS 中提交 cookie。
HttpOnly,指定无法通过客户端 JavaScript 直接访问 cookie。
参考:ctf-all-in-one
HTTP响应 状态码:五种
1xx:信息提示,表示请求已经被成功接收,继续处理。其范围 100~101 2xx:成功,服务器 成功地处理了请求。其范围为 200~206 3xx:重定向,重定向状态码用于告诉浏览器客户端,它们访问的资源已被移动,并告诉客户端新的资源地址位置。这是浏览器将重新对新的资源发起请求,其范围为300~305 4xx:客户端错误状态码,有时客户端会发送一些服务器无法处理的东西,比如说格式错误的请求,或者最常见的是 ,请求一个不存在的URL。其范围 400~415 5xx:有时候客户端发送了条有效的请求,但WEB服务器自身却出错了,可能是WEB服务器运行出错了,或者网站都挂了。5xx就是用来描述服务器内部错误的,其范围为500~505
常见的状态码:
- 200:客户端请求成功,是最常见的状态
- 302:重定向。
- 404:请求的资源不存在,是最常见的状态
- 400:客户端请求有语法错误,不能被服务器所理解.
- 401:请求未经授权。
- 403:服务器收到请求,但是拒绝提供服务
- 500:服务器内部错误,是最常见的状态。
- 503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
本段内容摘选自《WEB安全深度剖析》
-End-
本文多数内容摘抄自书籍与他人博客,需要好好消化转变为自己的知识。
By___Guy_psycho