不懂就问: csrf 攻击的疑问

2023-08-31 17:59:22 +08:00
 shermie

问题

首先,我是菜鸡,怀着学习的心态提问

xss 攻击者可以利用脚本读取浏览器的 cookie 信息发送到自己的服务器,然后加以利用,这一过程都是在用户登录的网站完成的,可以理解。

但是 csrf 攻击,是诱导已登录的用户点击钓鱼网站,这个过程已经不是同源的了,域名都不一样了,浏览器不会携带网站 A 的 cookie 信息到钓鱼网站 B ,那好像这也并不能构成信心泄漏,大佬解答一下

2537 次点击
所在节点    程序员
19 条回复
thinkershare
2023-08-31 18:20:20 +08:00
我可以诱导你去访问我的网站,然后在我的网站发送一个请求你的网站的一个 GET&POST 请求,这个请求携带的是请求 URL 所在 origin 的 Cookie, 这个过程就是请求伪造。用户被欺骗用他自己的真实身份做了他不知道的事情。
lrwlf
2023-08-31 18:59:59 +08:00
钓鱼网站 B 可以直接跳转到 A 网站的某个接口地址,或者通过 iframe 加载 A 网站的接口,这样构造的 GET 请求可以携带 cookie
SilentRhythm
2023-08-31 19:01:59 +08:00
银行 A 网站,骗子 B 网站,浏览器有 A 网站的 cookie
SilentRhythm
2023-08-31 19:02:09 +08:00
SilentRhythm
2023-08-31 19:03:21 +08:00
点错了,续上
在 B 网站的页面上发起了对 A 网站的请求,如果 A 网站没有校验,是能通过的
8355
2023-08-31 19:18:55 +08:00
是由钓鱼网站 B 带有恶意代码跳转回 A 网站的指定路径通过参数传递+浏览器自动获取本地 cookie 完成鉴权达成目的。
wonderfulcxm
2023-08-31 19:20:53 +08:00
它最终目标 URL 还是 A ,比如从 B 提交一个表单到 A 的 URL ,如果没有限制,就会带上 A 的 cookie 。因为访问 A 网站就会带上 A 的 cookie 。
wangxiaoaer
2023-08-31 19:25:54 +08:00
csrf 不是偷 cookie ,目标不是钓鱼网站,而是用户已经登陆的网站,用来偷偷模拟操作,这个操作可能很危险。
GeruzoniAnsasu
2023-08-31 19:36:27 +08:00
哪有那么抽象,早年微博和贴吧的漏洞见过没,点进一个不正常的「病毒帖」后你会自动地在所有已关注的贴吧里都发一份一样的病毒帖子。


这个就是 CSRF. 只是伪造的用户行为是发帖。如果伪造上传下载文件或者修改什么私有资源的权限之类的行为,那破坏力能大得多。
wudiiiii
2023-08-31 19:55:35 +08:00
关于浏览器安全,只要记着:
1. 本网站存储的信息恶意网站不能读写。(同源策略)
2. 恶意网站能够构造和发送任意参数的请求,而且 cookie 会自动携带。

CORS 策略只限制了跨域请求不能接收响应,但是请求还是可以发出去。
lybcyd
2023-08-31 20:23:20 +08:00
例如 B 网站的一个伪造表单:
<form action="http://www.a.com/deleteAccount" method="post></form>

这个表单本身不违反同源策略,可以在用户不知道的情况下,通过用户已有的 cookie 进行一些很危险的操作。

为了防止类似的提交,通常的做法就是加上一个额外的隐藏 token 并进行校验,伪造的表单是无法获取到隐藏 token 的。像 Spring Security 这种框架一般都默认实现了 csrf token 。
xiaoxiaoming01
2023-08-31 21:25:47 +08:00
在站点 B 调用站点 A 的同源接口时,
它默认不会带站点 B 的 cookie ,
但是会带站点 A 的 cookie 。
xiaoxiaoming01
2023-08-31 21:35:11 +08:00
假设有站点 C ,它使用的接口 d 与它不同源,
那么在站点 C 调用 d 接口时默认不带 cookie ,

如果你后来又部署了一个站点 D ,站点 D 与接口 d 同源,
那么,此时在站点 C 调用接口 d 时,它会默认带 D 站点的 cookie 。
mdn
2023-08-31 22:34:42 +08:00
xss 是 盗用 用户 cookie
csrf 是 冒用 用户 cookie
xhr 和 fetch 不能随意跨站请求资源,需要通过 CORS 策略来支持其跨域,但是 页面中可以引用任意第三方资源,比如
1. <img src="https://www.example.com/deleteAccount"> ,
2. <form action="https://www.example.com/deleteAccount" method=POST>
   <input type="hidden" name="account" value="admin" />
   <input type="submit" value="抢红包" />
</form>
3. <a href="https://www.example.com/deleteAccount" taget="_blank">抢红包<a/>

用户只要登录过 example.com 网站,在第三方网站触发上面任意一种,都会被恶意删除账号
lalalaqwer
2023-08-31 23:06:53 +08:00
@wudiiiii
CORS 只是简单请求能发不一定能接收,非简单请求是浏览器直接拦截发不出去的
ksc010
2023-08-31 23:28:34 +08:00
你应该是 CSRF XSS 闹混了
flyqie
2023-09-01 01:06:32 +08:00
csrf 攻击造成数据泄露一般不是 csrf 自身造成的,或者说 csrf 攻击本身造不成数据泄露。


不要拿 xss 攻击套 csrf 攻击,他俩效果不一样,csrf 攻击本身是啥情况前几楼举的例子已经很清楚了。
shermie
2023-09-01 09:22:05 +08:00
谢谢大佬们 现在是明白了
euronx
2023-09-01 10:58:58 +08:00
另外现在有 same site cookie 限制了

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

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

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

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

© 2021 V2EX