$30 off During Our Annual Pro Sale. View Details »

Segurança em Aplicações Web

Segurança em Aplicações Web

Palestra apresentada no Encontro Locaweb 2014.

Nando Vieira

March 18, 2014
Tweet

More Decks by Nando Vieira

Other Decks in Programming

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