HTTP协议与攻击

Posted wu6660563

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP协议与攻击相关的知识,希望对你有一定的参考价值。

以下内容为阅读《图解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优先的语言
AuthorizationWeb认证信息
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-AgentHTTP客户端程序的信息
  • 响应头部字段
    从服务器端向客户端返回响应报文的时候用的头部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
头部字段名说明
Accept-Ranges是否接受字节范围请求
Age推算资源创建经过时间
ETag资源的匹配信息
Location令客户端重定向至指定URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次请求的时机要求
ServerHTTP服务器的安装信息
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)通过攻击安全漏洞使服务停止

以上是关于HTTP协议与攻击的主要内容,如果未能解决你的问题,请参考以下文章

[RoarCTF 2019]Easy Calc-协议层攻击之HTTP请求走私

HTTP协议攻击方法汇总(上)

SSRF漏洞

HTTPS 协议降级攻击原理

Go开源宝藏CORS 跨域 与 CSRF攻击 | 中间件

从历史漏洞到检测做法,浅析HTTP协议内攻击检测基本原理