HTTP协议与攻击

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wu6660563/article/details/85269965

以下内容为阅读《图解HTTP》的时候整理的关键性信息,用以加深理解

Web基础

首先总所周知,HTTP是建立在TCP/IP之上的,也就是说,HTTP是TCP/IP的一个子集。

TCP/IP

TCP/IP分四层:应用层、传输层、网络层、数据链路层
而网络是分七层协议:7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层

IP协议:把各种数据包传送给对方,而要保证确认一定能传送到对方。需要满足各类条件。其中最重要的就是IP地址和MAC地址

TCP协议:TCP位于传输层,提供可靠的字节流服务。字节流就是为了方便的传输,将大块的数据分割成以报文的方式传输,而可靠的传输服务就是把数据准确的可靠的传输给对方。总结就是TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达对方。

  • TCP三次握手
    握手过程中有个TCP的标志。SYN和ACK
    在这里插入图片描述

HTTP协议概念

此处主要是HTTP/1.1版本
HTTP 协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应。

POST /form/entry HTTP/1.1 # 分别表示 方法、URL、协议版本
Host: xxx.com #host、connection、content-type、content-length请求体
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 16
name #内容实体

HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 06:50:15 GMT
Content-Length: 362
Content-Type: text/html
<html>
...

HTTP协议是个无状态协议

HTTP协议是无状态的。HTTP协议自身不对请求和响应的状态进行保存。
登陆状态其实是基于Cookie或者Session的,Cookie是客户端的,而Session是服务器端的。

HTTP方法

  • GET : 获取资源
请求/响应 描述
请求 GET /index.html HTTP/1.1
Host: www.hackr.jp
If-Modified-Since: Thu, 12 Jul 2012 07:30:00 GMT
响应 仅返回2012年7 月12日7 点30分以后更新过的index.html页面资源。如果未有内容更新,则以状态码304 Not Modified作为响应返回
  • POST:传输主体数据,提交数据等
请求/响应 描述
请求 POST /submit.cgi HTTP/1.1
Host: www.hackr.jp
Content-Length: 1560(1560字节的数据)
响应 返回 submit.cgi 接收数据的处理结果
  • PUT:传输数据,提交数据,推送数据,传输文件等

  • HEAD:获取报文头部
    HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认URI 的有效性及资源更新的日期时间等。

  • DELETE:删除数据
    DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。

  • OPTIONS:询问支持的方法

请求/响应 描述
请求 OPTIONS * HTTP/1.1
Host: www.hackr.jp
响应 HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS(返回服务器支持的方法)
  • TRACE :追踪路径
    很少用到,容易引发XST攻击,不建议使用
  • CONNECT:要求用隧道协议连接代理

整理各个方法在HTTP/1.0和HTTP/1.1支持情况

方法 说明 支持的 HTTP 协议版本
GET 获取资源 1.0、1.1
POST 传输实体主体 1.0、1.1
PUT 传输文件1.0、1.1
HEAD 获得报文头部 1.0、1.1
DELETE 删除文件 1.0、1.1
OPTIONS 询问支持的方法 1.1
TRACE 追踪路径 1.1
CONNECT 要求用隧道协议连接代理 1.1
LINK 建立和资源之间的联系 1.0
UNLINE 断开连接关系 1.0

持久连接节省通信量

每个请求都是一个 建立TCP连接 -> HTTP请求/响应 -> 断开TCP连接 ,而随着网页越来越多请求,带宽和响应时间都加大了,那么需要持久连接HTTP keep-alive。特点是:只要任意一端没有明确断开连接,则保持TCP连接状态

Cookie状态管理

为了让HTTP保存状态信息,引入了Cookie概念

  1. 请求报文(没有Cookie状态)
GET /reader/ HTTP/1.1
Host: xxx.com
  1. 响应报文(服务器生产Cookie信息)
HTTP/1.1 200 OK
Date: Thu, 12 Jul 2018 07:12:20 GMT
Server: Apache
<Set-Cookie: sid=1342077140226724; path=/; expires=Wed,
10-Oct-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8
  1. 请求报文(自动发送保存Cookie的信息)
GET /image/ HTTP/1.1
Host: xxx.com
Cookie: sid=1342077140226724

HTTP报文内的HTTP信息

HTTP报文结构如下:
在这里插入图片描述

请求报文和响应报文的头部内容由以下数据组成。

  • 请求行
    包含用于请求的方法,请求URI和HTTP版本

  • 状态行
    包含表明响应结果的状态码,原因短语和HTTP版本

  • 头部字段
    包含表示请求和响应的各种条件和属性的各类头部。
    一般有4种头部,分别是:通用头部、请求头部、响应头部和实体头部

  • 其他
    可能包含HTTP的RFC里面未定义的头部(Cookie等)

编码提升传输速率

可以通过编码的方式提升传输速率,但是编码的时候,会消耗CPU的资源

  • 报文(message)
    是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
  • 实体(entity)
    作为请求或响应的有效载荷数据被传输,其内容由实体头部和实体主体组成。

