Межсайтовая атака с использованием кеша браузера (будет ли работать?) - PullRequest
1 голос
/ 13 июля 2020

Схема атаки: Атакованный сайт отправляет запрос с помощью файлов cookie (но без Vary: Cookie HTTP-заголовка), браузер кеширует ответ, атакующий сайт выполняет тот же запрос (но без файлов cookie, потому что директива SameSite=Strict в Set-Cookie был использован) и получает доступ к кешированному ответу. Я, должно быть, что-то пропустил, или это могло сработать?

Обновление: я провел несколько экспериментов:

Express сервер:

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>

localhost:3000 как и ожидалось, показывает мне токен (после второй загрузки, конечно). Чтобы создать злоумышленника, я загрузил HTML в https://jsfiddle.net/3xaoe4zf/. И это работает в Chromium 84! (т.е. jsfiddle показывает токен), но его нет в Firefox 78. Кто-нибудь может объяснить эту разницу?

1 Ответ

0 голосов
/ 26 июля 2020

Эта атака, похоже, работает (по крайней мере, в Chromium 84), и Vary: Cookie предотвращает ее.

Но она не работает в Firefox, потому что для некоторых из них хранится отдельный кеш для этих двух сайтов. причина (вероятно, он использует Origin или что-то подобное в качестве дополнительного ключа для кеша). (Просто обратите внимание: Firefox не использует кеш, когда страница перезагружается с помощью F5.)

Это не проблема Chromium / Chrome, просто кеш работает таким образом.

В соответствии со спецификацией :

Первичный ключ кеша состоит из метода запроса и целевого URI.

Кроме того, в том же разделе в нем говорится, что могут использоваться вторичные ключи (с использованием Vary):

Если цель запроса подлежит согласованию содержимого, ее запись в кэше может состоять из нескольких сохраненных ответов, каждый из которых отличается вторичным ключом для значений полей заголовка выбора исходного запроса (раздел 4.1).

Я не нашел каких-либо c ограничений в спецификации для ответов, полученных с использованием файлов cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...