Skip to content

B/S 架构 -- 浏览器/服务器结构,客户机上只需浏览器,Web 安全主战。 C/S 架构 -- 客户端/服务器结构,攻击者可能会逆向分析客户端安装包,寻找通信协议的漏洞。

  • 客户端与 Web 服务器进行交互时就存在 Web 请求,这种请求基于统一的应用层协议(HTTP 协议) 交互数据。

1. 发起 HTTP 请求

  • URL(Uniform Resource Locator,统一资源定位符)也称网页地址。标准格式如下:

    协议://服务器 IP [:端口]/路径/[?查询]

  • 借助浏览器/Linux系统curl命令/Windows使用 curl.exe(自行下载)都可以发起 HTTP 请求。

    curl URL 服务器返回页面的 HTML 数据;

    curl -I URL 服务器返回 HTTP 响应头(包含响应行)。


2. HTTP 协议详解

HTTP 是无状态的协议,即 Web 浏览器与 Web 服务器之间不需要建立持久的链接。客户端向服务器端发出请求,然后 Web 服务器返回响应,连接就被关闭,服务器端不保留连接的有关信息。 -- HTTP 请求只能由客户端发起。

HTTP 遵循 请求(Request)/ 应答(Response)模型,Web 浏览器向 Web 服务器发送请求时,Web 服务器处理请求并返回适当的应答。

2.1 HTTP 请求与响应

HTTP 请求

HTTP 请求包含三部分:请求行(请求方法)、请求头(消息报头)、请求正文。

POST /login.php HTTP/1.1          // 请求行
HOST: www.xxxxx.com               // 请求头
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0
                                  // 空白行,代表请求头结束
Username=admin&password=admin     // 请求正文
  • 请求行由三部分组成:请求方法、请求目标(路径)、HTTP版本;
  • 第二行至空白行是请求头(消息头) -- 请求头由客户端自行设定;
    • HOST 代表请求的主机地址;
    • User-Agent 代表浏览器的标识。
  • 最后一行为请求正文,可选,最常出现在 POST 请求方法中。

HTTP 响应

HTTP 响应也包含三部分:响应行、响应头(消息报头)、响应正文(消息主体)。

HTTP/1.1 200 OK                         // 响应行
Date: Thu, 28 Feb 2013 07:36:47 GMT     // 响应头
Server: BWS/1.0
Content-Length: 4199
Content-Type: text/html;charset=utf-8
Cache-Control: private
Expires: Thu, 28 Feb 2013 07:36:47 GMT
Content-Encoding: gzip
Set-Cookie: H_PS_PSSID=2022_1438_1944_1788; path=/; domain=.xxxxx.com
Connection: Keep-Alive
                                         // 空白行,代表响应头结束
<html>                                   // 响应正文(消息主体)
    <head><title> Index.html </title></head>
    ......
  • 响应行由三部分组成:HTTP 版本、状态码(200)、消息“OK”;
  • 第二行至空白行是响应头,由服务器向客户端发送;
  • 响应正文是服务器向客户端发送的 HTML 数据。

2.2 HTTP 请求方法

2.2.1 GET

GET 方法用于以实体的格式获取页面的指定信息。

如果请求资源为动态脚本(非 HTML),返回文本是 Web 容器解析后的 HTML 源代码,而不是源文件。

GET /index.php?id=1 HTTP/1.1
HOST: www.xxxxx.com

使用 GET 请求 index.php,服务器端脚本可以选择性接收参数,一般只接收由开发者内定的参数项目,不同参数项以 & 分割。

如开发者只接收 id 参数项目,若加了其他参数项,如 index.php?id=i&username=admin,服务器端脚本只会接收 id 参数,去查询数据,发送解析过的 HTML 数据。

2.2.2 HEAD

服务器不能在响应里返回消息主体,其他都与 GET 方法相同 -- 速度快。

常用于测试超文本链接的有效性、可访问性和最近的改变。攻击者编写扫描工具常用。

HEAD /index.php HTTP/1.1
HOST: www.xxxxx.com

2.2.3 POST

与 GET 类似。GET 方法一般没有请求内容(请求体),POST 通常有请求内容。

  • POST 请求最多用于向服务器发送大量数据(通过请求体)。GET 请求发送数据(通过URL)有大小(长度)限制。

  • GET 请求会把发送的数据显示在浏览器端(URL),而 POST 不会。

上传文件、提交留言等,向服务器传输大量数据,通常使用 POST 请求。

2.2.4 PUT

用于请求服务器把请求中的实体存储在请求资源下。

  • 如果请求资源在服务器中存在,就用请求中的数据替换原先的数据;
  • 如果请求的指定资源不存在,就创建该资源,且数据位于请求正文。
PUT /input.txt HTTP/1.1
HOST: www.xxxxx.com
Content-Length: 6

123456

这段 PUT 请求会在主机根目录下创建 input.txt,内容为 123456。通常服务器会关闭 PUT 方法,避免危险。

2.2.5 DELETE

用于请求源服务器删除请求的指定资源。

服务器通常关闭此方法。

2.2.6 TRACE

用于激发一个远程的应用层的请求消息回路,即回显服务器收到的请求。

TRACE 方法允许客户端去了解数据被请求链的另一端接收的情况,并利用这些数据信息测试或诊断。但此方法很少见。

2.2.7 CONNECT

用于建立一个跨越代理服务器的透明隧道,主要用于 HTTPS。

