🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## CSRF 漏洞简介 CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的 情况下执行在权限保护之下的操作,具有很大的危害性。 ### CSRF攻击原理及实例 当我们打开登陆某个网站后,就会产生一个会话,这个会话可能是SESSION、Cookie,但无关紧要的。唯一的重点是浏览器与服务器之间是在会话之中 1. 在这个会话没有结束时候,你可以利用你的权限对网站进行操作,如进行发表文章,发邮件,删除文章等操作。 2. 当这个会话结束后,你在进行某些操作时候 Web 应用程序通常会来提醒你,您的会话已过期,或者是请重新登陆等提示。 3. 而 CSRF 攻击则是建立会话之上的攻击。 比如当你登陆了网上银行,正在进行转账业务,这时你的某个 QQ 好友(攻击者)发来一条消息(URL),这条消息是攻击者精心构造的转账业务代码。而且与你所登录的网站是同一个银行,你可能认为这个网站是安全的,并不是什么钓鱼网站之类的,然后打开了这条URL,那么你的账户的钱可能就在你的这一次小小点击上全部丢失。 4. 攻击成功主要是因为你的浏览器正处于与此网站的会话之中,那么一切正常操作都是合法的,而入侵者构造的这段代码只不过是正常的转账操作代码而已 * 案例 比如说你想给用户 spisec 转账 1000元,那么点击提交按钮之后,可能会发送以下请求: http://www.taobao.com/pay.jsp?user=spisec&money=1000 而攻击者仅仅是改变一下 user 参数与 money 参数即可完成一次“合法”的攻击,如: http://www.taobao.com/pay.jsp?user=hack&money=10000 当你访问了这条URL之后,就会自动向 hack 这个账户里面转入10000元。而这是你亲手造成的,并没有人破解你的密码或入侵Web服务器 ### 流程总览 1. 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A; 2. 在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器 此时用户登录网站 A 成功,可以正常发送请求到网站 A; 3. 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B; 可能是点击的邮件、qq会话中的链接地址 4. 网站 B 接收到用户请求后,返回一些攻击性代码 攻击代码中要求用户浏览器去访问站点 A; 5. 浏览器在接收到这些网站B的返回数据后,根据网站 B 的请求,访问站点A 浏览器在用户不知情的情况下携带Cookie信息,向网站 A 发出请求。 网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户C的Cookie信息和权限处理该请求 导致来自网站 B 的恶意代码被执行。 总结 CSRF 两个侧重点 1. CSRF 的攻击建立在浏览器与 Web 服务器的会话之中。 或者是有用户信息,用户登录不用密码) 2. 欺骗用户访问 URL 也就是说攻击者盗用了用户的身份,用用户合法手段进行自己的操作 ## CSRF 攻击分类和检测 CSRF 漏洞一般分为站外和站内两种类型 ### CSRF 站外类型 本质上就是传统意义上的外部提交数据问题。 通常程序员会考虑给一些留言或者评论的表单加上水印以防止 SPAM 问题, 但是有时为了提高用户的体验性,可能没有对一些操作做任何限制,所以攻击者可以事先预测并设置请求的参数,在站外的 Web页面里编写脚本伪造文件请求,或者和自动提交的表单一起使用来实现 GET、POST 请求 当用户在会话状态下点击链接访问站外 Web 页面,客户端就被强迫发起请求。 >SPAM 可以简单的理解为垃圾留言、垃圾评论,或者是带有站外链接的恶意回复 ### CSRF 站内类型 在一定程度上是由于程序员滥用$_REQUEST 类变量造成的。 在一些敏感的操作中,本来要求用户从表单提交发起 POST 请求传递参数给程序, 但是由于使用了$_REQUEST 等变量,程序也支持接收 GET 请求传递的参数,这就为攻击者使用CSRF创造条件。 一般攻击者只要把预测的请求参数放在站内一个贴子或者留言的图片链接里,受害者浏览了这样的页面就会被强迫发起这些请求。 ### CSRF漏洞检测: 检测CSRF漏洞是一项比较繁琐的工作,以下是一个最简单的流程: 1. 抓取一个正常请求的数据包, 2. 观察数据包里是否存在用户信息或者token相关的字段 如果有那么删除一下看看数据包是否正常,看看响应包是否正常,如果不正常则尝试放弃(绕过几率极小) 3. 然后删除origin字段重新提交 看看响应包是否正常,如果不正常则尝试放弃(绕过几率极小) 4. 最后去掉Referer字段后再重新提交 看看响应包是否正常,如果不正常那也可以尝试绕过 5. 如果以上都正常,则生成POC,另一个浏览器登录验证。 ### CSRF漏洞容易出现的地方: 1. 修改密码的地方 2. 添加用户的地方 3. 数据库备份的地方数据交易、支付等 4. 等其它一些对话框钓鱼页面 5. CSRF一般与XSS结合使用