Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Segurança em Aplicações Web

Segurança em Aplicações Web

Palestra apresentada no Encontro Locaweb 2014.

Cb5d9e9095cd41b636764a85e57ade4b?s=128

Nando Vieira

March 18, 2014
Tweet

Transcript

  1. Segurança em aplicativos web Nando Vieira

  2. @fnando Nando Vieira

  3. @fnando http://hellobits.com

  4. @fnando howto. http://howto.io

  5. @fnando http://codeplane.com.br

  6. @fnando UM NOVO PROJETO.

  7. @fnando VOCÊ TEM MUITO TRABALHO PELA FRENTE.

  8. @fnando VOCÊ COLOCA O PROJETO NO AR.

  9. @fnando VOCÊ SABE QUE É APENAS O COMEÇO.

  10. @fnando VOCÊ ESTÁ SEGURO?

  11. @fnando 75% DOS ATAQUES ESTÃO NA CAMADA DA APLICAÇÃO.

  12. @fnando BRECHAS DE SEGURANÇA PODEM ACABAR COM A SUA CREDIBILIDADE.

  13. Injection Broken Authentication & Session Management Cross-Site Scripting (XSS) Insecure

    Direct Object References Security Misconfiguration Sensitive Data Exposure Missing Function Level Access Control Cross-Site Request Forgery (CSRF) Using Components with Known Vulnerability Unvalidated Redirects and Forwards OWASP — TOP 10 2013
  14. @fnando owasp.org

  15. @fnando FRAMEWORKS COMO O RAILS SÃO BEM SEGUROS POR PADRÃO.

  16. @fnando AINDA ASSIM, FRAMEWORKS TEM BRECHAS.

  17. @fnando OUTRAS BRECHAS SÃO INTRODUZIDAS PELOS DEVS.

  18. @fnando HOJE VAMOS VER COMO MINIMIZAR FALHAS DE SEGURANÇA.

  19. @fnando CONFIGURAÇÃO

  20. @fnando NUNCA ARMAZENE CONFIGS NO REPOSITÓRIO.

  21. @fnando SE VOCÊ USA HEROKU, USE VARIÁVEIS DE AMBIENTE.

  22. @fnando OU COPIE O ARQUIVO DE CONFIG NA HORA DO

    DEPLOY.
  23. @fnando set :user, "deploy"! set :domain, 'howtocode.com.br'! set :deploy_to, '/var/www/howto-site'!

    set :repository, 'git@codeplane.com:fnando/howto-site.git'! set :branch, 'master'! ! set :shared_paths, ['.env', 'log', 'tmp']! ! desc "Deploys the current version to the server."! task :deploy => :environment do! deploy do! invoke :'git:clone'! invoke :'deploy:link_shared_paths'! invoke :'bundle:install'! invoke :'rails:assets_precompile'! ! to :launch do! queue "touch #{deploy_to}/shared/tmp/restart.txt"! end! end! end
  24. @fnando NO RUBY, UTILIZE A BIBLIOTECA DOTENV. http://fnando.me/z0

  25. @fnando NO PHP EXISTE O PHPDOTENV. http://fnando.me/yz

  26. @fnando CRIE ARQUIVOS DE CONF QUE SÃO CARREGADOS NO BOOT

    DO APP.
  27. @fnando DB_NAME=myapp_production DB_USERNAME=myapp DB_PASSWORD=8ea388a3a22c14b2c3 DB_HOSTNAME=127.0.0.1

  28. @fnando <?php Dotenv::load(".env"); ! $db_name = getenv("DB_NAME"); $db_host = getenv("DB_HOSTNAME");

    $db_user = getenv("DB_USERNAME"); $db_pass = getenv("DB_PASSWORD"); $db_uri = “mysql:dbname=${db_name};host=${db_host}"; ! $db = new PDO($db_uri, $db_user, $db_pass);
  29. @fnando NÃO ADICIONE OS ARQUIVOS .ENV AO REPOSITÓRIO DO PROJETO.

  30. @fnando SESSION HIJACKING

  31. @fnando O PROTOCOLO HTTP É STATELESS.

  32. @fnando USO DE COOKIES PARA FAZER A IDENTIFICAÇÃO DO USUÁRIO.

  33. @fnando UM ATACANTE PODE ROUBAR O COOKIE DE UM USUÁRIO.

  34. @fnando FORCE O USO DE SSL EM TUDO QUE EXIGE

    AUTENTICAÇÃO.
  35. @fnando EXPIRE A SESSÃO EM CASO DE INATIVIDADE.

  36. @fnando MARQUE COOKIES COM A OPÇÃO HTTP ONLY.

  37. @fnando MARQUE COOKIES COM A OPÇÃO SECURE.

  38. @fnando <?php setcookie( "name", // Nome do seu cookie "John

    Doe", // Valor do cookie 0, // Tempo de expiração "/", // Caminho onde o cookie é válido "example.org", // Domínio onde o cookie é válido true, // Marca o cookie como seguro true // Marca o cookie como httponly );
  39. @fnando

  40. @fnando NUNCA ARMAZENE DADOS CONFIDENCIAIS NO CLIENTE.

  41. @fnando OU USE SESSÃO.

  42. @fnando PASSWORD

  43. @fnando NUNCA ARMAZENE SENHAS EM TEXTO PURO.

  44. @fnando http://fnando.me/z2

  45. @fnando HASHING É UM POUCO MELHOR, MAS NÃO AJUDA MUITO.

  46. @fnando <?php $password = "darthvader"; $hash = sha1($password); // fe89b8746ce9b2fcdf93cbd834805355a269275f

  47. @fnando

  48. @fnando FAZER SALTING É UM POUCO MELHOR.

  49. @fnando <?php $password = "darthvader"; $password_salt = sha1(mt_rand()); $password_digest =

    sha1("--${salt}--${password}--"); // a82a101dea442136d49fc1ae32bea0ebd5ba3372
  50. @fnando

  51. @fnando O PROBLEMA É QUE HASHING FOI FEITO PARA SER

    RÁPIDO.
  52. @fnando http://fnando.me/z3

  53. @fnando USE UM ALGORITMO BASEADO EM BLOWFISH.

  54. @fnando # Ruby require "bcrypt" ! # Saving to the

    database password = "darthvader" password_digest = BCrypt::Password.create(password, cost: 12) ! # Comparing the password if BCrypt::Password.new(password) == password_digest puts "Valid password!" else puts "Invalid password!" end
  55. @fnando <?php # Saving to the database $password = "darthvader";

    $salt = '$2a$12$mit9bIv8oD6Ic9fE6Hoo'; $password_digest = crypt($password, $salt); ! # Comparing the password if (crypt($password, $salt) == $password_digest) { echo "Valid password!\n"; } else { echo "Invalid password!\n"; }
  56. @fnando ISSO MINIMIZA ATAQUES DE FORÇA BRUTA.

  57. @fnando COMPLEMENTE SUA DEFESA COM OUTRAS TÉCNICAS.

  58. @fnando REDIRECTIONS

  59. @fnando O ATACANTE PODE USAR A ENTRADA DE URL PARA

    PHISHING.
  60. @fnando CASO DE USO: REDIRECIONAR O USUÁRIO PARA UMA PÁGINA

    APÓS O LOGIN.
  61. @fnando # Rails redirect_to params[:return_to] ! # PHP header("Location: "

    . $_GET["return_to"]);
  62. @fnando PROCESSE A URL ANTES DE REDIRECIONAR O USUÁRIO.

  63. @fnando class ReturnUrl attr_reader :default_url def initialize(default_url) @default_url = default_url

    end ! def return_url(url) return default_url if url.blank? ! uri = URI.parse(url) path = uri.path path << "?#{uri.query}" if uri.query path << "##{uri.fragment}" if uri.fragment path end end
  64. @fnando <?php class ReturnTo { var $defaultUrl; ! function ReturnTo($defaultUrl)

    { $this->defaultUrl = $defaultUrl; } ! function returnUrl($url) { if (!$url) { return $this->defaultUrl; } ! $uri = parse_url($url); $path = $uri["path"]; $path = $path ?: "/"; ! if ($uri["query"]) { $path .= "?" . $uri["query"]; } if ($uri["fragment"]) { $path .= "#" . $uri["fragment"]; } ! return $path; } }
  65. @fnando O REFERRER PODE CONTER INFORMAÇÕES CONFIDENCIAIS.

  66. @fnando http://presentta.com.br/386d31a6d7

  67. @fnando FAÇA O REDIRECT À PARTIR DE UMA PÁGINA ESPECÍFICA.

  68. @fnando EXIBA UMA PÁGINA INTERMEDIÁRIA.

  69. @fnando

  70. @fnando SQL INJECTION

  71. @fnando UM ATACANTE PODE INJETAR SQL À PARTIR DE PARÂMETROS

    E FORMULÁRIOS.
  72. @fnando # Rails id = params[:id] User.where("id = #{id}").destroy !

    // PHP $id = $_GET["id"]; mysqli_query("DELETE FROM users WHERE id = '${id}'");
  73. @fnando OMG!

  74. @fnando # Rails id = "0 OR 1=1" User.where("id =

    #{id}").destroy ! // PHP $id = "0 OR 1=1"; mysqli_query("DELETE FROM users WHERE id = ${id}");
  75. @fnando NUNCA INTERPOLE EM QUERIES SQL.

  76. @fnando USE PREPARED STATEMENTS.

  77. @fnando # Rails id = "0 OR 1=1" ! User.where("id

    = ?", id).destroy User.where("id = :id", id: id).destroy
  78. @fnando <?php $db = new PDO("mysql:dbname=test;host=127.0.0.1", "root", ""); ! $id

    = "0 OR 1=1"; ! $query = $db->prepare("delete from users where id = :id"); $query->bindParam(":id", $id, PDO::PARAM_INT); $query->execute();
  79. @fnando TODOS ORMS IMPLEMENTAM ISSO.

  80. @fnando CROSS-SITE SCRIPTING (XSS)

  81. @fnando NUNCA CONFIE EM DADOS ENVIADOS PELOS USUÁRIOS.

  82. @fnando VALIDE AS INFORMAÇÕES ANTES DE SALVÁ- LAS NO BANCO

    DE DADOS.
  83. @fnando TODO DADO ENVIADO PELO USUÁRIO É INSEGURO.

  84. @fnando TODO DADO INSEGURO DEVE SER PROCESSADO ANTES DE SER

    EXIBIDO.
  85. @fnando REMOVA AS TAGS HTML ANTES DE RENDERIZAR O CONTEÚDO.

  86. @fnando <?php function escape_html($content) { $content = strip_tags($content); return $content;

    }
  87. @fnando ESCAPE CARACTERES COMO < e &.

  88. @fnando <?php function escape_html($content) { $content = strip_tags($content); $content =

    htmlspecialchars($content, ENT_QUOTES, "UTF-8"); return $content; }
  89. @fnando O RAILS POSSUI O MÉTODO SANITIZE.

  90. @fnando OU USE O LOOFAH. http://fnando.me/o7

  91. @fnando NÃO INTERPOLE VALORES ENVIADOS PELO USUÁRIO EM STRINGS HTML.

  92. @fnando def annotation(text) %[<em class="annotation">#{text}</em>].html_safe end def annotation(text) content_tag :em,

    text, class: "annotation" end def annotation(text) %[<em class="annotation">#{h(text)}</em>].html_safe end
  93. @fnando function annotation($text) { return "<em class='annotation'>${text}</em>"; } function annotation($text)

    { $text = escape_html(text); return "<em class='annotation'>${text}</em>"; }
  94. @fnando NO JAVASCRIPT, VOCÊ PRECISA TOMAR O MESMO CUIDADO.

  95. @fnando NÃO ATRIBUA HTML AO DEFINIR O CONTEÚDO FORNECIDO POR

    USUÁRIOS.
  96. @fnando $.getJSON("/info", function(profile){ $(".profile").html(profile.bio); }); $.getJSON("/info", function(profile){! $(".profile").text(profile.bio);! });

  97. @fnando SE VOCÊ PRECISAR DE UMA ESTRUTURA HTML, CRIE UMA

    ETAPA INTERMEDIÁRIA.
  98. @fnando $.getJSON("/info", function(profile){ var content = $("<div class='container'>") .text(profile.bio) ;

    ! $(".profile").html(content); });
  99. @fnando SOFTWARE UPDATE

  100. @fnando NUNCA USE SOFTWARE DESATUALIZADO.

  101. @fnando APLIQUE AS ATUALIZAÇÕES DE SEGURANÇA O MAIS RÁPIDO POSSÍVEL.

  102. @fnando http://heartbleed.com

  103. @fnando http://xkcd.com/1354

  104. @fnando $ python heartbleed.py example.org

  105. @fnando Received heartbeat response: 0000: 02 40 00 D8 03

    00 53 43 5B 90 9D 9B 72 0B BC 0C .@....SC[...r... 0010: BC 2B 92 A8 48 97 CF BD 39 04 CC 16 0A 85 03 90 .+..H...9....... 00d0: 10 00 11 00 23 00 00 00 0F 00 01 01 2F 33 34 2E ....#......./34. 00e0: 30 2E 31 38 34 37 2E 31 33 37 20 53 61 66 61 72 0.1847.137 Safar 00f0: 69 2F 35 33 37 2E 33 36 0D 0A 52 65 66 65 72 65 i/537.36..Refere 0100: 72 3A 20 68 74 74 70 73 3A 2F 2F 77 77 77 2E 74 r: https://examp 0110: 72 61 79 2E 63 6F 6D 2E 62 72 2F 0D 0A 41 63 63 le.org/......Acc 0120: 65 70 74 2D 45 6E 63 6F 64 69 6E 67 3A 20 67 7A ept-Encoding: gz 0130: 69 70 2C 64 65 66 6C 61 74 65 2C 73 64 63 68 0D ip,deflate,sdch. 0140: 0A 41 63 63 65 70 74 2D 4C 61 6E 67 75 61 67 65 .Accept-Language 0150: 3A 20 70 74 2D 42 52 2C 70 74 3B 71 3D 30 2E 38 : pt-BR,pt;q=0.8 0160: 2C 65 6E 2D 55 53 3B 71 3D 30 2E 36 2C 65 6E 3B ,en-US;q=0.6,en; 0170: 71 3D 30 2E 34 0D 0A 43 6F 6F 6B 69 65 3A 20 5F q=0.4..Cookie: _ 0180: 5F 75 74 6D 61 3D 34 37 35 37 33 32 31 38 2E 31 _utma=47573218.1 0190: 33 31 31 35 32 35 38 34 37 2E 31 34 30 30 30 39 311525847.140009 01a0: 31 35 31 39 2E 31 34 30 30 30 39 36 38 36 35 2E 1519.1400096865. 01b0: 31 34 30 30 31 35 31 35 33 34 2E 33 3B 20 5F 5F 1400151534.3; __ 01c0: 75 74 6D 7A 3D 34 37 35 37 33 32 31 38 2E 31 34 utmz=47573218.14 01d0: 30 30 30 39 31 35 31 39 2E 31 2E 31 2E 75 74 6D 00091519.1.1.utm 01e0: 63 73 72 3D 28 64 69 72 65 63 74 29 7C 75 74 6D csr=(direct)|utm 01f0: 63 63 6E 3D 28 64 69 72 65 63 74 29 7C 75 74 6D ccn=(direct)|utm 0200: 63 6D 64 3D 28 6E 6F 6E 65 29 0D 0A 0D 0A 25 30 cmd=(none)....%0
  106. @fnando SE VOCÊ NÃO ATUALIZA SEU APLICATIVO, É HORA DE

    FICAR COM MEDO.
  107. @fnando EXISTE UMA FERRAMENTA CHAMADA METASPLOIT.

  108. @fnando ELA POSSUI EXPLOITS PARA AS FALHAS DE SEGURANÇA MAIS

    CONHECIDAS.
  109. @fnando POSSUI DIVERSOS EXPLOITS PARA RAILS, PHP, JAVA, E MUITO

    MAIS.
  110. @fnando EXPLOIT: SECRET TOKEN DO RAILS

  111. @fnando

  112. @fnando EXPLOIT: SERIALIZAÇÃO DE DADOS ENVIADOS

  113. @fnando

  114. @fnando ATUALIZE SEU APLICATIVO AGORA MESMO.

  115. @fnando E ATUALIZE TODO E QUALQUER SOFTWARE QUE VOCÊ USA.

  116. @fnando SE VOCÊ USA SOFTWARE DESATUALIZADO, ASSUME O RISCO DE

    SER INVADIDO.
  117. @fnando MINIMIZE O DANO E SIGA O PRINCÍPIO DE MENOR

    PRIVILÉGIO.
  118. @fnando VOCÊ NÃO PRECISA DE UM USUÁRIO SUDOER PARA O

    DEPLOY.
  119. @fnando ACEITE AUTENTICAÇÃO APENAS POR SSH.

  120. @fnando # /etc/ssh/sshd_config PasswordAuthentication no

  121. @fnando LIBERE APENAS AS PORTAS NECESSÁRIAS.

  122. @fnando apt-get install ufw ! ufw default deny ufw enable

    ufw logging low ufw delete ufw allow ssh ufw allow www ufw allow https ufw limit ssh
  123. @fnando CONTRATE UM SYSADMIN EXPERIENTE.

  124. @fnando FINALIZANDO

  125. @fnando SEGURANÇA É COISA SÉRIA.

  126. @fnando EXISTE MUITO MAIS DO QUE MOSTREI AQUI.

  127. @fnando SEGURANÇA DEVE SER UMA PREOCUPAÇÃO CONSTANTE.

  128. @fnando ACOMPANHE OS PROJETOS QUE VOCÊ USA.

  129. @fnando ACOMPANHE OS SITES DE SEGURANÇA.

  130. @fnando É A SUA CREDIBILIDADE QUE ESTÁ EM JOGO.

  131. @fnando OBRIGADO. http://fnando.me/z1