分享 / 3 / 27 / 创建于 3年前 / 更新于 3年前
漏洞等级:严重
漏洞详情:
新增、删除、修改等操作均存在CSRF漏洞;以一个接口为例:
1.进入系统设置,菜单管理-修改测试菜单
2.burp抓包,构造CSRF请求包
3.在浏览器中访问刚刚构造CSRF请求,可成功将排序-8 改成9999
关键页面(新增、修改、删除等)添加csrf token
校验HTTP头 Referer
所有增删改接口统一修改
先让你同事重新学一下什么是 CSRF,都能抓包了你用啥 token 都没用
这不是漏洞,这是featureCSRF的设计是和Session ID关联的一个凭证,只要Session ID 和 CSRF Token 匹配就可以通过 CSRF 验证。可以看 Laravel 源码哈 GitHub链接
你的安全同事的想法是完全错误的,假如搞成每次刷新都分配一个新 Token,那么旧的页面是否无法提交了呢?如果旧页面新页面都要能够提交,那么每个 Session ID 就要对应一个 CSRF Token 池。本来每个 Session ID 只对应一个 Token, 现在变成一个 Session ID 对应一堆 Token,反而安全性下降了。
如果要让旧的页面无法提交,不应该借助 CSRF 实现该功能,可以业务层自己参考 Google Recaptcha v3 定制一个隐藏验证码的设计,和 CSRF 无关。
另一个问题是,你同事认为可以通过抓包破解 CSRF,是属于用户攻击还是中间人攻击。如果是中间人攻击,上了 https 以后是不可能抓包到 request header 或者 body 数据的;如果是用户攻击,那 CSRF 就更没办法防御了,本质上 CSRF 就是用来保证请求与用户意图一致的。
BTW,你们安全同事对 CSRF PoC generator 的用完全错了,PoC generator 生成出来的页面不应该加上 CSRF Token。
简单说一下 Laravel 的 CSRF_TOKEN 原理吧,以及为什么不刷新
用户 A 在与服务器建立 SESSION 时,服务器会通过 A 的 SESSION 颁发一个 CSRF_TOKEN,A 在此次登录后所有的请求都通过该 CSRF_TOKEN 来于服务器进行验证身份。
SESSION
A
CSRF_TOKEN
GET
HEAD
OPTIONS
CSRF
CSRF_TOKEN 颁发相关源码
\vendor\laravel\framework\src\Illuminate\Session\Store.php // start() 方法
CSRF_Token 验证相关源码
\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php // handle() 方法
所以即便这个 CSRF_TOKEN 泄露,B 恶意冒充 A 的身份也请求也不会成功,因为 B 无法获取到 A 在服务端的 SESSION,所以没必要每次都刷新 CSRF_TOKEN, 你明白了吗?
@yuwei 这就属实有点搞笑了,csrf_token 是防跨域请求的,你们公司安全不专业啊
csrf_token
Laravel CSRF 不是一个 token 只能使用一次吗?再用就 419
csrf就是为了一个值只能使用一次。能够刷新的话,就没法防止恶意提交的了
亲,不要透露隐私信息喔,服务地址、同事姓名都算
csrf中间件里面看一下源码是什么问题罗
请先了解下csrf(跨站请求伪造)是什么再来问问题好吗?
$request->session()->regenerateToken()
盗我头像
。。。。。。。。建议抽同事大嘴巴子的举个爪~~
你要完全理解csrf,就能有理有据的反驳那群傻逼了。
你们安全团队理解的csrf应该是一个叫做随机令牌的东西,在put,post,delete请求提交的时候要带上服务端生成的这个随机令牌,防止重复提交或防止伪造请求.随机令牌这种用法常见于前后端不分离的架构.
csrf和jwt有啥区别?
csrf是用来防止跨站脚本攻击的,不是用来防止重复提交的,是两个概念,虽然都是叫token。。。
我要举报该,理由是:
高认可度评论:
先让你同事重新学一下什么是 CSRF,都能抓包了你用啥 token 都没用
这不是漏洞,这是feature
CSRF的设计是和Session ID关联的一个凭证,只要Session ID 和 CSRF Token 匹配就可以通过 CSRF 验证。可以看 Laravel 源码哈 GitHub链接
你的安全同事的想法是完全错误的,假如搞成每次刷新都分配一个新 Token,那么旧的页面是否无法提交了呢?如果旧页面新页面都要能够提交,那么每个 Session ID 就要对应一个 CSRF Token 池。本来每个 Session ID 只对应一个 Token, 现在变成一个 Session ID 对应一堆 Token,反而安全性下降了。
如果要让旧的页面无法提交,不应该借助 CSRF 实现该功能,可以业务层自己参考 Google Recaptcha v3 定制一个隐藏验证码的设计,和 CSRF 无关。
另一个问题是,你同事认为可以通过抓包破解 CSRF,是属于用户攻击还是中间人攻击。如果是中间人攻击,上了 https 以后是不可能抓包到 request header 或者 body 数据的;如果是用户攻击,那 CSRF 就更没办法防御了,本质上 CSRF 就是用来保证请求与用户意图一致的。
BTW,你们安全同事对 CSRF PoC generator 的用完全错了,PoC generator 生成出来的页面不应该加上 CSRF Token。
简单说一下 Laravel 的 CSRF_TOKEN 原理吧,以及为什么不刷新
用户 A 在与服务器建立
SESSION
时,服务器会通过A
的 SESSION 颁发一个 CSRF_TOKEN,A 在此次登录后所有的请求都通过该CSRF_TOKEN
来于服务器进行验证身份。GET
HEAD
OPTIONS
之外,其他类型请求都需要通过CSRF
验证。CSRF
验证之外,如果是,不进行验证CSRF_TOKEN
验证CSRF_TOKEN 颁发相关源码
CSRF_Token 验证相关源码
所以即便这个
CSRF_TOKEN
泄露,B 恶意冒充 A 的身份也请求也不会成功,因为 B 无法获取到 A 在服务端的 SESSION,所以没必要每次都刷新CSRF_TOKEN
, 你明白了吗?Laravel CSRF 不是一个 token 只能使用一次吗?再用就 419
csrf就是为了一个值只能使用一次。能够刷新的话,就没法防止恶意提交的了
亲,不要透露隐私信息喔,服务地址、同事姓名都算
亲,不要透露隐私信息喔,服务地址、同事姓名都算
先让你同事重新学一下什么是 CSRF,都能抓包了你用啥 token 都没用
csrf中间件里面看一下源码是什么问题罗
请先了解下csrf(跨站请求伪造)是什么再来问问题好吗?
简单说一下 Laravel 的 CSRF_TOKEN 原理吧,以及为什么不刷新
用户 A 在与服务器建立
SESSION
时,服务器会通过A
的 SESSION 颁发一个 CSRF_TOKEN,A 在此次登录后所有的请求都通过该CSRF_TOKEN
来于服务器进行验证身份。GET
HEAD
OPTIONS
之外,其他类型请求都需要通过CSRF
验证。CSRF
验证之外,如果是,不进行验证CSRF_TOKEN
验证CSRF_TOKEN 颁发相关源码
CSRF_Token 验证相关源码
所以即便这个
CSRF_TOKEN
泄露,B 恶意冒充 A 的身份也请求也不会成功,因为 B 无法获取到 A 在服务端的 SESSION,所以没必要每次都刷新CSRF_TOKEN
, 你明白了吗?$request->session()->regenerateToken()
盗我头像
。。。。。。。。建议抽同事大嘴巴子的举个爪~~
你要完全理解csrf,就能有理有据的反驳那群傻逼了。
你们安全团队理解的csrf应该是一个叫做随机令牌的东西,在put,post,delete请求提交的时候要带上服务端生成的这个随机令牌,防止重复提交或防止伪造请求.随机令牌这种用法常见于前后端不分离的架构.
这不是漏洞,这是feature
CSRF的设计是和Session ID关联的一个凭证,只要Session ID 和 CSRF Token 匹配就可以通过 CSRF 验证。可以看 Laravel 源码哈 GitHub链接
你的安全同事的想法是完全错误的,假如搞成每次刷新都分配一个新 Token,那么旧的页面是否无法提交了呢?如果旧页面新页面都要能够提交,那么每个 Session ID 就要对应一个 CSRF Token 池。本来每个 Session ID 只对应一个 Token, 现在变成一个 Session ID 对应一堆 Token,反而安全性下降了。
如果要让旧的页面无法提交,不应该借助 CSRF 实现该功能,可以业务层自己参考 Google Recaptcha v3 定制一个隐藏验证码的设计,和 CSRF 无关。
另一个问题是,你同事认为可以通过抓包破解 CSRF,是属于用户攻击还是中间人攻击。如果是中间人攻击,上了 https 以后是不可能抓包到 request header 或者 body 数据的;如果是用户攻击,那 CSRF 就更没办法防御了,本质上 CSRF 就是用来保证请求与用户意图一致的。
BTW,你们安全同事对 CSRF PoC generator 的用完全错了,PoC generator 生成出来的页面不应该加上 CSRF Token。
csrf和jwt有啥区别?
csrf是用来防止跨站脚本攻击的,不是用来防止重复提交的,是两个概念,虽然都是叫token。。。