关于Yii2框架中防御CSRF攻击方法的迷惑
我大致看了下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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
攻击者在合法的情况下拿到_csrf就是合法的用户操作,如果盗取别人的_csrf就是存在xss漏洞。