Vulnerabilidade XSS no jogo System Empires

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.

SystemEmpires_Online

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:

SystemEmpires_Script_Alert

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

SystemEmpires_iframe

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?

5 comments

  1. 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. 😉

  2. Bruno Monteiro: 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.

    Hey!
    Não seria mais adequado usar o strip_tags? 🙂

    Sérgio

Leave a Reply to Sérgio Dinis LopesCancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.