Http 使用浏览器缓存进行跨站点攻击(是否有效?)
攻击方案:受攻击站点使用Cookie发出请求(但没有Http 使用浏览器缓存进行跨站点攻击(是否有效?),http,security,http-headers,browser-cache,http-caching,Http,Security,Http Headers,Browser Cache,Http Caching,攻击方案:受攻击站点使用Cookie发出请求(但没有Vary:CookieHTTP头),浏览器缓存响应,攻击站点发出相同的请求(但没有Cookie,因为使用了Set Cookie中的SameSite=Strict指令),并访问缓存的响应。我一定是错过了什么,或者它能起作用吗 更新:我做了一些实验: 快速服务器: const express = require('express') const app = express() const port = 3000 app.get('/token',
Vary:Cookie
HTTP头),浏览器缓存响应,攻击站点发出相同的请求(但没有Cookie,因为使用了Set Cookie
中的SameSite=Strict
指令),并访问缓存的响应。我一定是错过了什么,或者它能起作用吗
更新:我做了一些实验:
快速服务器:
const express = require('express')
const app = express()
const port = 3000
app.get('/token', (req, res) => {
let secret = "No access";
if (req.headers['cookie'] && req.headers['cookie'].includes('token=1234')) {
secret = '1234';
}
res.set({
'Set-Cookie': 'token=1234; Path=/; Max-Age=2592000; HttpOnly; SameSite=Strict',
'Access-Control-Allow-Origin': '*',
'Content-Type': 'text/plain',
'ETag': secret,
// 'Vary': 'Cookie',
'Cache-Control': 'max-age=1000',
});
res.send(secret);
})
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
被攻击和攻击者index.html
:
<!DOCTYPE html>
<html>
<body>
<div></div>
<script>
fetch('http://localhost:3000/token').then(function(response) {
return response.text();
}).then(function(text) {
document.querySelector('div').textContent = text;
});
</script>
</body>
</html>
取('http://localhost:3000/token,然后(函数(响应){
返回response.text();
}).然后(函数(文本){
document.querySelector('div').textContent=text;
});
localhost:3000
as and expected向我显示令牌(当然是在第二次加载之后)。为了创建攻击者,我将HTML上传到。它在铬84中工作!(即JSFIDLE显示令牌),但在Firefox 78中不显示。
С有人能解释这种差异吗?这种攻击似乎有效(至少在Chromium 84中有效),而且Vary:Cookie
可以防止这种攻击
但它在Firefox中不起作用,因为出于某种原因,它为这两个站点存储了一个单独的缓存(它可能使用Origin
或类似的东西作为缓存的额外键)。(请注意:当使用F5重新加载页面时,Firefox不使用缓存。)
这不是Chrome/Chrome问题,只是缓存是这样工作的
根据报告:
主缓存键由请求方法和目标URI组成
此外,在同一节中,它还指出可以使用辅助键(使用Vary
):
如果请求目标要进行内容协商,则其缓存条目可能由多个存储的响应组成,每个响应由原始请求的选择头字段值的辅助键区分(第4.1节)
对于使用cookie收到的响应,我在规范中未发现任何具体限制
更新:此攻击似乎有效(至少在Chromium 84中有效),并且Vary:Cookie
可以防止它
但它在Firefox中不起作用,因为出于某种原因,它为这两个站点存储了一个单独的缓存(它可能使用Origin
或类似的东西作为缓存的额外键)。(请注意:当使用F5重新加载页面时,Firefox不使用缓存。)
这不是Chrome/Chrome问题,只是缓存是这样工作的
根据报告:
主缓存键由请求方法和目标URI组成
此外,在同一节中,它还指出可以使用辅助键(使用Vary
):
如果请求目标要进行内容协商,则其缓存条目可能由多个存储的响应组成,每个响应由原始请求的选择头字段值的辅助键区分(第4.1节)
对于使用cookie收到的响应,我在规范中未发现任何具体限制
更新:我已经在Chrome84上使用您的代码尝试过了,而且
SameSite=Strict
cookie肯定不会在您的JSFIDLE中发送。你还能复制这个吗?(截图)@rowan_m,是的,这是预期行为,“攻击站点发出相同的请求(但没有Cookie,因为使用了Set Cookie
中的SameSite=Strict
指令),”我在Chrome 84上使用了您的代码,并且SameSite=Strict
Cookie肯定不会在您的JSFIDLE中发送。你还能复制这个吗?(截图)@rowan_m,是的,这是预期的行为,“攻击站点发出相同的请求(但没有Cookie,因为使用了Set Cookie
中的SameSite=Strict
指令)”