这种破解 CSRF 防御的方法是否可行?

2018-02-05 00:44:48 +08:00
 xvrzhao

我们首先统一一下口径: 站点 A:被攻击的网站 站点 B:伪造请求的网站

一般网站的防御方法是: 判断请求中的 token 和 cookie 中的 token 是否相同,相同则表示请求发起者和会话用户是同一个人。

这种防御方法可行的原因是: 站点 B 无法获取到站点 A 的 cookie,所以无法在请求中添加 token。

但,我们假设站点 B 知道站点 A 的某个页面表单里有隐藏的 token 字段,那么,站点 B 在自己的页面中写一个隐藏的 iframe 去请求这个页面。(这里有一个问题,iframe 会创建新的会话吗?但不管会不会,都有如下可能)

  1. iframe 不会生成新的会话。那么对于用户而言,假设用户在访问站点 A 后没有关闭站点又去访问了站点 B,那么站点 B 中的 iframe 和站点 A 属于同一个会话,也就是说他们的 token 相同。这个时候站点 B 通过预先写好的脚本去获取到 iframe 中的 token,然后在伪造的请求中加入这个 token,能否成功?

  2. iframe 会生成新的会话。那也就是说站点 B 的 iframe 中的 token 和站点 A 的 token 值是不相同的,但是可以使用以下方法去伪造请求:站点 B 不是直接在页面中添加伪造请求,而是在 iframe 里去添加伪造请求,由于 iframe 中是站点 A 的会话,所以请求会带着站点 A 的 cookie 一起发出去,由于 iframe 和站点 A 共用一套 cookie (因为同域),所以就成功盗用了用户的身份。这种方法可行吗?

5949 次点击
所在节点    程序员
20 条回复
40huo
2018-02-05 00:51:06 +08:00
你说的这个应该在 xss 和同源策略的范围讨论,和 csrf 已经关系不大了
fy
2018-02-05 00:53:24 +08:00
> 这里有一个问题,iframe 会创建新的会话吗?
会,但是并不能跨域进行对 iframe 的任何操作。所以取不到 token。
lxy
2018-02-05 01:06:26 +08:00
因为同源策略,所以你无法获取 token
>Scripts trying to access a frame's content are subject to the same-origin policy, and cannot access most of the properties in the other window object if it was loaded from a different domain.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe
yyfearth
2018-02-05 04:03:58 +08:00
这个 首先你就没办法访问跨域的 iframe 所以你说的方法从根本上就不可能
alvinbone88
2018-02-05 08:18:00 +08:00
一般带有 CSRF 防御的页面通常会在 HTTP 的响应头里加一个 X-Frame-Options 来阻止页面在 iframe 中加载,所以把页面嵌在 iframe 里根本不可能,得到的结果就是一片空白
另外提醒一下,在页面中加<meta http-equiv="X-Frame-Options" content="deny">会被部分浏览器忽略掉(比如 IE )
zjsxwc
2018-02-05 08:26:46 +08:00
```
一般网站的防御方法是: 判断请求中的 token 和 cookie 中的 token 是否相同,相同则表示请求发起者和会话用户是同一个人。
```

楼主你一开始就搞错了吧,不是判断 cookie 的 token 而是服务器端 session 里的 token
xvrzhao
2018-02-05 08:32:32 +08:00
MeteorCat
2018-02-05 08:57:21 +08:00
首先,其实就目前来说所有语言的 Web 现代化框架都带有对这种方法的屏蔽,基本上都是内部页面表单会生成一个 hidden 的字段,确保这次提交是请求服务之后返回下来表单(虽然很多人都不用这个,因为基本上除非你直接网页就被挂马,否则内嵌而已 iframe 来提交表单基本上可以认定为小概率事件不做考虑);其次就是如何内嵌 iframe 到页面做请求?楼主有真实案例?纸上得来终觉浅,绝知此事要躬行
oott123
2018-02-05 09:20:23 +08:00
可见只是你可见,对脚本不可见,如果脚本都可见,那就是 xss 了…
另外通过 iframe 攻击的有跨站框架攻击( xfs ),也有对应的防御方法。
RadishWind
2018-02-05 09:38:04 +08:00
有同源策略的 不然太不安全了
ai277014717
2018-02-05 10:04:59 +08:00
不错,昨天还在看 express 官方中间件 csrf 的代码,确实只要保证 token 喝 cookie 中的 token 一致就可以了。
就是想办法拿到 cookie 就可以了
binux
2018-02-05 10:22:39 +08:00
你都用上插件了,还费那个劲搞什么 iframe 啊,A 的 cookie 你不是想读就读,想写就写吗。
说白了就是,想得太多,多读点书。
liuguang
2018-02-05 10:22:41 +08:00
你拿不到别人的 cookie 的,自然也拿不到 Token,你觉得伪造一个 Token 会有效吗、、、
LeungJZ
2018-02-05 10:36:16 +08:00
楼主不是前端吧。
怎么可能可以获取一个跨域 iframe 里面的东西?
DOLLOR
2018-02-05 11:30:18 +08:00
1、iframe 也必须遵循同源策略的,B 是无法获取 iframe 里 A 的 cookie,浏览器会简单粗暴地拒绝你的脚本。
2、如果用上扩展了,都可以监听用户的键盘、鼠标操作了,都可以窜改页面了,比绕个弯子搞 iframe 的更好的方法多了去了。
johnnie502
2018-02-05 12:50:38 +08:00
扩展也是有作用域的,你搞个作用域是所有网站的,还不是随便什么域都可以看。这种东西不是那么容易被破的,总想搞个大新闻
virusdefender
2018-02-05 13:34:32 +08:00
思而不学则殆 / 纸上得来终觉浅

楼主不测试就发帖子啊
wanguorui123
2018-02-05 17:08:34 +08:00
除非浏览器允许跨域访问或者浏览器漏洞,否则就不可能
pynix
2018-02-05 21:34:25 +08:00
@binux 😂
Telegram
2018-02-06 08:17:58 +08:00
跨域知道不? A 站没设置信任 B,B 根本就取不到 A 的数据,只要是个正常的浏览器,都不让你读。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/428465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX