作者CMJ0121 (请多指教!!)
看板NetSecurity
标题[闲聊] 2017.W09 - CSRF 的攻与受
时间Tue Feb 28 10:45:44 2017
2017.W09 - CSRF 的攻与受
> 吊念 228 一早起来就开始写扣
## 前言 ##
一直没有人想投稿 内容越写越广了 ...
再没人投稿 下一次可能就要写 OS 了 QQ
## 内容 ##
CSRF (Cross-Site Request Forgery)[0],中文称之为跨站请求伪造
是一种伪造使用者操作的攻击手法
因为攻击形式又被叫做 one-click attack [1]
攻击的方式 利用伪造使用者正常的请求 (HTTP Request) 而达到攻击的目的
一般来说透过浏览器的请求 都用 HTTP[2] 的 GET、POST 等请求来完成
除了一些些特例之外
网站的设计者 对於某些敏感的操作 (e.g. 删除、汇款) 都会验证身份
这里的验证身份 在食物上都会用 session 来确认使用者是已经登入的帐号
(题外话 有兴趣的人记得要了解 Cookie 与 Session 的差别)
因为 Browser 的特性 会将可以使用的 cookie 一并包含在 HTTP 请求当中
攻击者就用这个特性来做到 one-click attack 的攻击
可以参考此文章[3] 的情境 发现攻击者可以利用以下方式来发送 CSRF:
1. 一个图文不符的假 Link (<a>、<img> 等)
2. 你看不到的 iframe
3. JavaScript 自动帮你 Submit 一个 POST 请求
## 防御方式 ##
一个好的网站设计者 会提供一个 CSRF Token 或者 state token
来确定这次的 HTTP 请求真的是 user
当下 送出的
Token 可以根据实作上的方式 分为绑定 session 或者是每次都不一样
前者可以防御 CSRF 的攻击 而後者则可以防御重放攻击 (Reply Attack)[4]
重放攻击是重复执行上一次使用者合法的操作
像是 Alice 汇款给 Bob
Bob 就可以利用 Reply Attack 让 Alice 一直汇 一直汇 一直汇...
另一种则是 Chrome 最新提出来的 SameSite Cookie[5]
也就是 Browser 只会在 Host 跟请求网站一致的时候 才会将 Cookie 包含在请求当中
透过这种方式 就可以完全避免掉 CSRF
[0]:
https://en.wikipedia.org/wiki/Cross-site_request_forgery
[1]:
https://www.owasp.org/index.php/One-Click_Attack
[2]:
https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
[3]:
http://blog.techbridge.cc/2017/02/25/csrf-introduction/
[4]:
https://en.wikipedia.org/wiki/Replay_attack
[5]:
https://www.chromestatus.com/feature/4672634709082112
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 223.140.197.59
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/NetSecurity/M.1488249946.A.A48.html
1F:推 qqdn: 赞 谢谢 无意间看到这个 这系列的教学是什麽活动吗 03/02 11:56
2F:→ CMJ0121: 其实只是当初当上版主 承诺的每周分享 03/02 22:52
3F:推 qqdn: 原来如此 感谢分享 03/03 04:53
4F:→ outofyou: 感谢分享 03/03 16:25