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:
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:
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.
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:
É 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.
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/