【Web渗透】跨站请求伪造CSRF漏洞简介
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
什么是CSRF?
实际上,CSRF不只是只有GET请求可以发起,POST请求也可以发起。
<form action="/register" id='register' method='POST'> <input type=text name='username' value=''/> <input type=password name='password',value=''/> <input type=submit name='submit' value='submit'> </form> 我们可以尝试构造一个GET请求: http: / / host / register?username = test&password = passwd 如果服务器没有对请求方法进行限制,则这个请求会通过。 如果服务器已经区分了POST和GET,对于只能用POST提交的链接,我们也可以构造出一个POST请求。 比如,在一个页面中构造好一个form表单,然后使用Javascript自动提交这个表单。比如,攻击者在www.b.com/test/html下编写如下代码: <form action="http://www.a.com/register" id='register' method='POST'> <input type=text name='username' value=''/> <input type=password name='password',value=''/> <input type=submit name='submit' value='submit'> </form> <script> var f = documentElementById('register'); f.inouts[0].value='test'; f.inputs[1].value='password'; f.submit; </script> 攻击者如果将这个页面隐藏在一个不可见的iframe窗口中,则整个自动提交表单的过程,对于用户来说也是不可见的。 CSRF 攻击的影响是什么?
CSRF 是如何工作的? 一个相关的动作。应用程序中存在攻击者有理由诱导的操作。这可能是特权操作(例如修改其他用户的权限)或对用户特定数据的任何动作(例如更改用户自己的密码)。 基于 Cookie 的会话处理。执行该操作涉及发出一个或多个HTTP请求,并且应用程序仅依赖会话 cookie 来识别发出请求的用户。没有其他机制可用于跟踪会话或验证用户请求。 没有不可预测的请求参数。执行该操作的请求不包含攻击者无法确定或猜测其值的任何参数。例如,当导致用户更改密码时,如果攻击者需要知道现有密码的值,则该功能不会受到攻击。 例如,假设一个应用程序包含一个允许用户更改其账户上的电子邮件地址的功能。当用户执行此操作时,他们会发出如下 HTTP 请求: POST /email/change HTTP/1.1 Host: vulnerable-website.com Content-Type: application/x-www-form-urlencoded Content-Length: 30 Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE email=wiener@normal-user.com 这符合 CSRF 所需的条件:
有了这些条件,攻击者就可以构建一个包含以下HTML的网页: <html> <body> <form action="https://vulnerable-website.com/email/change" method="POST"> <input type="hidden" name="email" value="pwned@evil-user.net" /> </form> <script> document.forms[0].submit(); </script> </body> </html> 如果受害者用户访问攻击者的网页,将会发送以下情况:
备注
使用Burp Suite 插件 构建 CSRF 攻击
• 从右键单击上下文菜单中,选择参与工具/生成 CSRF PoC。 • Burp Suite 将生成一些 HTML 来触发选定的请求(减去 cookie,它将由受害者的浏览器自动添加)。 • 您可以调整 CSRF PoC 生成器中的各种选项,以微调攻击的各个方面。您可能需要在一些不寻常的情况下执行此操作以处理请求的古怪功能。 • 将生成的 HTML 复制到网页中,在登录到易受攻击网站的浏览器中查看,并测试是否成功发出了预期的请求以及是否发生了所需的操作。 CSRF 攻击条件及与XSS区别CSRF 与XSS 区别: XSS: 存在XSS漏洞 ——> 构造 payload ——> 发送给受害者 ——> 受害者触发 ——> 攻击者得到受害者cookie ——> 攻击者使用受害者权限cookie 登录系统 CSRF: 存在CSRF漏洞 ——> 构造payload ——> 发送给受害者 ——> 受害人点击打开 ——> 受害人执行代码 ——> 受害者完成攻击(不知情) CSRF攻击一种需要两个条件: 1.登录受信任的网站,本地生成Cookie; 当然还要另一些方法满足CSRF攻击条件,你无法保证以下情况不会发生: 常规测试方法如何确认一个web系统存在csrf漏洞 1,对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造。
如何确认一个web系统存在CSRF漏洞 1.对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造
确认凭证的有效期(这个问题会提高CSRF被利用的概率)
跨站请求及跨站请求伪造(CSRF)绕过csrf校验: 《借刀杀人》
CSRF类型
【危害2】漏洞联合——CSRF漏洞使self-XSS漏洞“变废为宝”
存在self-XSS直接漏洞和CSRF漏洞,如果利用self-XSS漏洞则受害者只是自己,如何攻击自己以外的目标? 目标——通过利用CSRF漏洞,使XSSpayload能够攻击自己以外的目标
【危害3】利用CSRF漏洞发出GET请求
漏洞影响
网络场景测试技巧
浏览器的Cookie策略若能知道浏览器的cookie策略,就会对CSRF的原理与攻击方式会有更深的理解。 浏览器所持有的cookie分成两种,一种是 他们之间的区别在于 而临时Cookie则没用绑定 在浏览网站的过程中,如果一个网站设置了
如果有这么一种情况,浏览器从一个域的页面中,想要加载另一个域的资源,由于安全原因,一些网络站点会停止 但是这里也是有一个前提的,就是 但是这里也是有一个前提的,就是http://www.a.com页面中的http://www.b.com包含在<iframe>, <img>, <script> , <link> 等标签中,因为这些标签在IE中,是禁止浏览器向这些标签中发送第三方cookie的。 当然,并不是所有的浏览器都会禁止,比如火狐浏览器,就默认支持发送第三方cookie。 所以至少对于IE浏览器,攻击者需要精心构造攻击环境,比如可以先诱使用户在当前浏览器中先访问目标站点,使得session cookie有效,然后尝试CSRF。 P3P头的副作用
因为P3P头在网站中的广泛应用,所以在CSRF的防御,不能仅依赖于浏览器对第三方cookie的防御策略,应该从长计议。 CSRF的防御常见CSRF防范措施 签名与时间戳防护处理流程Token产生
token由三部分组成:
CSRF攻击常规防护1.只使用JSON API,使用Javascript发起AJAX请求是限制跨域的,并不能通过简单的表单来发送JSON,所以,通过只接收JSON可以很大可能避免CSRF攻击。 这种方法要比检查Referer 要安全一些,token 可以在用户登录参生并放于 session 之中,然后再每次请求时把token从session中拿出,与请求中的token进行比对。 验证码
Referer Check
使用tokenCSRF的本质 在讲token之前,我们需要知道,CSRF之所以能够攻击成功,除了利用cookie,更重要 攻击者只有预测出URL的所有参数与参数值,才能成功构造一个伪造的请求,反之,则攻击不成功 基于此,有一个解决方案,把参数加密,或者使用一些随机数,让攻击者无法猜测到正确的参数。 比如,一个删除的url是:
但是可以通过参数加密,使得删除的url值为:
这样就无法猜测出username的值,从而无法实施攻击 但这种方法存在的缺陷是,加密后的URL非常难读,对用户不友好,其次,如果每次URL值都发生变化,还会使得URL无法被用户收藏。所以这种方法有了一个晋升版,就是构造token。 Token的特点1、Token值必须是随机的,可以通过使用安全的随机数生成算法实现 2、Token值是私密的,不能被第三方知晓。他可以存放在服务器的cookie中,也可以存放在浏览器的cookie中。但唯独Token值不能直接放在URL中,因为直接放在URL中,可能也会导致浏览器通过Refer得方式泄露。 比如下面这个页面
如果在这个页面中包含了一个攻击者能指定地址的图片,比如
那么如果点击这个图片,那么可能就会出现 因此在使用Token时,尽量将其放在表单中,把敏感操作由GET改成POST,以表单的形式提交,避免Token泄露 3、Token需要同时放在表单和session中。在提交请求时,服务器只需要验证表单中的Token与用户session(或者cookie)中的Token值是否相同,如果一致,则是合法请求,如果不一致,或者有一个为空,则请求不合法,就可能是CSRF攻击 CSRF 漏洞防御策略再服务器端防御CSRF攻击主要有四种策略:
• 在请求地址中添加token并验证
• 在HTTP头中自定义属性并验证
Token 防御 CSRF Example针对使用token 防御 CSRF 攻击,我这里做一个简单的介绍: 1.要使Token对攻击者来说难以伪造,我们可以使用伪随机数生成器来构造它 称为Token 随机数,好似在没一个参数中都加入一个随机的Token来此防御,然后把它放到服务器端的session里,并将Token发给用户(注意并没有保存在cookie中); 2.当用户提交请求时,服务器拦截器将POST请求中的Token提取出来,与session中的Token进行比对,相等即执行下一步操作。(这一部分就非常有必要!否则添加了防御的CSRF也是可以绕过的!) 具体代码: # 生成 token session_start(); function set_token(){ $_SESSION['token'] = md5(time()+rand(1,5000)); } # 使用 token 做验证 function check_token(){ if(isset($_POST['token'])&&$_POST['token'] === $_SESSION['token']) { return ture; } else { return false; } } 可以看到,同时验证了cookie中的sessionid与POST中的Token。 * web框架 - 启动框架中成熟的CSRF防御功能 * 自定义HTTP请求头(Custom Request Headers) * 如使用`X-CSRF-token:xxxx`标明CSRF_TOKEN的值(即使CSRF利用成功发出了携带Cookie的HTTP请求 但后端判断`X-CSRF-token`不存在则拒绝请求) * One-time Token * 如每次提交表单都包含字段`Token=xxxx`且每次值不同 后端可校验是否正确 * `Set-Cookie`使用`SameSite`属性 * 后端Response Header`Set-Cookie`中设置`SameSite`属性(由Google引入浏览器 用于缓解CSRF攻击),`SameSite`属性有3种值: * `Strict`严格 * 例如 域b.com的Response Header有`Set-Cookie: admin_cookie_strict=xxx; SameSite=Strict`,浏览器中会保存这一Cookie字段`admin_cookie_strict=xxx`,但由于`SameSite=Strict`为**严格**,所以浏览器对(非b.com域下发起的)访问b.com的**任何跨域请求**都不允许携带这一Cookie字段`admin_cookie=xxx`,所以可以防御CSRF攻击。比如从域a.com下构造并发出跨域请求访问b.com(尝试CSRF),绝对不会携带关键的cookie,从而b.com后端鉴权失败,CSRF攻击失败 * `Lax`宽松 - 没有`SameSite`属性的cookie被浏览器默认为`SameSite=Lax` * 例如 域b.com的Response Header有`Set-Cookie: admin_cookie_lax=xxx; SameSite=Lax`,浏览器中会保存这一Cookie字段`admin_cookie_lax=xxx`,但由于`SameSite=Strict`为**宽松**,所以浏览器对(非b.com域下发起的)访问b.com的**多种跨域请求**都不允许携带这一Cookie字段,只有以下3种方式(任何一种),才能够携带b.com的cookie`admin_cookie_lax=xxx` * 非同域下的a标签 `<a href="http://b.com"></a>` * 非同域下的GET表单 `<form method="GET" action="http://b.com/formdemo">` * 非同域下的link标签 `<link rel="prerender" href="http://b.com"/>` * `None`无 * `SameSite=None`必须同时指定`Secure`,例如`Set-Cookie: session_none=abc123; SameSite=None; Secure` * 二次验证 - 安全但影响用户体验(适用于仅对敏感功能处进行防御) * CAPTCHA 增加验证码机制 * 再次输入密码 * 手机验证码 * (不推荐)通过`Referer/Origin`校验来源域名 * 缺陷1.只能防御从"不被信任"的域发起的伪造的http请求(如果 **父、子、兄弟域名** 或 **CORS中被信任的域名** 有XSS漏洞 配合构造一个伪造请求 此时referer和Origin的值都是被信任的域 此时“校验来源域名”无法防御) * 缺陷2.正常业务如果有302跳转 不携带Origin 参考OWASP [Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.md](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.md) 文章来自于互联网,只做交流分享,如有侵权请联系删除!原文链接:https://www.kanxue.com/chm.htm?id=18479&pid=node1001515 该文章在 2023/12/7 11:18:32 编辑过 |
关键字查询
相关文章
正在查询... |