内容编码,主要有以下几种编码方式:

  • gzip (GUN zip)
  • compress (UNIX系统的标准压缩)
  • deflate (zlib)
  • identity (不进行编码)

多部分对象集合

HTTP协议中采用了多部分对象集合,发送一份报文主体可能含有多类型实体。用的最多的就是图片和文本文件中的上传中使用

  • multipart/form-data
    在WEB表单文件上传中使用
  • multipart/byteranges
    状态码206,响应报文包含多个范围的内容时使用。

获取部分内容的请求

当需要请求一个很大的图片,或者文件的时候。如果下载过程中遇到网络中断,原则上是必须重新开始。为了解决上面的问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载。

要实现这种功能,需要指定下载的实体范围。范围请求

byte范围的指定形式:

  • 5001-10000 字节
    Range: bytes=5001-10000
  • 从5001字节之后全部
    Range: bytes=5001-
  • 从一开始到3000字节和5000-7000字节的多重范围
    Range: bytes=-3000, 5000-7000

HTTP状态码

HTTP状态码负责表示客户端的HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现错误。

状态码的类别
|状态码| 类别| 描述说明|
|1XX|信息性状态码|接收的请求正在处理|
|2XX|成功状态码|请求正常处理完毕|
|3XX|重定向状态码|需要进行附加操作以完成请求|
|4XX|客户端错误状态码|服务器无法处理请求|
|5XX|服务器错误状态码|服务器处理请求出错|

2XX成功

  • 200 OK
    表示客户端发过来的请求在服务器端被正常处理了
  • 204 No Content
    该状态码代表客户端接收的请求已经成功处理了,但在返回的响应报文中不含实体的主体部分
  • 206 Partial Content
    该状态码表示客户端进行了范围请求,而服务器成功执行了这部分GET请求,响应报文中包含了Content-Range指定范围的实体内容

3XX重定向

  • 301 Moved Permanently
    永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源所指的URI
  • 302 Found
    临时性重定向。表示请求的资源已被分配了新的URI
  • 303 See Other
    该状态码表示由于请求对应的资源存在另外一个URI,应使用GET方法重定向获取请求的资源
  • 304 Not Modified
    该状态码表示客户端发送附带条件的请求,服务端允许请求访问资源,但未满足条件的请求。304状态码返回,不包含任何响应的主体部分
  • 307 Temporary Redirect
    临时重定向,和302相同的含义

4XX客户端错误

  • 400 Bad Request
    该状态码表示请求报文中存在语法错误。错误发生时,需要修改请求的内容再次发送
  • 401 Unauthorized
    表示请求需要认证
  • 403 Forbidden
    表示请求的资源被服务器拒绝了,没权限等等
  • 404 Not Found
    请求的资源无法找到

5XX服务器错误

  • 500 Internal Server Error
    该状态码表示请求发生了错误,也可能是Web应用存在的bug或者临时故障
  • 503 Service Unavailable
    表明服务器暂时处于超负载或者正在停机维护,无法处理请求

HTTP头部

  • HTTP请求报文
    HTTP报文由方法、URI、HTTP版本、HTTP首部字段等构成
  • HTTP响应报文
    在响应中,HTTP报文由HTTP版本、状态码、HTTP头部字段三部分构成

HTTP头部字段结构
HTTP头部字段是由头部字段名和字段值构成的,中间用冒号:分隔
头部字段名:字段值
如:Coontent-Type: text/htmlKeep-Alive: timeout=15, max=100

4种HTTP头部字段类型
HTTP头部根据实际用途分为四种类型

  • 通用头部字段
    请求报文和响应报文都会使用的头部
头部字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳头部、链接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的头部一览
Transfer-Encoding 指定报文body的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
  • 请求首部字段
    从客户端向服务器发送报文时使用的头部。补充了请求的附加内容、客户端信息、响应内容相关优先级
头部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言
Authorization Web认证信息
Expect 期待服务器的特定行为
From 用户所在的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记
If-Range 资源未更新的时候发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间
Max-Forwards 最大传输跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Referer 对请求中URI的原始获取方
TE 传输编码的优先级
User-Agent HTTP客户端程序的信息
  • 响应头部字段
    从服务器端向客户端返回响应报文的时候用的头部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
头部字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
Allow 资源科支持的HTTP方法
Content-Encoding 实体主体使用的编码方式
Content-Language 内容主体的语言
Content-Length 内容主体的大小
Content-Location 替代对应资源的URI
Content-MD5 主体的报文摘要
Content-Range 主体的位置范围
Content-Type 主体媒体类型
Expires 过期时间
Last-Modified 资源的最后修改日期
  • Cache-Control

缓存请求指令

指令 参数 说明
no-cache 强制向源服务器再次验证
no-store 不缓存请求或者响应的任何内容
max-age=[秒] 必需 响应的最大Age值
max-fresh=[秒] 必需 期望在指定时间内的响应仍然有效
no-transform 代理不可更改媒体类型
only-if-cached 从缓存获取资源
cache-extension - 新指令标记

缓存响应指令

