Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 使用浏览器缓存进行跨站点攻击(是否有效?)_Http_Security_Http Headers_Browser Cache_Http Caching - Fatal编程技术网

Http 使用浏览器缓存进行跨站点攻击(是否有效?)

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',

攻击方案:受攻击站点使用Cookie发出请求(但没有
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
指令)”