Este artigo foi escrito pelo Diego Pires de Azevedo Gonçalves (IFSP, diego_moicano@yahoo.com.br).
A grande explosão da Internet começou não faz muito tempo e sua expansão está tão rápida e tão progressiva que daqui alguns anos seu universo abrigará qualquer ponto do planeta Terra.
Basta ter um computador e uma linha telefônica que tenha conexão à Internet, pronto, você está em plenas condições para navegar em web sites, comunidades, fazer pesquisas, participar de batepapos, assistir filmes, escutar músicas enfim, todo o conforto está, literalmente, em suas mãos e sem precisar sair de casa.
Nesse imenso mundo virtual, estamos em constante comunicação com todos seus usuários, e um dos meios que permite isso são as aplicações Web. Um conjunto de programas cuja finalidade é proporcionar o acesso remotamente a sites, blogs etc.
Esses programas, feitos por desenvolvedores/programadores, por ora apresentam vulnerabilidades, falhas de programação que podem ser exploradas por qualquer pessoa que as descubra. E como em todo lugar temos pessoas com más intenções e que estão sempre procurando brechas em sistemas para poder invadi-los e tirar algum proveito. Na maioria das vezes são adolescentes querendo fazer alguma farra, outras são ataques premeditados feitos por profissionais.
Esse trabalho visa três objetivos: enfatizar o alerta, que já está sendo feito pela mídia na Internet, sobre a urgência em se tomar certas atitudes perante esse problema; demonstrar como é feito um ataque em uma aplicação Web; e também expor os meios pelos quais um usuário e/ou desenvolvedor pode se prevenir.
Serão vistos dois tipos de vulnerabilidades em aplicações Web, assim como sua exploração, são elas: SQL Injection e XSS. Conhecendo o funcionamento de tais ataques pode-se entender como um atacante age e a partir disso se defender.
Palavras-chave: aplicação Web, SQL Injection, XSS ou Cross-Site-Scripting.
A grande explosão da Internet começou não faz muito tempo e sua expansão está tão rápida e tão progressiva que daqui alguns anos, seu universo abrigará qualquer ponto do planeta Terra. Qualquer pessoa, qualquer instituição fará parte desse nicho e dificilmente não conseguirão mais escapar ou ficar fora dele.
Segundo o site americano Internet World Stats – Usage and Population Statistics o número de usuários cresce assustadoramente a cada ano, conforme podemos ver no gráfico abaixo:
De acordo com o gráfico podemos perceber que entre o ano de 2004 e 2005 o número de usuários conectados aumentou muito, e daí em diante, até 2010, seu crescimento continua em ascenção.
De fato, basta ter um computador e uma linha telefônica que tenha conexão à Internet, pronto, você está em plenas condições para navegar em web sites, comunidades, fazer pesquisas, participar de bate-papos, assistir filmes, escutar músicas enfim, todo o conforto está, literalmente, em suas mãos e sem precisar sair de casa. E mais, você pode participar efetivamente dessa imensa rede de usuários, criando seu próprio site, blogs, pagar contas em Web Banking, comprar produtos e até fazer compras em supermercados. Para isso entram em cena as Aplicações Web as quais possibilitam a interação entre os usuários e os Web sites.
No entanto, tais aplicações apresentam erros de programação; esses erros causam brechas nas aplicações tornando-as vulneráveis. Tais erros de programação não se devem pelo fato do desenvolvedor não saber programar, às vezes sim, mas principalmente, pela falta de conhecimento relacionado à segurança da aplicação em si e esse descaso pode trazer sérios danos tanto para com seu site quanto para com seus usuários, pois, assim como no mundo real, na Internet também temos pessoas com más intenções.
Na maioria das vezes são adolescentes querendo fazer alguma farra, mudar a página inicial de um site (defacement) ou mostrar para um colega que conseguiu a senha do administrador. Mas às vezes é um ataque premeditado, feito exclusivamente por alguém contratado ou não, que está em busca de alguma informação que possa ser útil para algum ataque que tenha uma magnitude bem maior futuramente.
Esse tipo problema, invasões e vulnerabilidades, ainda são muito comuns na Internet, haja vista a grande quantidade de noticiários que circula nos meios de comunicação como, por exemplo, em podcast, fóruns, blogs; sempre aparece nos noticiários que tal site foi invadido, ou que teve seu banco de dados roubados. E apesar de todos os avisos, tais ataques ainda são muito frequentes, a falta de conscientização é seu maior problema.
Nesse artigo é tratado o tipo de ataque client-side, isto é, do lado do cliente, feito por usuários e está organizado da seguinte maneira: primeiramente será definido o que é Aplicação Web; a seguir, conheceremos dois tipos de vulnerabilidades; depois sua Prevenção e por fim a Conclusão.
2.Conhecendo as Aplicações Web
Aplicação Web nada mais é que a definição genérica de quaisquer aplicativos que são executados em computadores locais, mas que são acessados via Internet através do seu navegador como, por exemplo, Internet Explorer e o Firefox.
Esses aplicativos são um conjunto de programas que realizam entrada e saída de dados, geram informações e executam ações. São executados em máquinas chamadas servidores, ou melhor, servidores HTTP. O Protocolo de Transferência de Hipertexto (HTTP) pertence à camada de Aplicação no modelo OSI e sua função é transferir grandes quantidades de dados como textos, imagens etc, na World Wide Web, ou seja, na Internet.
De acordo com a Figura 1 vemos o funcionamento de uma aplicação Web. O cliente se conecta na Internet e faz um acesso, via navegador, ao site de algum banco, por exemplo. Ele digita suas informações, como login e senha e essa requisição é enviada ao servidor responsável, que é tratada pelas aplicações Web e por fim consultada em seu banco de dados. Se tudo for confirmado, o cliente receberá a resposta e poderá continuar a navegar no site.
3.Vulnerabilidades em Aplicações Web
Como já foi dito, as vulnerabilidades acontecem devido a falta de uma boa programação. Os desenvolvedores de software simplesmente ignoram o fator segurança, fazendo seus programas com bugs os quais criam brechas que possibilitam invasões de pessoas más intencionadas.
Uma das últimas estatísticas feita pelo site The Web Application Security Consortium indicam que a probabilidade de se encontrar sites vulneráveis na Internet, é muito comum. De acordo com o gráfico abaixo podemos ver o percentual de vulnerabilidades encontrado nas Aplicações Web.
E para complicar ainda mais a situação, de acordo com o mesmo site, outro fator que dá origem as vulnerabilidades se deve a insuficiência na administração que é 20% maior do que nos códigos das aplicações, como pode ser visto pelo gráfico abaixo.
Das vulnerabilidades citadas acima, no primeiro gráfico, neste trabalho irei descrever o funcionamento de duas delas que são bastante exploradas pelos invasores, são elas: SQL Injection, XSS ou Cross-Site-Scripting. Não estarei explicando toda programação que está por trás delas, presumo que o leitor já tenha certo conhecimento básico que envolve sua teoria.
3.1.SQL Injection
Um ataque de SQL Injection consiste na injeção, ou inserção de comandos SQL numa consulta de entrada de dados cuja finalidade é manipular uma aplicação para tirar proveito de seu conteúdo para fins maliciosos. De acordo com The Open Web Application Security Project (OWASP), a definição completa de SQL Injection seria a seguinte:
Um ataque de injeção SQL consiste na inserção ou "injeção" de uma consulta SQL através de dados de entrada do cliente para o aplicativo. Uma exploração da injeção de SQL bem sucedida pode ler dados sigilosos do banco de dados, alterar dados do banco de dados (Insert / Update / Delete), executar operações de administração do banco de dados (como o desligamento do DBMS), recuperar o conteúdo de um determinado arquivo presente no sistema de arquivos do DBMS e, em alguns casos, executar comandos do sistema operacional. Ataques de injeção SQL é um tipo de ataque de injeção, em que os comandos SQL são injetados através do data-plane a fim de efetuar a execução de comandos SQL predefinidas.
(OWASP, 2010)
Sobre data-plane citado acima, um exemplo bem simples, seria a tela de login administrativo de um dado site.
3.1.1.Reconhecendo SQL Injection
A ideia do SQL Injection é provocar um erro na aplicação fazendo com que a mesma retorne algum dado que seja útil para o atacante. Vejamos como se da o seu funcionamento. Analisando a consulta abaixo:
SELECT login, senha FROM administrador;
Esse tipo de consulta pede para retornar o login e senha da tabela administrador. Tal consulta poderia ser mais refinada utilizando a cláusula WHERE, desta forma:
SELECT login, senha FROM autores WHERE nome = ' ';
Aonde no nome poderíamos inserir a palavra 'admin', um tipo string, ficando assim:
SELECT login, senha FROM autores WHERE nome = ' admin';
Note que esse tipo de consulta ocorre no navegador, na hora que se está digitando na tela de login da administração, algo como a Figura abaixo:
Figura : Exemplo de tela de login de um site.
Vamos provocar um erro na aplicação, inserindo o seguinte, 'ad'min':
SELECT login, senha FROM autores WHERE nome = 'ad'min';
Agora esse tipo de consulta irá retornar um erro, pois o SQL vai interpretar somente 'ad', que está dentro dos apóstrofos, e o min' ele não reconhece, ou seja, não é um identificador válido, sendo que não será executado, retornado um erro de sintaxe visto no navegador.
Figura : Erro de sintaxe: vulnerável a SQL Injection
Com base nisso, o atacante poderá manipular a aplicação, entrando com dados que tiram proveito de algum comportamento não esperando pelo banco de dados.
Uma string muito utilizada nesse tipo de ataque é: ' or 1=1–
Vejamos como ficaria na consulta:
SELECT login, senha FROM autores WHERE nome = 'admin' AND senha = '' or 1=1--'
SELECT login, senha FROM autores WHERE nome = '' or 1=1--' AND senha = '' or 1=1--'
Como funciona então essa consulta com a string ' or 1=1–. O apóstrofo inicial fecha a variável nome deixando-a em branco, ou seja, o banco de dados não saberá o que fazer com ela; depois a string direciona a uma afirmação em or 1=1, ou seja, ou verdadeiro é sempre verdadeiro, ora se é sempre verdadeiro então o banco de dados deve aceitar; e quanto aos dois traços (–) no final da string, eles indicam um comentário, assim tudo que vir depois dos dois traços é comentário e o banco de dados deve ignorar. O efeito disso é que atacante entre na aplicação e o pior, direto no usuário root, o administrador do sistema.
3.2. Cross-Site-Scripting ou XSS
Assim como o SQL Injection o XSS utiliza do mesmo artifício, injeção de códigos maliciosos via navegador, utilizando, mais comumente, a liguagem de programação JavaScript. Tais códigos maliciosos são inseridos em sites, ficando com um link exposto a espera de algum usuário desatento clicar nele, é como lançar um anzol no mar. A intenção dos atacantes é roubo de cookies, que é um conjunto de dados trocado entre o navegador e o servidor do site acessado e que é guardado no computador do usuário em um arquivo cujo formato é texto. Nos cookies temos informações do usuário como login e senha, o que permite o atacante, utilizando do cookies, entrar no site como se fosse o usuário que clicou no link. Imaginem se o site for um banco! Outra função deste ataque é ganhar privilégios administrativos em áreas do site que não possuem nenhum privilégio, chamado de Escalonamento de Privilégio.
3.2.1.Reconhecendo o XSS
Normalmente o atacante procura páginas que possuam entradas de dados para pesquisar no site, ou então deixar algum comentário, ou seja, os formulários e é através desses pontos de acesso que ele teste se o site está vulnerável a XSS.
Neste exemplo estarei fazendo um teste no site de um colega (Figura abaixo), aonde tal vulnerabilidade já fora constatada por mim e ele me autorizou em usá-lo como demonstração neste artigo. Mesmo assim, estarei ocultando qualquer evidência que possa identificar o site.
Figura acima: Portal de um site.
Vamos usar o campo busca do site e injetar o seguinte código:
Se o site "responder" com uma caixa de mensagem inscrito XSS, então ele é vulnerável a esse tipo de ataque. Vamos ver então o que acontece:
Figura 5: Constatação de XSS.
Ao clicar no botão "buscar" temos o surgimento da caixa de mensagem, portanto o site está vulnerável a XSS. A partir daí o atacante pode inserir links redirecionando a sites falsos, a malware, pode mudar a interface inicial do site (defacement), pode realizar roubos de cookies de usuários cadastrados enfim, vai depender do objetivo da pessoa.
De tudo que foi exposto acima podemos perceber que a melhor maneira de prevenir tais ataques deve ser feito no ato da inserção dos dados pelo usuário. Assim quando este pressionar a tecla Enter, para enviar seus dados através do formulário do site, por exemplo, esses dados devem ser verificados pela aplicação, antes de serem aceitos. Logo abaixo descrevo como isso pode ser feito.
Para prevenir de SQL Injection uma boa pratica de programação é limitar o acesso do usuário no site em certas áreas do mesmo. Por exemplo, se o usuário quiser fazer uma compra, ele deve ter acesso a uma determinada área do site que o permite fazer somente isso.
Validar os dados de entrada feitos pelo usuário, isso é extremamente importante. Um exemplo bem prático: num campo do site aonde permite a entrada de dados somente numéricos a aplicação deve verificar que realmente os dados inseridos pelo usuário são apenas números.
Também habilitar funções como e addslashes(), stripslashes(), mysql_real_escape_string() previnem ataques de SQL Injection.
Quanto a XSS a ideia é basicamente a mesma, mas de outra forma. A melhor maneira a ser tomada é tratando as entradas do usuário com um filtro, não permitindo o uso de tags em HTML, pois a inserção das mesmas podem ter incluso códigos em JavaScript; também códigos em hexadecimal e o JavaScript puro.
Aplicações Web são muito eficientes e funcionais, sem elas seria praticamente impossível navegar por toda Internet sem muito esforço, podemos dizer que elas são o trampolim entre o usuário final e seus desenvolvedores.
Vimos, nesse trabalho, que o número de usuários cresce exponencialmente na Internet e que as aplicações Web têm um papel fundamental nesse meio. Desta forma foi descrito seu funcionamento e que são feitas por desenvolvedores/programadores. Tanto os erros de programação como de administração deixam as aplicações Web vulneráveis, nesse artigo vimos somente duas delas: Cross-Site-Scripting (XSS) e SQL Injection. Conhecemos como elas podem ser detectadas por usuários mal intencionados e, por conseguinte, foi exposto, de maneira simples, como um desenvolvedor pode se prevenir de tais ataques, utilizando algumas funções em seus códigos e validando entradas dos usuários assim como restringir o uso de códigos por parte deles.
Apesar dos alertas que se tem feito nos meios de comunicação pela Internet, os ataques ainda são muito comuns. Desenvolvedores e usuários ainda não se conscientizaram que a simples prática de boas condutas de segurança pode livrá-los de uma enorme dor de cabeça.
Esse artigo tem como objetivo principal, enfatizar o uso da boa prática de programação para com seus desenvolvedores, alertar os administradores para que façam uma administração consciente em seus sites e sensibilizar os usuários que, assim como no mundo real, estamos expostos as nossas fraquezas dentro do mundo virtual.
SCAMBRAY, J.; SHEMA M. Segurança Contra Hacker: aplicações Web. Trad Bazán Tecnologia e Linguística. São Paulo: Futura, 2003.
OLIVEIRA, Gustavo S. et al. Explorando Vulnerabilidades à Técnica XSS na Aplicações e Sítios Web: um estudo do caso. FatecJP, João Pessoa, 2007. Disponível em: <http://www.fatecjp.com.br/revista/art-ed02-007.pdf>. Acesso em 10 mar. 2011
SANTANA, Vagner F.; BARANAUSKAS, Maria C. C.; HENRIQUES, Marco A. A. Javascript na Web 2.0: ameaças e prevenções no lado do cliente. Computação UNICAMP, Campinas, abr. 2010. Disponível em: <http://www.ic.unicamp.br/~reltech/2010/10-12.pdf>. Acesso em: 10 mar. 2011.
FARIAS, Marcelo B. Injeção de SQL em aplicações Web: causas e prevenção. Informática UFRGS, Rio Grande do Sul, dez, 2009. Disponível em: <http://www.lume.ufrgs.br/bitstream/handle/10183/18573/000730977.pdf?sequence=1>. Acesso em: 08 mar. 2011.
CERON, João M. et al. Vulnerabilidades em Aplicações Web: uma Análise Baseada nos Dados Coletados em Honeypots. Ponto de Presença da Rede Nacional de Ensino e Pesquisa, Rio Grande do sul, 2008. Disponivel em: <http://www.pop-rs.rnp.br/arquivos/2008/honeypot_web_sbseg.pdf>. Acesso em: 11 mar. 2011.
VÉRAS, Alission L. M.; RUGGIERO, Wilson V. Autenticação Contínua de Usuários em Aplicações Seguras na Web. POLI USP, São Paulo, set. 2005. Disponível em: <http://labcom.inf.ufrgs.br/ceseg/anais/2005/artigos/12462.pdf>. Acesso em: 11 mar. 2011.
PONTUAL, Murillo; QUEIROZ, Ruy; NETO José H. L. Segurança em Sites desenvolvidos em PHP. Congresso Internacional de Software Livre, São Paulo, nov. 2006. Disponível em: <http://www.conisli.org.br/2006/docs/1161646421Seguranca_CONISLI.pdf>. Acesso em: 10 mar. 2011.
INTERNET WORLD STATS. Internet Growth Statistics. EUA, 2011. Disponível em: <http://www.internetworldstats.com/emarketing.htm>. Acesso em: 20 mai. 2011.
THE WEB APPLICATION SECURITY CONSORTIUM. Web Application Security Statistics. EUA, 2010. Disponível em: <http://projects.webappsec.org/w/page/13246989/Web-Application-Security-Statistics>. Acesso em: 20 mai. 2011.
Tags: aplicações, Cracker, Hacker, hacking, Segurança, sql injection, Web, XSS
se eu pudesse bater palmas aqui na empresa, eu bateria.
Mas isso ai ta mais para um TUTORIAL de como usar 🙂 bacana /clap
Diego 11 jul 2011
Tem razão… essa é uma característca de meus artigos, procuro ser tanto dissertativo como descritivo, nesse caso, sob forma de tutorial. Achei que desse modo atingiria um público maior e mais heterogêneo!
Obrigado pelas palmas :joia:
Kalau 12 jul 2011
Parabéns, bem acadêmico!
Só um detalhe, (não sou professor de português, muito pelo contrário), mas a frase no primeiro parágrafo da introdução: " e dificilmente não conseguirão mais escapar ou ficar fora dele"
não ficaria melhor: " e dificilmente conseguirão escapar ou ficar fora dele"…….
Diego 12 jul 2011
Caro Kalau
Obrigado pelos parabéns 🙂
Quanto a frase, o uso do 'não' serve para enfatizar, ou seja, não serão mais capazes de escapar da matrix hehehe. Veja que 'não' é um advérbio de negação e 'dificilmente' de modo, ambos modificam o verbo 'conseguirão'. Talvez a frase poderia ser reescrita da seguinte forma: Qualquer pessoa, qualquer instituição fará parte desse nicho e, dificilmente, não conseguirão mais escapar ou ficar fora dele. Ou seja, basta colocar a palavra 'dificilmente' entre vírgulas, e aí temos um aposto, se você tirá-la daí não irá alterar o sentido da frase. Creio que foi ela que deixou esse sentido ambíguo na frase.
Olha também não sou professor de português, mas pelo que entendo seria isso.
;D show de bola!
Guzt4vo0 12 jul 2011
Rodrigo Vieira 12 jul 2011
Diego, parabéns pelo artigo.
Achei que ficou bem didática a apresentação do conteúdo. A leitura é acessível tanto para leigos quanto quem já sabe um pouquinho mais. Fico no aguardo de outros artigos abordando outros tipos de ataque, principalmente os listados nos documentos da OWASP.
Gust4voo e Rodrigo Vieira obrigado pelos elogios.
Quanto a novos artigo, sim farei outros… 😉
Agradeço também ao Gustavo pelo espaço concedido a nós em seu blog!
Victor Garcia 13 jul 2011
Faz um tutorial/artigo sobre os perigos do LOIC, pois mta gente conhece mas nao sabe de onde parte o perigo 🙂
Diego 13 jul 2011
Victor, está anotado 🙂
daniel 29 jul 2011
parabéns! Adorei este texto.
Diego 4 ago 2011
Obrigado Daniel 🙂
Bruno Hauck 24 ago 2011
Tenho um site e estava sofrendo o ataque de XSS. Com isso tive que mudar toda minha programação para Framework codeigniter que previne ataque de SQL injection e XSS.
Muito bom artigo e recomendo utilização de frameworks que possuem metodos para deixar seu sistema web mais seguro.
Diego 26 ago 2011
É isso aí meu amigo; devemos estar sempre atentos e atualizados, isso faz parte do dia-a-dia de qualquer pessoa consciente!