WEB基础

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://www.bilibili.com/account/history

我们可以这样解释它:

   ①这是一个可以通过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报文发送接收流程

avatar

Burpsuite抓http报文

HTTP协议GET请求报文结构
avatar

   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请求响应报文结构
avatar

       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请求报文结构

avatar

   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响应报文结构

avatar

   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 方法除了服务器不能在响应里返回消息主体外,其他都与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 是大多数 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

常见的状态码:

  1. 200:客户端请求成功,是最常见的状态
  2. 302:重定向。
  3. 404:请求的资源不存在,是最常见的状态
  4. 400:客户端请求有语法错误,不能被服务器所理解.
  5. 401:请求未经授权。
  6. 403:服务器收到请求,但是拒绝提供服务
  7. 500:服务器内部错误,是最常见的状态。
  8. 503:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

本段内容摘选自《WEB安全深度剖析》

-End-

本文多数内容摘抄自书籍与他人博客,需要好好消化转变为自己的知识。

By___Guy_psycho

⬆︎TOP