HTTP协议

一、HTTP简介

HTTP(HyperText Transfer Protocol,超文本传输协议)是访问万维网使用的核心通信协议,也是今天所有Web应用程序使用的通信协议。

HTTP使用一种基于消息的模型:浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

二、HTTP请求

所有HTTP消息(请求与响应)中都包含一个或几个单行显示的消息头(header),然后是一个强制空白行,最后是消息主体(可选)。

请求方法:

  • GET 请求获取Request-URI所标识的资源
  • POST 在Request-URI所标识的资源后附加新的数据
  • HEAD 请求获取由Request-URI所标识的资源的响应消息报头
  • PUT 请求服务器存储一个资源,并用Request-URI作为其标识
  • DELETE 请求服务器删除Request-URI所标识的资源
  • TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
  • CONNECT 保留将来使用
  • OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

常见的HTTP请求如下:

1
2
3
4
5
6
7
8
9
10
GET /leadmail/main/viewletter.asp?nf_id=100290 HTTP/1.1
Host: www.nice-jj.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://www.nice-jj.com/leadmail/main/letterlist_01.asp?nf_listcount=7
Cookie: ASPSESSIONIDQSTQRRSS=HKCHFBABDLDACAMCAPDHJGJH
Connection: close
Upgrade-Insecure-Requests: 1

每个HTTP请求的第一行都有3个以空格间隔的项目组成。

  • 一个说明HTTP方法的动词。最常用的方法为GET,它的主要作用是从Web服务器获取一个资源。GET请求没有消息主体,因此在消息头后的空白行中没有其他数据。
  • 所请求的URL。该URL通常由所请求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成。在该URL中,查询字符串以?字符标识,上面的示例有一个名为nf_id、值为100290的参数。
  • 使用的HTTP版本。因特网上常用的HTTP版本为1.0和1.1,多数浏览器默认使用1.1版本。这两个版本的规范之间存在一些差异;然而,当攻击Web应用程序时,渗透测试中可能遇到的唯一差异是1.1版本必须使用Host请求头。
    请求示例中的其他一些要点如下:
  • Host:用于指定出现在被访问的完整URL中的主机名称。如果几个Web站点以相同的一台服务器为主机,就需要使用Host消息头,因为请求第一行中的URL内通常并不包含主机名称
  • User-Agent:提供与浏览器或其他生成请求的客户端软件有关的消息。请注意,由于历史原因,大多数浏览器中都包含Mozilla前缀。这是因为最初占支配地位的Netscape浏览器使用了User-Agent字符串,而其他浏览器也希望让Web站点相信它们与这种标准兼容。与计算领域历史上的许多怪异现象一样,这种现象变得很普遍,即使当前版本的Internet Explorer也保留了这一做法,示例的请求即由Internet Explorer提出。
  • Accept:告诉服务器当前客户端可以接收的文档的类型。其实这里包含了/,就表示什么都可以接收。
  • Accept-Language:表示当前客户端(浏览器)可以支持的语言
  • Accept-Encoding:浏览器发给服务器,声明浏览器支持的编码类型
  • Referer:当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的(可用于CSRF防御)
  • Cookie:网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据

三、HTTP响应

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
常见的HTTP响应如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HTTP/1.1 200 OK
Date: Tue, 23 May 2017 08:01:16 GMT
Server: IBM_HTTP_Server
set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH
Cache-Control: no-cache
Pragma: no-cache
Accept-Ranges: bytes
Content-Length: 41975
Content-Type: text/html
Connection: close
<!doctype html>
<html>
<head>
<meta name="baidu-site-verification" content="UWbA16hwgi" />
<meta name="baidu-site-verification" content="JKGFcwzBs5" />
...

每个HTTP响应的第一行由3个以空格间隔的项目组成

  • 使用的HTTP版本。
  • 表示请求结果的数字状态码。200是最常用的状态码,它表示成功提交了请求,正在返回所请求的资源。
  • 一段文本形式的“原因短语”,进一步说明响应状态。这个短语中可包含任何值,当前浏览器不将其用于任何目的。
    响应示例中的其他一些要点如下:
  • Date:消息发送的时间。
  • Server:指明所使用的Web服务器软件。有时还包括其他信息,如所安装的模块和服务器操作系统。但信息并不一定准确。
  • set-Cookie: 向浏览器发送另一个Cookie,它将在随后向服务器发送的请求中由Cookie消息头返回。
  • Pragma: 指示浏览器不要将响应保存在缓存中。
  • Content-Length:规定消息主体的字节长度。
  • Content-Type: 用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。

四、URL

URL(Uniform Resource Locator,统一资源定位符)是标识Web资源的唯一标识符,通过它即可获取其标识的资源。常用的URL格式如下:

