防止改包方式
主要是这么几个方面
1. 请求参数和路径的加密(靶场未实现)
-
如果原始请求是GET请求,或防止访问者获取请求路径,通常会将用户实际的请求路径和GET请求参数封装都封装为POST请求的请求体,通过加解密网关再还原为原始GET请求传入后端分布式服务上。 在APP中比较常见。
表现的形式通常为: 抓包后发现访问任何功能都是同一路径,并且请求全为密文
2. 请求体的加密
- 这类在纯web中最常见, 通常仅仅加密接口请求的请求体内容,但有以下几类加密问题。
- 使用固定密钥 --- 顾名思义, 这种情况一般JS中会存储密钥, 属于最简单的一种
- 使用动态密钥 --- JS中不存储,一般用户第一次请求后将密钥加密写入COOKIE或本地存储中, 这类加密追踪难度较大。
- 对称加密 --- 加解密数据包内容同一套密钥
- 非对称加密 --- 加密一套解密一套
- 算法 --- 算法就不是特别固定了, 常见的诸如AES RSA等, 也遇到过使用国密算法或一些冷门算法。
3. 签名
- 签名的应用也十分广泛,app,小程序和现在许多web中均存在,签名的构成主要是以下几点
- RequestId --- 为了防止重放攻击, 客户端生成随机RequestId 服务端接收后保存至Redis中, 如果再次接收到此RequestID, 则视为非法请求
- 时间戳 --- 添加时间戳的超时时间, 一旦超时, 原始数据包失效
- 签名本身 --- 通过 requestId + 原始请求体或请求参数 + 时间戳 + 盐值合并生成哈希值 从而保证以上参数的有效性和唯一性