Voltar ao início

Ataques de XSS em aplicações PHP – Explorando o $_SERVER[‘PHP_SELF’])

Início de tudo.

Que o PHP é o queridinho dos desenvolvedores para fazer o backend isso é fato – aos desenvolvedores NodeJS: por favor não tumultuar – e a longo do tempo ela dominou o mercado pela sua facilidade de escrita de código e também por ter prático na hora de subir um servidor PHP.

Segundo o site W3 Techs ate 29 de Abril de 2023 o PHP era utilizado por cerca de 66.4% da web (isso na versão 7, que está sendo migrada aos poucos para o 8).

Como alguns sabem, eu sou devoto do PHP, se eu pudesse usaria em tudo que fosse possível, até mesmo para controlar um carro. Tá aí algo que a gente poderia pensar em fazer.

Tirando as brincadeiras, por mais que o PHP seja minha linguagem favorita, tenho algumas críticas a ela e algumas coisas que mesmo após anos ainda não tiveram uma solução clara, e é isso que vamos falar.

Sites aleatórios que usam PHP:

  • Pinterest.com
  • Vimeo.com
  • Mozilla.org
  • Europa.eu
  • Tumblr.com
  • Digicert.com

Fala aí agora seu vacilão que o PHP está morrendo e ninguém usa ele!

XSS? Wtf is that?

O pai é fluente demais no inglês, admite aí. Se você acha que XSS não é uma vulnerabilidade, por favor, saia deste post imediatamente. Como assim você não sabe dessa história ? Agradeça a Deus então, caso você seja ateu agradeça ao Big Bang.

Agora deixando de enrolação, o que é XSS?

Segundo a definição da OWASP:

“Os ataques Cross-Site Scripting (XSS) são um tipo de injeção, na qual scripts maliciosos são injetados em sites benignos e confiáveis.”

The OWASP® Foundation

Impacto do XSS

Ao explorar vulnerabilidades de XSS, um invasor pode executar ações maliciosas, como:

  • Redirecionar usuários para um site malicioso.
  • Capturar as teclas digitadas pelos usuários;
  • Acessar o histórico do navegador dos usuários e o conteúdo da área de transferência;
  • Executar exploits baseados em navegador da Web.
  • Obter as informações do cookie de um usuário que está logado em um site;
  • Roubar o token de sessão de login, permitindo que o invasor interaja com o aplicativo sem saber a senha da vítima.

E muitas outras possibilidades, bastando apenas da vontade do atacante e da sua ousadia.

O que é o $_SERVER[‘PHP_SELF‘]?

Segundo a documentação oficial do PHP:

“O nome do arquivo do script que está executando, relativa à raiz do documento. Por exemplo, $_SERVER[‘PHP_SELF’] em um script no endereço http://example.com/test.php/foo.bar seria /test.php/foo.bar.”

Fonte: Documentação oficial do PHP.

Exploração

Para entendermos melhor, vamos criar um exemplo simples de um formulário.

A tag form tem dois campos bastante importantes:

Method: é o método de como os dados inseridos no formulário serão enviados, podendo receber dois valores – get para envios através da URL ou o post para enviar através de pacotes.

Action: para onde os arquivos serão enviados processa.php? cadastro.php? No caso com o PHP_SELF estamos mandando para a própria página.

Exemplo de código vulnerável.

Ao acessar: http://localhost/artigo/xss.php//’”/><script>alert(1)</script> . O payload (carga útil) deve ser colocado no final da URL.

Como resultado é possível ver o código sendo renderizado no HTML e exibindo o alert.

Abaixo podemos ver o resultado esperado:

Exemplo de exploração que poderia ser além de um simples alert.

É meio bizarro saber que o PHP não remova automaticamente qualquer conteúdo malicioso que seja inserido no PHP_SELF.

Você pode colocar qualquer coisa no lugar do alert, eu só coloquei o 1 (um) para ficar pequeno o texto aqui, mas me indica ai na sua empresa, tô falando sério.

Ok, mas me conta aí. Como eu previno?

Você pode usar o $_SERVER[‘SCRIPT_NAME’] invés de $_SERVER[‘PHP_SELF’].

Outras abordagens interessantes seriam: filter_var($_SERVER[‘PHP_SELF’], FILTER_SANITIZE_STRING) ou htmlspecialchars($_SERVER[‘PHP_SELF’])

Independente de tudo, sempre procure buscar novos meios de se prevenir de ataques de XSS e outros existentes independente da tecnologia que você usa.

Lembre-se: Saber como fazer um código seguro te deixará na frente de muitas pessoas.


E para fechar, queria deixar essa reflexão.

“A primeira linguagem de programação que você aprende é igual ao primeiro namoro: o tempo passa e você nunca esquece.”

Peguei do parachoque de um caminhão nas minhas andanças por aí.

Referências:

PHP Manual – https://www.php.net/manual/en/reserved.variables.server.php

PHP Manual – https://www.php.net/manual/en/function.htmlentities

Script http-phpself-xss – https://nmap.org/nsedoc/scripts/http-phpself-xss.html

PHP Manual – https://www.php.net/manual/en/function.filter-var.php

OWASP: Cross Site Scripting (XSS) – https://owasp.org/www-community/attacks/xss/