1
protocol://hostname[:port]/[path/]file[?param=value]

这个结构中有几个部分是可选的。如果端口号与相关协议使用的默认值不同,则只包含端口号即可。

五、HTTP消息头

HTTP支持许多不同的消息头,其中一些专用于特殊用途。一些消息头可用在请求与响应中,而其他一些消息头只能专门用在某个特定的消息头中。下面列出一些在渗透测试中攻击Web响应程序时可能遇到的消息头。

1.常用消息头

  • Connection:这个消息头用于告诉通信的另一端,在完成HTTP传输后是关闭TCP连接,还是保持连接开放以接收其他消息。
  • Content-Encoding:这个消息头为消息主体中的内容指定编码形式,一些应用程序使用它来压缩响应以加快传输速度。
  • Content-Length:这个消息头用于规定消息主体的字节长度。
  • Content-Type:用于规定消息主体的内容类型。

2.请求消息头

  • Accept:用于告诉服务器客户端愿意接受哪些内容,如图像类型、办公文档格式等。
  • Accept-Enconding:告诉服务器,客户端愿意接受哪些内容编码。
  • Authorization:用于为一种内置HTTP身份验证向服务器提交证书。
  • Cookie:这个消息头用于向服务器提交它以前发布的cookie。
  • Host:用于指定出现在所请求的完整URL中的主机名称。
  • If-Modified-Since:用于说明浏览器最后一次收到所请求的资源的时间。如果自那以后资源没有发生变化,服务器就会发出一个带状态码304的响应,指示客户端使用资源的缓存副本。
  • If-None-Match:用于指定一个实体标签。实体标签是一个说明消息主体内容的标识符。当最后一次收到所请求的资源时,浏览器提交服务器发布的实体标签。服务器可以使用实体标签确定浏览器是否用于资源的缓存副本。
  • Origin:这个消息头用在跨域Ajax请求中,用于指示提出请求的域。
  • Referer:用于指示提出当前请求的原始URL。
  • User-Agent:这个消息头提供与浏览器或生成请求的其他客户端软件有关的消息。

3.响应消息头

  • Access-Control-Allow-Origin:这个消息头用于指示可否通过跨域Ajax请求获取资源
  • Cache-Control:用于向浏览器传送缓存指令
  • Etag: 用于指定一个实体标签。客户端可在将来的请求中提交这个标识符,获得和If-None-Match消息头中相同的资源,通知服务器浏览器当前缓存中保存的是哪个版本的资源。
  • Expires:用于向浏览器说明消息主体内容的有效时间。在这个时间之前,浏览器可以使用这个资源的缓存副本。
  • Pragma:用于向溜阿里纳奇传送缓存指令
  • Server:提供所使用的Web服务器软件的相关信息
  • Set-Cookie:用于向浏览器发布Cookie,浏览器会在随后的请求中将其返回给服务器。
  • WWW-Authenticate:用在带401状态码响应中,提供与服务器所支持的身份验证类型有关的信息。
  • X-Frame-Options:指示浏览器框架是否及如何加载当前的响应

六、Cookie

Cookie是大多数Web应用程序所依赖的HTTP协议的一个关键组成部分,攻击者通过它来利用Web应用程序中的漏洞。服务器使用Cookie机制向客户端发送数据,客户端保存Cookie并将其返回给服务器。与其他类型的请求参数不同,无需应用程序或用户采取任何特殊措施,随后的每一个请求都会继续向服务器提交Cookie。
服务器使用Set-Cookie响应消息头发布Cookie:
Set-Cookie:ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH
然后,用户的浏览器自动将下面的消息头添加到随后返回给同一服务器的请求中:
Cookie:ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH
Cookie一般由一个名/值对构成,但也可包含任何不含空格的字符串。可以在服务器响应中使用几个Set-Cookie消息头发布多个Cookie,并可在同一个Cookie消息头中用分号分隔不同的Cookie,将它们全部返回给服务器。
除Cookie的实际值外,Set-Cookie消息头还可包含一下任何可选属性,用它们控制浏览器处理的Cookie的方式。

  • expires:用于设定Cookie的有效时间。这样会使浏览器将Cookie保存在永久性的存储器中,在随后的浏览器会中重复利用,直到到期时间为止。如果没有设定这个属性,那么Cookie仅用在当前浏览器会话中。
  • domain:用于指定Cookie的有效域。这个域必须和收到的Cookie的域相同,或者是它的父域。
  • path:用于指定Cookie的有效URL路径。
  • secure:如果设置这个属性,则仅在HTTPS请求中提交Cookie。
  • HttpOnly:如果设置这个属性,将无法通过客户端JavaScript直接访问Cookie。

参考书籍:黑客攻防技术宝典-Web实战篇

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器