2.2.8 OPTIONS

用于请求获得由 URI 标识的资源在请求/响应的通信过程中可以使用的功能选项。

通过该方法,客户端可以在采取具体资源请求之前,决定对该资源采取什么措施,或了解服务器的性能。

2.3 HTTP 状态码

HTTP 协议中的状态码由三位数字组成,第一位数字定义了响应的类别,有以下 5 种:

  • 1xx:信息提示,表示请求已被成功接收,继续处理。范围是 100 ~ 101;
  • 2xx:成功,服务器成功处理了请求。范围是 200 ~ 206;
  • 3xx:重定向,重定向状态码用于告诉浏览器客户端,访问的资源已被移动,并告诉客户端新的资源地址位置。浏览器将重新对新资源发起请求。范围是 300 ~ 305;
  • 4xx:客户端错误状态码,客户端发送一些服务器无法处理的东西,如格式错误的请求,或一个不存在的 URL 等。范围是 400~415;
  • 5xx:描述服务器内部错误。可能是 Web 服务器运行出错等。范围是 500~505。

常见状态码:

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

2.4 HTTP 消息

HTTP 消息又称 HTTP 头(HTTP header),由四部分组成:请求头、响应头、普通头、实体头。

2.4.1 请求头

只出现在 HTTP 请求中,请求报头允许客户端向服务器端传递请求的附加信息和客户端自身的信息。常用 HTTP 请求头:

① Host

用于指定被请求资源的 Internet 主机和端口号,e.g. HOST: www.xxxxx.com:801

② User-Agent

允许客户端把它的操作系统、浏览器和其他属性告诉服务器。

③ Referer

包含一个 URL,代表当前访问 URL 的上一个 URL,即用户是从哪里来到本页面的。

一段文本,表示请求者身份等。

⑤ Range

可以请求实体的部分内容。多线程下载一定用到此请求头。

⑥ x-forward-for

即 XXF 头,代表请求端的 IP,可以有多个,中间以逗号隔开。

⑦ Accept

用于指定客户端接收哪些 MIME 类型的信息,如 Accept: text/html,表示客户端希望接收 HTML 文本。

⑧ Accept-Charset

指定客户端接收的字符集。如果没有设置,默认任何字符集都可以接收。

2.4.2 响应头

服务器根据请求向客户端发送的 HTTP 头。

① Server

服务器所使用的 Web 服务器名称,如 Server: Apache/1.3.6(Unix),攻击者查看此头,可以探测 Web 服务器名称。

向客户端设置 Cookie,通过查看此头,可以清楚看到服务器向客户端发送的 Cookie 信息。

③ Last-Modified

服务器以此告诉浏览器资源的最后修改时间。

④ Lacation

服务器依次告诉浏览器去访问那个页面,浏览器收到这个请求后,通常立刻访问 Location 头指向的页面。该头常配合 302 状态码使用。

⑤ Refresh

服务器以此告诉浏览器定时刷新浏览器。

2.4.3 普通头

用于所有的请求和响应消息,但不用于被传输的实体,只用于传输的消息。

  • Date,表示消息产生的日期和时间;
  • Connection,允许发送指定连接的选项,如 Keep-Alive,close 等选项。
  • Cache-Control,用于指定缓存指令,缓存指令是单向的,独立的。

2.4.4 实体头

请求和响应消息都可以传送实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息指实体内容的属性,包括实体信息类型、长度、压缩方法、最后一次修改时间等。

① Content-Type

用于向接收方指示实体的媒体类型 -- 数据格式及编码。 text/html; charset=utf-8

② Content-Encoding

被用作媒体类型的修饰符,指示已经被应用到实体正文的附加内容的编码。要获得 Content-Type 报头域中所引用的媒体类型,必须采用相应的解码机制。 gzip -- 指示实体已被压缩,需先解压

③ Content-Length

用于指明实体正文的长度,以字节方式存储的十进制数字来表示。

④ Last-Modified

用于指示资源的最后修改日期和时间。

  • Last-Modified 是对实体的描述,是实体头。但它只会由服务器在响应中发出,所以也是一个响应头。

3. 模拟 HTTP 请求

以下使用 Telnet 模拟 HTTP 请求访问网站。

  • Telnet 是一种基于TCP/IP协议的早期网络协议和命令行工具,主要用于通过文本界面在网络上进行远程登录和管理。其核心工作原理是建立一个可靠的、双向的虚拟终端连接。现主要作为轻量级网络调试工具。

sudo apt install telnet

telnet httpbin.org 80

GET /get HTTP/1.1
Host: httpbin.org
  • CTRL+']' 打开回显

4. HTTP 协议与 HTTPS 协议的区别

HTTPS :Hypertext Transfer Protocol over Secure Socket Layer,比 HTTP 更加安全。

HTTPS 的安全基础是 SSL/TLS,即在 HTTP 下加入 SSL/TLS 层。

  • TLS/SSL 在传输层对网络连接进行加密

HTTP 请求与响应都是以相同方式工作的。HTTP 和 HTTPS 的主要区别:

  • HTTP 信息是明文传输,HTTPS 是加密传输;
  • HTTP 采用 80 端口连接,HTTPS 采用 443 端口连接;
  • HTTPS 协议需要到 ca 申请证书。免费证书很少,需要交费,也有些由 Web 容器提供,如 TOMCAT。而 HTTP 协议不需要。