指令 参数 说明
public 可向任意方提供响应的缓存
private 可省略 仅向特定用户返回响应
no-cache 可省略 缓存前必须先确认其有效性
no-store 不缓存请求或响应的任何内容
no-transform 代理不可更改媒体类型
must-revalidate 可缓存但必须再向源服务器进行确认
max-age=[秒] 必需 响应的最大Age值
s-maxage=[秒] 必需 公共缓存服务器响应的最大Age值
cache-extension - 新指令标记

安全

在HTTP协议中有可能存在信息窃听和身份伪装等安全问题。使用HTTPS通信机制可以有效防止这些问题。

HTTP的缺点

HTTP主要有这些不足,例举如下:

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,有可能遭篡改

可以使用抓包工具Wireshark,可以获取HTTP协议的请求和响应的内容,对其进行解析

  • 加密处理防止被窃听
    可以使用HTTPS,通过使用SSL的HTTP成为HTTPS

  • 不验证通信方的身份可能遭遇伪装
    HTTP的协议中的请求和响应不会对通信方进行确认。也就是说存在服务器是否就是发送请求中的URI真正指定的主机,可能出现任何人都可以发起请求,无法判断请求是来自何方、出自谁手

  • 无法证明报文完整性,有可能已经被篡改
    如果防止篡改,可以通过MD5或者SHA-1等散列值校验的方法,用来确认文件的数字签名方法

基于HTTP的功能追加协议

WebSocket

WebSocket,即Web浏览器与Web服务器之间全双工通信标准。WebSocket技术主要是为了解决Ajax和Comet里面的XMLHttpREquest附带的缺陷所引起的问题

特点

  • 推送功能
    支持由服务器向客户端推送数据的推送功能,这样服务器可直接发送数据,而不需要等客户端的请求

  • 减少通信量
    只要建立起WebSocket,就希望一直保持连接状态

  • WebSocket API
    下面是调用WebSocket API,每50ms发送一次数据:

var socket = new WebSocket('ws://xxx.com:12010/xxx');
socket.onopen = function() {
    setInterval(function() {
        if(socket.bufferedAmount == 0) {
            socket.send(getUpdateData());
        }
    }, 50);
}

WEB攻击

WEb的攻击技术

HTTP协议本身并不存在安全性问题,因为协议本身不会成为攻击的对象。但是HTTP比较简单,所以运用广泛,所以很多人用来攻击

  • 客户端就篡改请求
    浏览器接收的HTTP请求,在客户端都可以自由的修改和篡改。会导致接收到的与预期数据不相同的内容。

从攻击手段来说,有两个,主动攻击被动攻击
主动攻击:主动攻击是通过直接访问WEB应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源,比如最常见的SQL注入攻击OS命令攻击

  • 跨站脚本攻击(XSS)
    跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户浏览器内运行非法的HTML标签或者JavaScript进行的一种攻击。
    如:http://xxx.com/login?ID=<script>alert('111')</script>

用户还可以通过脚本窃取到Cookie信息,用来攻击

  • SQL注入攻击
    SQL注入是针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。该安全隐患有可能引发极大的威胁,有时直接导致个人信息及机密信息的泄露

Web应用通常会用到数据库,当需要对数据库表内的数据进行检索或者添加、删除等操作的时候,会使用SQL语句链接数据库进行特定的操作

如最典型的登录,SQL注入如下:
select id,user_name from sys_user where user_name='xxx' and password= ' ' or '1'='1'

用户在浏览器只需要在用户名那里随便输入什么东西,密码输入' or '1'='1即可达到SQL注入的效果

  • OS命令注入攻击
    OS命令注入是指当调用某些特定的程序的时候,系统触发了系统命令,导致严重的后果,如程序直接调用了rm命令,造成非常严重的后果。

  • HTTP头部攻击
    头部攻击就是用户自己输入任意的地址,这个地址触发了后台功能,比如我们有个删除功能是/sysuser?delete=1,如果后台没有设置权限校验,用户自己输入某个id,这个id是另外的用户,而业务上本身用户不应该具备这个能力,这个时候数据直接删了,后果很严重

主要有这些影响:设置任何Cookie信息重定向至任意URL

  • 目录攻击
    目录攻击是本来有个功能,系统业务上不想让他开放出来,实际又开放了,如

正常情况:

http://xxx.com/xxx.jsp?log=0401.log

攻击者攻击如下:

http://xxx.com/xxx.jsp=log=.././etc/passwd

如果这个用户有权限的话,刚好就有公开的风险!

  • 开放重定向攻击
    如系统开放了重定向,那么后果很严重
http://xxx.com/?redirect=http://www.xxxx.com

如果用户发现了,那么可以改成另外的:

http://xxx.com/?redirect=http://aaa.com
  • Dos攻击
    Dos攻击主要是有两种
    1)是集中利用访问请求,或者攻击者刻意制造访问请求,造成资源过载,资源耗尽,服务停止
    2)通过攻击安全漏洞使服务停止

猜你喜欢

转载自blog.csdn.net/wu6660563/article/details/85269965
今日推荐