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.

Nando Vieira

March 18, 2014
Tweet

More Decks by Nando Vieira

Other Decks in Programming

Transcript

  1. Segurança em
    aplicativos web
    Nando Vieira

    View full-size slide

  2. @fnando
    Nando Vieira

    View full-size slide

  3. @fnando
    http://hellobits.com

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. @fnando
    UM NOVO
    PROJETO.

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. @fnando
    VOCÊ ESTÁ
    SEGURO?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  14. @fnando
    owasp.org

    View full-size slide

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

    View full-size slide

  16. @fnando
    AINDA ASSIM,
    FRAMEWORKS
    TEM BRECHAS.

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  19. @fnando
    CONFIGURAÇÃO

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. @fnando
    set :user, "deploy"!
    set :domain, 'howtocode.com.br'!
    set :deploy_to, '/var/www/howto-site'!
    set :repository, '[email protected]: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

    View full-size slide

  24. @fnando
    NO RUBY, UTILIZE
    A BIBLIOTECA
    DOTENV.
    http://fnando.me/z0

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  28. @fnando
    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);

    View full-size slide

  29. @fnando
    NÃO ADICIONE OS
    ARQUIVOS .ENV
    AO REPOSITÓRIO
    DO PROJETO.

    View full-size slide

  30. @fnando
    SESSION
    HIJACKING

    View full-size slide

  31. @fnando
    O PROTOCOLO
    HTTP É STATELESS.

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  38. @fnando
    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
    );

    View full-size slide

  39. @fnando
    NUNCA
    ARMAZENE DADOS
    CONFIDENCIAIS
    NO CLIENTE.

    View full-size slide

  40. @fnando
    OU USE SESSÃO.

    View full-size slide

  41. @fnando
    PASSWORD

    View full-size slide

  42. @fnando
    NUNCA
    ARMAZENE
    SENHAS EM
    TEXTO PURO.

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  45. @fnando
    $password = "darthvader";
    $hash = sha1($password);
    // fe89b8746ce9b2fcdf93cbd834805355a269275f

    View full-size slide

  46. @fnando
    FAZER SALTING É
    UM POUCO
    MELHOR.

    View full-size slide

  47. @fnando
    $password = "darthvader";
    $password_salt = sha1(mt_rand());
    $password_digest = sha1("--${salt}--${password}--");
    // a82a101dea442136d49fc1ae32bea0ebd5ba3372

    View full-size slide

  48. @fnando
    O PROBLEMA É
    QUE HASHING
    FOI FEITO PARA
    SER RÁPIDO.

    View full-size slide

  49. @fnando
    http://fnando.me/z3

    View full-size slide

  50. @fnando
    USE UM
    ALGORITMO
    BASEADO EM
    BLOWFISH.

    View full-size slide

  51. @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

    View full-size slide

  52. @fnando
    # 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";
    }

    View full-size slide

  53. @fnando
    ISSO MINIMIZA
    ATAQUES DE
    FORÇA BRUTA.

    View full-size slide

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

    View full-size slide

  55. @fnando
    REDIRECTIONS

    View full-size slide

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

    View full-size slide

  57. @fnando
    CASO DE USO:
    REDIRECIONAR O
    USUÁRIO PARA
    UMA PÁGINA APÓS
    O LOGIN.

    View full-size slide

  58. @fnando
    # Rails
    redirect_to params[:return_to]
    !
    # PHP
    header("Location: " . $_GET["return_to"]);

    View full-size slide

  59. @fnando
    PROCESSE A
    URL ANTES DE
    REDIRECIONAR
    O USUÁRIO.

    View full-size slide

  60. @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

    View full-size slide

  61. @fnando
    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;
    }
    }

    View full-size slide

  62. @fnando
    O REFERRER PODE
    CONTER
    INFORMAÇÕES
    CONFIDENCIAIS.

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  66. @fnando
    SQL INJECTION

    View full-size slide

  67. @fnando
    UM ATACANTE
    PODE INJETAR
    SQL À PARTIR DE
    PARÂMETROS E
    FORMULÁRIOS.

    View full-size slide

  68. @fnando
    # Rails
    id = params[:id]
    User.where("id = #{id}").destroy
    !
    // PHP
    $id = $_GET["id"];
    mysqli_query("DELETE FROM users WHERE id = '${id}'");

    View full-size slide

  69. @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}");

    View full-size slide

  70. @fnando
    NUNCA INTERPOLE
    EM QUERIES SQL.

    View full-size slide

  71. @fnando
    USE PREPARED
    STATEMENTS.

    View full-size slide

  72. @fnando
    # Rails
    id = "0 OR 1=1"
    !
    User.where("id = ?", id).destroy
    User.where("id = :id", id: id).destroy

    View full-size slide

  73. @fnando
    $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();

    View full-size slide

  74. @fnando
    TODOS ORMS
    IMPLEMENTAM
    ISSO.

    View full-size slide

  75. @fnando
    CROSS-SITE
    SCRIPTING (XSS)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  78. @fnando
    TODO DADO
    ENVIADO PELO
    USUÁRIO É
    INSEGURO.

    View full-size slide

  79. @fnando
    TODO DADO
    INSEGURO DEVE
    SER PROCESSADO
    ANTES DE SER
    EXIBIDO.

    View full-size slide

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

    View full-size slide

  81. @fnando
    function escape_html($content) {
    $content = strip_tags($content);
    return $content;
    }

    View full-size slide

  82. @fnando
    ESCAPE
    CARACTERES
    COMO < e &.

    View full-size slide

  83. @fnando
    function escape_html($content) {
    $content = strip_tags($content);
    $content = htmlspecialchars($content, ENT_QUOTES, "UTF-8");
    return $content;
    }

    View full-size slide

  84. @fnando
    O RAILS POSSUI O
    MÉTODO SANITIZE.

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  87. @fnando
    def annotation(text)
    %[#{text}].html_safe
    end
    def annotation(text)
    content_tag :em, text, class: "annotation"
    end
    def annotation(text)
    %[#{h(text)}].html_safe
    end

    View full-size slide

  88. @fnando
    function annotation($text) {
    return "${text}";
    }
    function annotation($text) {
    $text = escape_html(text);
    return "${text}";
    }

    View full-size slide

  89. @fnando
    NO JAVASCRIPT,
    VOCÊ PRECISA
    TOMAR O MESMO
    CUIDADO.

    View full-size slide

  90. @fnando
    NÃO ATRIBUA
    HTML AO DEFINIR
    O CONTEÚDO
    FORNECIDO POR
    USUÁRIOS.

    View full-size slide

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

    View full-size slide

  92. @fnando
    SE VOCÊ
    PRECISAR DE UMA
    ESTRUTURA HTML,
    CRIE UMA ETAPA
    INTERMEDIÁRIA.

    View full-size slide

  93. @fnando
    $.getJSON("/info", function(profile){
    var content = $("")
    .text(profile.bio)
    ;
    !
    $(".profile").html(content);
    });

    View full-size slide

  94. @fnando
    SOFTWARE
    UPDATE

    View full-size slide

  95. @fnando
    NUNCA USE
    SOFTWARE
    DESATUALIZADO.

    View full-size slide

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

    View full-size slide

  97. @fnando
    http://heartbleed.com

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  100. @fnando
    Received heartbeat response:
    0000: 02 40 00 D8 03 00 53 43 5B 90 9D 9B 72 0B BC 0C [email protected][...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

    View full-size slide

  101. @fnando
    SE VOCÊ NÃO
    ATUALIZA SEU
    APLICATIVO, É
    HORA DE FICAR
    COM MEDO.

    View full-size slide

  102. @fnando
    EXISTE UMA
    FERRAMENTA
    CHAMADA
    METASPLOIT.

    View full-size slide

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

    View full-size slide

  104. @fnando
    POSSUI DIVERSOS
    EXPLOITS PARA
    RAILS, PHP, JAVA,
    E MUITO MAIS.

    View full-size slide

  105. @fnando
    EXPLOIT: SECRET
    TOKEN DO RAILS

    View full-size slide

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

    View full-size slide

  107. @fnando
    ATUALIZE SEU
    APLICATIVO
    AGORA MESMO.

    View full-size slide

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

    View full-size slide

  109. @fnando
    SE VOCÊ USA
    SOFTWARE
    DESATUALIZADO,
    ASSUME O RISCO
    DE SER INVADIDO.

    View full-size slide

  110. @fnando
    MINIMIZE O DANO
    E SIGA O
    PRINCÍPIO DE
    MENOR
    PRIVILÉGIO.

    View full-size slide

  111. @fnando
    VOCÊ NÃO
    PRECISA DE UM
    USUÁRIO SUDOER
    PARA O DEPLOY.

    View full-size slide

  112. @fnando
    ACEITE
    AUTENTICAÇÃO
    APENAS POR SSH.

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  115. @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

    View full-size slide

  116. @fnando
    CONTRATE UM
    SYSADMIN
    EXPERIENTE.

    View full-size slide

  117. @fnando
    FINALIZANDO

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide