Hoje venho mostrar-vos como é fácil encontrar vulnerabilidades em páginas web, para inaugurar esta nova “categoria” do blog o website escolhido foi o jogo web-based System Empires jogo este que tenho vindo a jogar e a falha nele explorada será o tipo de falha Cross-site scripting (XSS) esta falha, para os que não sabem, permite fazer injecção de código numa página, esta é uma vulnerabilidade client-side pois só se dá no browser da vítima e não afecta, directamente, o servidor.
Nota: esta falha é apenas vísivel a membros registados no jogo. Vulnerabilidade corrigida (mais informações)
Uma funcionalidade que o jogo tem é de verificar nas regiões visiveis ao nosso observatório se ele está online para poder executar o ataque com mais segurança.
E como é o URL desta funcionalidade formado?
http://civ.sysemp.com/players.php?u=470&n=skin&pop
u – Unique_ID do membro
n – texto a mostrar na janela
Onde reside a falha neste URL?
No parâmetro n. Para não fazer mais uma query à base de dados os programadores optaram por passar o parâmetro anteriormente e esqueceram-se de fazer filtragem dos dados. Assim sem qualquer filtragem é possível passar qualquer tipo de dados incluindo elementos HTML.
Introduzindo então informações no lugar de skin, por exemplo:
http://civ.sysemp.com/players.php?u=470&n=<script>alert(“XSS?”);</script>&pop
Vamos obter o seguinte resultado:
Agora se tentarmos colocar uma página para tentar enganar alguém que aceda através deste URL podemos utilizar iframes por exemplo:
http://civ.sysemp.com/players.php?u=470&n=</b></td></tr><iframe src =”http://joaopedropereira.com/” width=”110%” height=”3000px” scrolling=”no” frameborder=”0″></iframe></table>&pop
Neste caso a única coisa que acontece é a página do jogo ficar com a minha página pessoal a ocupar tudo, mas imaginemos que alguém queria fazer algo de mal, podia gerar uma página de login igual à do jogo e colocar num host privado guardando todas as passwords que os utilizadores introduzissem sem saberem que estavam fora do jogo… Claro que para isso era necessário alguma engenharia social e técnicas de phishing mas com isto era muitissimo fácil de realizar e era possível de realizar com poucos conhecimentos a esse nível.
A falha já foi reportada à administração, esperemos brevidade na resolução do problema.
Quem se quiser proteger contra este tipo de vulnerabilidades pode utilizar vários programas como o HTML Purifier (permite algumas tags HTML), ou então aconselho vivamente a utilização da Input Class da framework Code Igniter (quem não quiser utilizar a framework completa pode alterar o ficheiro e utilizar apenas o que lhe convém e até fazer modificações).
E vocês o que acham deste tipo de vulnerabilidades? E como as aproveitariam?
Uma vez que a string passada como argumento (por GET) só tem o objectivo de ser impressa e não existir interpretação então basta aplicar a função htmlspecialchars disponível no php. 😉
Simples e eficaz, boa abordagem e bom tempo de resposta.
Para quem não sabe Bruno Monteiro é o administrador e developer do jogo.
Hey!
Não seria mais adequado usar o strip_tags? 🙂
Sérgio
Ambas funcionam neste caso, enquanto que o ouput utilizando a função htmlspecialchars do url http://civ.sysemp.com/players.php?u=470&n=<script>alert(”XSS?”);</script>&pop
será isto:
caso tivesse sido corrigido com a função strip_tags (que por sinal tem uma vulnerabilidade que permite fazer bypass nas versões 4.x.x do PHP) ficaria algo como isto:
Não porque assim não deixava haver usernames como “<search and=”destroy” />” 🙂