HTTP传输窃听
客户端与服务端之间数据的传输离不开HTTP,然而HTTP传输的过程是否完全安全呢?答案肯定不是
本文介绍HTTP传输数据过程中存在的安全问题及防御
HTTP传输过程介绍
- 客户端
用户侧使用的APP、网站、小程序等 - 链路
用户从客户端发起请求数据到达后端服务的网络过程,过程中可能经过负载均衡(elb)、网络专线、网络规则VPC等网络节点 - 服务端
响应、保存客户端请求数据
一般而言,http协议是以明文方式进行传输。前端向后端发起http请求,中间都会经过各种各样的网关、节点、专线等,最后到达目标服务器。但是在传输过程中的节点上,是可以获取到http传输的信息,可以随意的进行数据的窃听和篡改!这也是http明文传输的弊端所在。
如果没有保证传输层的安全,那么系统中的xss、csrf防御的措施,也就没有意义。
HTTP传输窃听危害
窃听
- 窃听用户敏感信息
只要用户的敏感信息在网络传输,就都可以被获取到。比如银行的登录账号、密码;邮件内容等
篡改网站
- 更改网站信息,插入广告
- 重定向用户访问的安全网站
- 广告进行运营商劫持
- 公共wifi获取密码
攻击思路解析
- 可以通过http访问的线上运行项目
- 代理服务
用户通过客户端正常访问某个部署在云端的A系统,在整个访问过程中经过某些节点、网管到达目标服务器,尽管传输层存在诸多链路,但是这些大多都是XX云的产品或者开发者自行部署,链路相对来说都是受控且安全的。
如果在整个传输过程中加入另一台不受控制且不安全的代理服务器尼?
举几个例子:
1.公共wifi
2.国内是无法直接访问网外,但是加上代理就可以
3.访问部署在XX云上的服务,出现了XX云的广告
4.攻击者号称快速安全的代理服务器
...
这些都是通过代理服务器的方式去访问目标服务器,此时就可以在代理服务器中做处理,去窃听、篡改用户数据。
HTTP传输窃听就是发生在代理服务器中。
实践
主要以nodejs的代理工具库-anyproxy为主讲解
阿里开源的代理服务器,用于移动端的抓包测试等
官网地址:github.com/alibaba/any…
anyproxy简介
1、AnyProxy 是阿里巴巴基于 Node.js 开发的一款开源代理服务器
2、代理服务器站在客户端和服务端的中间,它可以收集双方通信的每个比特。一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务所使用的代理协议,请求对目标服务器创建连接或者获取目标服务器的指定资源。一些代理协议允许代理服务器改变客户端的原始请求、目标服务器的原始响应。
3、AnyProxy 是完全可以灵活配置的代理服务器。它支持 https明文代理 ,且提供了 Web 界面便于观测请求情况,同时支持二次开发,可以用 JavaScript 来控制代理的全部流程,搭建前端个性化调试环境。
特性
- 支持https明文代理
- 支持低网速模拟
- 支持二次开发,可以用javascript控制代理的全部流程,搭建前端个性化调试环境
- 提供web版界面,观测请求情况
安装&&启动&&配置代理
1、全局安装
npm install -g anyproxy
2、默认启动
anyproxy #默认启动端口8001
# 或者
anyproxy --port 8001
3、可视化访问
pc端访问http://127.0.0.1:8002/,进入web可视化页面访问
这步结束,anyproxy配置完毕,接着配置浏览器代理
4、配置chrome代理
a.chrome-设置-高级-打开您计算机的代理设置
b.代理-使用代理服务器-配置地址:127.0.0.1 端口:8001
使用
访问目标网址后,即可在anyproxy的可视化界面上看到传输数据
通过代理服务器访问目标服务器,过程中所有的传输数据对于代理服务器来讲,都将是可获取、可修改的。
规则模块
规则模块是AnyProxy的特性。可以说是一个中间件,在中间件中编写自己的代码可以在传输的任何阶段来窃听、篡改请求。
官方简易版request_header.js
/*
sample:
modify the user-agent in requests toward httpbin.org
test:
curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
*/
module.exports = {
*beforeSendRequest(requestDetail) {
if (requestDetail.url.indexOf('http://httpbin.org') === 0) {
const newRequestOptions = requestDetail.requestOptions;
newRequestOptions.headers['User-Agent'] = 'AnyProxy/0.0.0';
return {
requestOptions: newRequestOptions
};
}
},
};
官方简易版response_header.js
/*
sample:
modify response header of http://httpbin.org/user-agent
test:
curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
expected response:
X-Proxy-By: AnyProxy
*/
module.exports = {
*beforeSendResponse(requestDetail, responseDetail) {
if (requestDetail.url.indexOf('http://httpbin.org/user-agent') === 0) {
const newResponse = responseDetail.response;
newResponse.header['X-Proxy-By'] = 'AnyProxy';
return {
response: newResponse
};
}
}
};
再将规则配置进代理服务器,就可以完成代理服务器的搭建
var proxy = require("anyproxy");
//create cert when you want to use https features
//please manually trust this rootCA when it is the first time you run it
!proxy.isRootCAFileExists() && proxy.generateRootCA();
var options = {
type : "http",
port : 8001,
hostname : "localhost",
rule : require("path/to/my/ruleModule.js"),//代理规则
dbFile : null, // optional, save request data to a specified file, will use in-memory db if not specified
webPort : 8002, // optional, port for web interface
socketPort : 8003, // optional, internal port for web socket, replace this when it is conflict with your own service
throttle : 10, // optional, speed limit in kb/s
disableWebInterface : false, //optional, set it when you don't want to use the web interface
setAsGlobalProxy : false, //set anyproxy as your system proxy
silent : false //optional, do not print anything into terminal. do not set it when you are still debugging.
};
new proxy.proxyServer(options);
通过分析,在规则代码逻辑里就可以窃听、保存、篡改用户通过代理服务器访问目标服务器的请求及响应数据。
由此联想,公共场所的wifi、访问国外的代理服务器...一旦被攻击者利用,对于用户来讲就不存在数据安全可言。
HTTP传输窃听防御
敏感数据加密
用户名密码加密,加密方法越复杂越安全。
根据需要,常见的MD5(不可逆),aes(可逆)自由搭配,再加入特殊符号等。
HTTPS
HTTP+TLS(SSL)=>HTTPS
基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。
HTTPS特性
- 内容加密- 采用混合加密技术,中间者无法直接查看明文内容。
- 验证身份- 通过CA证书认证,客户端访问的目标服务器是已认证的服务端
- 保护数据完整性- 防止传输过程中数据被篡改
客户端——中间层——目标服务器
中间层可以解密浏览器发送的数据,然后加密后发送给服务器。但是这样也会收到http的窃听和篡改风险。这时就需要认证过程。 加密解密必须是可信任的——CA证书机制。
浏览器会内置信任列表,标识目标网站服务器是否安全可信。 目标服务器需要向CA证书发布的机构进行证书申请。有证书的网站在访问时,浏览器会对比目标服务器域名信息和CA证书的信任信息是否相同,如果信任的网站,就可正常访问。
CA证书作用
- 保密性 - 只有收件人才能阅读信息。
- 认证性 - 确认信息发送者的身份。
- 完整性 - 信息在传递过程中不会被篡改。
- 不可抵赖性 - 发送者不能否认已发送的信息。
- 保证请求者与服务者的数据交换的安全性
CA证书安全原则
- 证书无法伪造
- 证书秘钥不被泄露
- 域名管理权限不能泄露
- CA机构坚守原则-验证域名