前端漏洞(上)- CORS漏洞
漏洞复现目的:熟悉 CORS 漏洞 原理
漏洞介绍:
CORS(跨源资源共享)漏洞是一种安全漏洞,它允许未经授权的网站访问或操纵另一个网站上的数据。CORS是Web开发中用于控制跨域资源共享行为的安全机制。当一个网站(称为源)需要与另一个源上的资源进行交互时,CORS机制确保这种交互是安全的。如果配置不当,攻击者可以利用CORS策略的漏洞来绕过同源策略的限制,执行非法操作,比如窃取数据、执行恶意脚本等。
CORS漏洞的工作原理
同源策略(Same-Origin Policy):
同源策略是一种重要的安全措施,它限制了网页中的脚本如何与来自不同源的文档进行交互。一个源由协议(例如HTTP或HTTPS)、域名和端口号组成。如果两个URL的协议、域名和端口都相同,则它们被认为是同源的。
CORS机制:当浏览器尝试从一个源加载资源时,它会检查目标资源的服务器是否允许该请求。这是通过在HTTP响应头中设置
Access-Control-Allow-Origin
来实现的。例如,如果服务器设置为Access-Control-Allow-Origin: *
,则表示允许来自任何源的请求。CORS漏洞:
如果服务器配置错误,如将
Access-Control-Allow-Origin
设置为*
(允许所有域)而没有其他安全措施(如验证请求的来源),或者使用了不恰当的通配符模式,例如https://*.example.com
而没有精确匹配具体的子域,攻击者可以通过构造特定的请求来绕过这些限制,进而访问或篡改数据。请求方式
CORS定义了两种跨域请求:简单请求 和 非简单请求。简单跨域请求就是使用设定的请求方式请求数据,而非简单跨域请求则是在使用设定的请求方式请求数据之前,先发送一个OPTIONS预检请求,验证请求源是否为服务端允许源。只有"预检"通过后才会再发送一次请求用于数据传输。
搭建环境:docker 环境
命令:yml 文件目录下 执行 docker-compose up -d 直接拉取镜像
环境说明:
该环境主要用来演示CORS跨域获取数据,分为两个web系统,第一个端口8971模拟一个站点,该站点存在用户敏感信息。第二个端口8972模拟攻击者自建的系统, 演示为通过8972端口对应的站点利用CORS漏洞读取8971站点的用户信息。
1、CORS漏洞的工作原理图:
简单请求:
非简单请求:
2、实战操作
访问页面:http://127.0.0.1:8971/web/cors.php 可以看到有用户名和密码的隐私页面。此时F12观察响应头可以看到添加了Access-CVontrol-Allow-Origin:*。正是由于添加了该响应头,允许了攻击者跨域读取该页面中的敏感数据。
3、访问 http://127.0.0.1:8972/cors_read.html ,可以发现跨域读取数据成功。
4、漏洞防御
对服务器进行合理配置, 仅对需要的页面开启CORS功能。开启时尽量指定域名清单,避免使用 * 等通配符配置向所有域名开放。