CSRF漏洞

本文内容来自蚁景网安课程

CSRF介绍

定义

CSRF(Cross Site Request Forgery,跨站点请求伪造),是恶意站点或程序通过已认证用户的浏览器在受信任站点上执行非正常操作。

跨站:顾名思义,就是从一个网站到另一个网站。

请求:即HTTP请求。

伪造:在这里可以理解成仿造、伪装。

攻击流程

1.用户C通过浏览器浏览并登录信任网站A。

2.验证通过,在用户C处产生A的Cookie。

3.用户C在没有退出A的情况下,访问危险网站B。

4.B要求访问第三方站点A,发出一个请求request。

5.根据B在4的要求,浏览器带着2处产生的Cookie访问A。

必要条件

1.登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站A的api接口时,会提示你登录。)

2.在不登出A的情况下,访问危险网站B。(其实是利用了网站A的漏洞)

漏洞危害

CSRF能做的事情包括:以你的名义发邮件,发信息,盗取你的账号,甚至于购买商品,虚拟货币转账

造成的问题包括:个人隐私泄露以及财产安全等。

漏洞成因

在用户对网站进行操作时仅仅验证Cookie,而没有其他验证,从而导致漏洞出现。

关于CSRF

正常的CSRF攻击:增删改等操作(基于操作的CSRF)

另类的CSRF:JSONP、CORS、Flash跨域劫持(基于文件读取的CSRF)

本质

CSRF的本质就是在不知情的情况下执行请求。

根据请求分为GET型CSRF和POST型CSRF。

CSRF与XSS

1.CSRF是跨站请求伪造,XSS是跨域脚本攻击。

2.CSRF需要用户先登录网站A获取Cookie,XSS不需要登录。

3.CSRF是利用网站A本身的漏洞,去请求网站A的API;XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。

DVWA CSRF

GET请求CSRF

在DVWA中修改密码

image-20220313074411949

攻击者B将构造好的链接发送给受害者A,如果网站存在存储型XSS漏洞,还可以将链接插入进去。如果受害者A在没有退出网站的情况下点击了链接,就会无意中修改密码。

POST请求CSRF

受害者A登录网站,能够在网站中修改密码。

攻击者B修改密码参数,Burp抓取到数据包->Engagement Tools->Generate CSRF PoC,生成恶意页面,保存为HTML。

受害者A在没有退出网站的情况下访问了攻击者的HTML页面,密码就会被修改。

如何寻找

关注数据包:数据包的几个关键字段,是否根据Cookie判断请求包。

检查:

Referer

Auth

CSRFtoken

漏洞修复

1.验证HTTP Referer字段。

2.在请求地址或请求头添加token验证。

同源策略

介绍

同源策略在Web应用的安全模型中是一个重要概念。在这个策略下,Web浏览器允许第一个页面的脚本访问第二个页面的数据,但是也只有在两个页面有相同的源时才可以。源是由URI,主机名,端口号组合而成的。这个策略可以阻止一个页面上的恶意脚本通过页面的DOM对象获得访问另一个页面上敏感信息的权限。

同源策略限制内容有:

Cookie、LocalStorage、IndexdDB等存储性内容。

DOM节点。

AJAX请求不能发送。

同源定义

如果两个URL的protocol、port(en-US)(如果有指定的话)和host(协议/主机/端口元组)响应的话,则这两个URL是同源的。

解决跨域问题

由于同源策略的影响,当我们从一个域名的网页去请求另一个域名的资源时,就无法成功获取资源。如果我们想要成功获取资源,那么就要用到跨域。

允许跨域加载的标签

1
2
3
<img src=xxx>
<link href=xxx>
<script src=xxx>

跨域解决方案:jsonp、cors、postMessage

CORS漏洞

CORS

CORS的全称是跨源资源共享,是一种Ajax跨域请求资源的方式,支持现代浏览器,IE支持到10以上。CORS的实现方式很简单,当使用XMLHttpRequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果里加一个响应头:Access-Control-Allow-Origin;浏览器判断该请求头中是否包含Origin的值,如果有则浏览器会处理响应,就可以拿到请求数据,如果不包含,浏览器就会直接驳回,无法获得响应数据。

CORS配置

在配置了CORS的前提下,当你登录网站A,并跨域访问网站B时,浏览器判断你的操作是跨域,则在请求头中自动增加一个Origin字段,用来说明请求来自哪个源。网站B拿到请求之后,在回应时对应地添加Access-Control-Allow-Origin字段,如果Origin不在这个字段地范围中,那么浏览器就会将响应拦截。

漏洞原理

如果Access-Control-Allow-Origin配置不当就会存在漏洞,如果跨域需要包含Cookie的话,响应头还应该有以下字段Access-Control-Allow-Credentials:true。

这样攻击者就可以利用这个漏洞来窃取依据在这个网站上登录了的用户信息。(利用Cookie)

漏洞寻找

在请求头中添加Origin:test.com,然后查看返回包的Access-Control-Allow-Origin值是否为test.com以及Access-Control-Allow-Credentials:true字段是否为true,如果是则说明存在漏洞。

构造利用代码

image-20220313080835246

将代码放到攻击者服务器里,受害者访问到该文件则会请求存在CORS漏洞的网站,由于其允许其他域请求,则会泄露敏感信息。

批量寻找

Burp->Proxy->Options->Match and Replies

选择在Request Header中添加Origin:foo.example.org

在Filter by search term中输入:Access-Control-Allow-Origin: foo.example.org