关于Yii2框架中防御CSRF攻击方法的迷惑

发布于 2022-09-03 13:36:14 字数 1419 浏览 11 评论 0

我大致看了下Yii2框架中关于防御CSRF攻击的办法,大致原理是这样的:

  • 随机生成一个字符串_csrf,然后用一个可逆的算法将_csrf变成对应的csrf_hash值

  • 将csrf_hash放到表单中,_csrf放到请求头中一起和表单数据提交到服务器

  • 服务器在验证时,先将csrf_hash逆向解析后在和_csrf进行比对

我疑惑的是,Yii2里并没有进行_csrf重复使用的检查(也有可能是我没有看到),那攻击者完全可以在合法的情况下拿到_csrf和csrf_hash后,重复使用来进行非法的操作呢?


上面没有说清楚,我再详细地说一下:
比如现在有一个支付网站wwww.pay.com是基于yii2框架来搭建的,它有一个转账的功能,使用post方式进行提交的,提交表单的url是wwww.pay.com/zhuazhang,表单大致长这样:

<form action="./zhuazhang" method="post">
    <input type="hidden" name="csrf_hash" value="" />
    <input type="text" name="price" />
    <input type="text" name="to_user_id" />
    <input type="submit" value="确认转账" />
</form>

我先打开这个A网站这个转账的网页,通过查看当前网页源代码拿到csrf_hash的值,再通过网页开发者工具拿到请求头里的_csrf值,假设拿到的csrf_hash值为wfwlfemlgesagg,_csrf的值为abc。

现在我开始进行CSRF攻击,在自己的网页也写一个同样的表单:

<form action="wwww.pay.com/zhuazhang" method="post">
    <input type="hidden" name="csrf_hash" value="wfwlfemlgesagg" />
    <input type="text" name="price" value="1000" />
    <input type="text" name="to_user_id" value="我的user id" />
    <input type="submit" value="确认转账" />
</form>

请求头里设置_csrf为abc。

然后把这个网页链接发给别人,让他点击,他点击进入后,表单内容就提交到wwww.pay.com的服务器了,服务器端通过yii2框架提供的算法进行验证,验证通过(当前通过啦,csrf_hash和_csrf都是正常手段生成的,而且没有进行过重复验证),然后这个人的账户就少了1000元。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陌若浮生 2022-09-10 13:36:14

攻击者在合法的情况下拿到_csrf就是合法的用户操作,如果盗取别人的_csrf就是存在xss漏洞。

CSRF的Token仅仅用于对抗CSRF攻击。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文