HTTP协议解析
HTTP (HyperText Transfer Protocol) 即超文本传输协议,是一种详细规定了浏览器和万维网服务器 之间互相通信的规则,它是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从Web服务器传送到Web浏览器,
发送HTTP请求
在浏览器地址栏中输入一个URL,并按回车键后就发起了这个HTTP请求。
URL(统一资源定位符)也被称为网页地址,是互联网标准的地址。URL的标准格式如下:
协议://服务器IP [:端口]/路径/[?查询]
借助浏览器可以快速发送一个HTTP请求,如果不借助浏览器应该怎样发送HTTP请求呢?例如:在Linux系统中的curl命令。严格来说,浏览器也属于HTTP工具的一种。
在Windows中,也可以用curl.exe工具来发送请求,通过curl + URL命令就可以简单地发起一个HTTP请求,非常方便 ,但Windows没有自带curl.exe,用户必须 进行下载才可以使用。
例如,curl http://www.baidu.com可以返回这个页面地HTML数据,也可以查看访问URL后服务器返回的HTTP响应头,加上-I选项即可。
此时脱离了浏览器来获取服务器渲染和HTML数据,你可以发现,就某些方面而言,浏览器在HTTP协议方面只不过多了HTML渲染的功能,让用户看到更直观的界面。
HTTP协议详解
1.HTTP请求与响应
(1)HTTP请求
HTTP请求包括三部分,分别是请求行(请求方法)、请求头(消息报头)、和请求正文。下面是HTTP请求的一个例子。
POST /login.php HTTP/1.1 //请求行
HOST: www.xxxx.com //请求头
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv: 15.0) Geko/20200101 Firefox/15.0
//空白行,代表请求头结束
Username=admin&password=admin //请求正文
HTTP请求行的第一行即为请求行,请求行由三部分组成,该行的第一部分说明了该请求行是POST请求;该行的第二部分是一个斜杠(/login.php),用来说明请求的是该域名根目录下的login.php;该行的最后一部分说明使用的是HTTP1.1版本(另一个可选项是1.0)。
第二行至空白行为HTTP中的请求行(也被称为消息头)。其中,HOST代表请求行的主机地址,User-Agent 代表浏览器的标识。请求行由客户端自行设定。
HTTP请求的最后一行为请求正文,请求正文是可选的,它最常出现在POST请求方法中。
(2)HTTP响应
与HTTP请求对应的是HTTP响应,HTTP响应也由三部分内容组成,分别是相应行、响应头(消息报头)和响应正文(消息主题)。下面是一个经典的HTTP响应。
HTTP/1.1 200 OK //响应行
Date: Thu, 28 Feb 2020 07:36:47 GMT //响应头
Server: BWS/1.0
Content-Length: 4199
Content-Type: text/html;charest=utf-8
Cache-Control: private
Expires: Thu, 28 Feb 2020 07:36:47 GMT
Content-Encoding: gzip
Set-Cookie: H_PS_PSSID=2022_1438_1944_1788; path=/; domain=.xxxx.com
Connection: Keep-Alive
//空白行,代表响应头结束
<html>
<head><title> index.html </title></head>
...
HTTP响应的第一行为响应行,其中由HTTP版本(HTTP/1.1)、状态码(200)以及消息“OK”。
第二行至末尾的空白行为响应行,由服务器向客户端发送。
消息报头之后是响应正文,是服务器向客户端发送的HTML数据。
2.HTTP请求方法
HTTP请求的方法非常多,其中GET、POST最常见。下面是HTTP请求的方法的详细介绍。
(1)GET
GET方法用于获取请求页面的指定信息(以实体的格式)。如果请求资源为动态脚本(非HTML),那么返回文本是Web容器解析后的HTML源代码,而不是源文件。例如请求index.jsp,返回的不是index.jsp的源文件,而是经过解析后的HTML代码。
如下HTTP请求:
GET /index.php?id=1 HTTP/1.1
HOST: www.xxxx.com
使用GET请求的index.php,并且id参数为1,在服务器端脚本语言中可以选择性地接收这些参数,比如id=1&name=admin,一般都是由开发者内定好的参数项目才会接收,比如开发者只接收id参数项目,若加了其他参数项,如:
Index.php?id=1&username=admin //多个参数以"&"分隔
服务器端脚本不会理会你加入的内容,依然只会接收id参数,并且去查询数据,最终向服务器端发送解析过的HTML数据,不会因为你的干扰而乱套。
(2)HEAD
HEAD方法除了服务器不能在响应里返回消息主体外,其他都与GET方法相同。此方法经常用来测试超文本链接的有效性、可访问性和最近的改变。攻击者编写扫描工具时,就常用此方法,因为只测试资源是否存在,而不用放回消息主题所以速度一定是最快的。一个经典的HTTP HEAD请求如下:
HEAD /index.php HTTP/1.1
HOST: www.xxxx.com
(3)POST
POST方法与GET方法相似,但最大的区别在于,GET方法没有请求内容,而POST是有请求内容的。POST请求最用于服务器发送大量的数据。GET虽然也能发送数据,但是有大小(长度)的限制,并且GET请求会将发送的数据显示在浏览器端,而POST则不会,所以安全性相对来说高一点。
例如,上传文件、提交留言等,只要是向服务器传输大量的数据,通常会使用POST请求。一个经典的HTTP POST请求如下:
POST /login.php HTTP/1.1
Host: www.xxxx.com
Content-Length: 26
Accept: text/html,application/xtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: http://home.2cto.com
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)
Chrome/24.0.1312.57 Safari/537.17 SE 2.X MetaSr 1.0
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
user=admin&pw=12345678
用POST方法向服务器请求login.php,并且传递参数user=admin&pw=12345678
(4)PUT
PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版。如果请求指定的资源不存在,将会创建这个资源,且数据位请求正文:
PUT /input.txt
HPST: www.xxxx.com
Content-Length: 6
123456
这段HTTP PUT请求将会在主机根目录下创建input.txt,内容为123456。通常情况下,服务器都会关闭PUT方法。因为它会为服务器建立文件,处于危险的方式。
(5)DELETE
DELETE方法用请求服务器删除请求的指定的资源。服务器一般都会关闭此方法,因为客户端可以进行删除文件操作,属于危险的方式。
(6)TRACE
TRACE方法被用于激发一个远程的应用程的请求消息回路,也就是说,回显服务器收到的请求。TRACE方法允许客户端去了解数据被请求链的另一端接收的情况,并且利用那些数据信息去测试或诊断。但此方法非常少见。
(7)CONNECT
HTTP1.1协议规范保留了CONNECT方法,此方法是为了用于能动态切换到隧道的代理。
(8)OPTIONS
OPTIONS方法是用于请求获得由URL标识的资源在请求/响应的通信过程中可以使用的功能选项。通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。HTTP OPTIONS请求如下:
OPTIONS / HTTP/1.1
HOST: www.xxxx.com
HTTP/1.1 200 OK
Allow: OPTIONS, TEACE , GET, HEAD, POST
Server: Microsoft-IIS/7.5
Public: OPTIONS, TEACE , GET, HEAD, POST
X-Powered-By: ASP.NET
Date: Sun, 14 Jul 2020 15:50:58 GMT
Content-Length: 0
以上为HTTP/1.1标准方法,但HTTP中的请求方法还不止这些,例如WebDAV,它是一种基于HTTP/1.1协议的通信协议,它扩展了HTTP1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server进行读写,并支持写文件锁定和解锁、文件复制、文件移动。另外,还可以支持文件的版本控制。
3.HTTP状态码
当客户端发出HTTP请求,服务器端接收后,会向客户端发送响应信息,其中,HTTP响应中的第一行中,最重要的一点就是HTTP的状态码,内容分如下:”
HTTP/1.1 200 OK
此状态码为200.在HTTP协议中表示请求成功。HTTP协议中的状态码由三位数字组成,第一位数字定义了响应的类别,且只有以下5种。
·1XX 信息提示,表示请求已被成功接收,继续处理。其范围为100~101
·2XX 成功,服务器成功地处理了请求。其范围为200~206
·3XX 重定向,重定向状态码用于告诉浏览器客户端,它们访问地资源已被移动,并告诉客户端地资源地理位置,这时,浏览器将重新对新资源发起请求。其范围为300~305
·4XX 客户端错误状态码,有时客户端会发送一些服务器无法处理地东西,比如格式错误的请求,或者最常见的是,请求一个不存在的URL。其范围为400~415
·5XX 有时候客户端发送了一条有效的请求,但Web服务器自身却出错了,可能是 Web服务器运行出错了,或者网站都挂了。5XX就是用来描述服务器内部错误的,其范围为500~505
常见的状态码描述如下。
200:客户端请求成功,是最常见的状态
302:重定向
404:客户端请求有语法错误,不能被服务器所理解
401:请求未经授权
403:服务器收到请求,但是拒绝提供服务
500:服务器内部错误,是最常见的状态
503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
**4.HTTP消息 **
HTTP消息又称为HTTP头(HTTP header),由四部分组成,分别是请求头、响应头、普通头和实体头。从名称上看,我们就可以知道它们所处的位置。
(1)请求头
请求头只出现在HTTP请求中,请求报头允许客户端向服务器端传递请求的附加消息和客户端自身的信息。常见的HTTP请求头如下。
Host
Host 请求报头域主要用于指定被请求资源的 Internet 主机和端口号,例如:HOST: www.xxxx.com:801
User-Agent
User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其他属性告诉服务器。登录一些网站时,很多时候都可以见到显示我们的浏览器、系统信息,这些都是此头的作用,如:User-Agent:My privacy
Referer
Referer包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面。如:Referer: www.xxxx.com/login.php,代表用户从login.php来到当前页面
Cookie
Cookie是非常重要的请求头,它是一段文本,常用来表示请求者身份等。
Range
Range可以请求实体的部分内容,多线程下载一定会用到此请求头。例如:
表示头500字节:bytes=0~499
表示第二个500字节:bytes=500~999
表示最后500字节:bytes=-500
表示500字节以后的范围:bytes=500-
X-Forwarded-For
X-Forwarded-For 即XFF头,它代表请求端的IP,可以有多个,中间以逗号隔开
Accept
Accept 请求报头域作用于指定客户端接收哪些MIME类型的信息,如Accept:text/html,表名客户端希望接收HTML文本
Accept-Charset
Accept-Charset请求报头域用于客户端接收的字符集。例如:Accept-Charset:iso-88591-1,gb2312。如果在请求消息中没有设置这个域,默认是任何字符集都可接收
(2)响应头
响应头是服务器根据请求向客户端发送的HTTP头。常见的HTTP响应头如下。
Server
服务器所使用的Web服务器名称,如Server:Apache/1.3.6(Unix),攻击者通过查看此头,可以探测Web服务器名称。所以在服务器端进行修改此头的消息。
Set-Cookie
向客户端设置Cookie,通过查看此头,可以清楚地看到服务器向客户端发送的Cookie信息。
Last-Modified
服务器通过这个头告诉浏览器,资源的最后修改时间
Location
服务器通过这个头告诉浏览器去访问哪个页面,浏览器接收到这个请求之后,通常会立即访问Location头所指向的页面。这个头通常配合302状态码使用。
Refresh
服务器通过Refresh头告诉浏览器定时刷新浏览器
(3)普通头
在普通报头中,有少数报头域作用于所有的请求和响应的消息,但并不用于被传输的实体,只用于传输的消息。例如:Date,表示消息产生的日期和时间,通知服务器,在响应完成后,关闭连接。Cache-Control,用于指定缓存指令,缓存指令是单向的,且是独立的。
(4)实体头
请求和响应消息都可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等。常见的实体头如下。
Content-Type
Content-Type实体头用于向接收方指示实体的介质类型
Content-Encoding
Content-Encoding头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
Content-Length
Content-Length实体头用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Last-Modified
Last-Modified实体报头用于指示资源的最后修改日期和时间。
HTTP协议与HTTPS协议的区别
HTTPS协议的全称为Hypertext Transfer Protocol over Secure Socket Layer,它是以安全为目标的HTTP通道,其实就是HTTP的“升级”版本,只是它比单纯的HTTP协议更加安全。
HTTPS的安全基础是SSL,即在HTTP下加入SSL层。也就是HTTPS通过安全传输机制进行传送数据,这种机制可保护网络传送的所有数据的隐蔽性与完整性,可以降低非侵入性拦截攻击的可能性。
既然是在HTTP的基础上进行构建的HTTPS协议,所以,无论怎么样,HTTP请求与相应都是以相同的方式进行工作的。
HTTP协议与HTTPS协议的主要区别如下:
(1)HTTP是超文本传输协议,信息是明文传输,HTTPS则具有安全性的SSL加密传输协议。
(2)HTTP与HTTPS协议使用的是完全不同的连接方式,HTTP采用80端口连接,而HTTPS则是443端口。
(3)HTTPS协议需要到ca申请证书,一般免费证书很少,需要交费,也有些Web容器提供,如TOMCAT。而HTTP协议却不需要。
(4)HTTP连接相对简单,是无状态的,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输7、身份认证的网络协议,相对来说,它要比HTTP协议更安全
截取HTTP请求
很多网站为了减少服务器端的压力,在后台方面减少验证,而只是在Web前端使用JavaScript进行验证,这样会大大增加了安全隐患。在渗透测试中,经常会进行HTTP请求的截取来发现一些隐秘的漏洞。例如:绕过JavaScript验证、发现隐藏标签内容等。