Explorar Vulnerabilidades de Injeção SQL no Nmap

Beginner

Introdução

Neste laboratório, você aprenderá sobre injeção SQL (SQL injection), uma técnica utilizada por atacantes para explorar vulnerabilidades em aplicações web que interagem com bancos de dados. Ataques de injeção SQL podem permitir acesso não autorizado a dados sensíveis, manipulação de dados e até mesmo a comprometimento completo do sistema.

O objetivo deste laboratório é obter experiência prática com injeção SQL, explorando vulnerabilidades em uma aplicação web vulnerável. Você aprenderá como identificar potenciais vulnerabilidades de injeção SQL, criar consultas SQL maliciosas e extrair informações sensíveis do banco de dados. Além disso, você aprenderá sobre mecanismos de defesa e melhores práticas para mitigar ataques de injeção SQL.

Configurar o Ambiente do Laboratório

Nesta etapa, você configurará o ambiente do laboratório, que inclui uma aplicação web vulnerável e um servidor de banco de dados.

  1. Abra o terminal e navegue até o diretório /home/labex/project.

    cd /home/labex/project
  2. Existem dois arquivos Python no diretório project: app.py e setup_db.py. O arquivo app.py contém o código-fonte da aplicação web vulnerável, e o arquivo setup_db.py contém o código para configurar o banco de dados.

  3. Execute o script setup_db.py para criar o banco de dados e preenchê-lo com dados de exemplo.

    python3 setup_db.py
  4. Inicie o servidor da aplicação web.

    python3 app.py

Você deve ver uma mensagem indicando que o servidor está rodando em http://localhost:5000.

Identificar Vulnerabilidades de Injeção SQL

Nesta etapa, você aprenderá como identificar potenciais vulnerabilidades de injeção SQL na aplicação web.

  1. Abra um navegador web e navegue até http://localhost:5000.
    Página inicial da aplicação web
  2. Procure por campos de entrada onde os dados do usuário são enviados ao servidor, como caixas de pesquisa.
  3. Tente inserir caracteres especiais ou palavras-chave SQL (por exemplo, ', ", --, ;) nos campos de entrada e observe o comportamento da aplicação.
  4. Se a aplicação exibir mensagens de erro ou se comportar de forma inesperada, isso pode indicar uma potencial vulnerabilidade de injeção SQL.
    Teste de entrada na caixa de pesquisa
    Quando você insere uma aspa simples (') na caixa de pesquisa e clica no botão "Pesquisar", a aplicação apenas exibe Nenhum resultado encontrado sem nenhuma mensagem de erro. Este comportamento sugere que a aplicação pode ser vulnerável à injeção SQL.

Explorar Vulnerabilidades de Injeção SQL

Nesta etapa, você aprenderá como explorar as vulnerabilidades de injeção SQL identificadas para extrair informações sensíveis do banco de dados.

  1. Localize o campo de entrada ou parâmetro vulnerável identificado na etapa anterior.

  2. Tente inserir diferentes payloads de injeção SQL no campo de entrada ou parâmetro.

  3. Tente extrair informações sensíveis do banco de dados usando payloads de injeção SQL. Por exemplo, você pode usar o seguinte payload para extrair dados do banco de dados:

    ' UNION SELECT username, password FROM users --

    O payload acima pode ser usado para recuperar os nomes de usuário e senhas da tabela users no banco de dados.

  4. Observe a resposta da aplicação e procure por quaisquer informações sensíveis sendo exibidas ou erros que possam revelar informações sobre a estrutura ou conteúdo do banco de dados.

Mitigar Vulnerabilidades de Injeção SQL

Nesta etapa, você aprenderá sobre mecanismos de defesa e as melhores práticas para mitigar vulnerabilidades de injeção SQL.

  1. Revise o código-fonte da aplicação web vulnerável e identifique as áreas onde a entrada do usuário é usada em consultas ao banco de dados sem a devida sanitização.

  2. Implemente técnicas de validação e sanitização de entrada, como:

    • Consultas parametrizadas ou prepared statements (declarações preparadas)
    • Validação e sanitização de entrada (por exemplo, remoção ou escaping de caracteres especiais)
    • Princípio do menor privilégio para contas de banco de dados
  3. Atualize o código da aplicação para usar consultas parametrizadas ou prepared statements ao executar consultas ao banco de dados com entrada do usuário.
    Modifique o arquivo app.py de:

    sql_query = "SELECT username, password FROM users WHERE username LIKE '%{}%' OR '{}'".format(query, query)
    cur.execute(sql_query)

    para:

    sql_query = "SELECT username, password FROM users WHERE username LIKE ?"
    cur.execute(sql_query, ('%' + query + '%',))

    E mova results = cur.fetchall() para baixo da linha logging.info(f"Search query: {query}").

    logging.info(f"Search query: {query}")
    
    results = cur.fetchall()
  4. Após as alterações acima, salve o arquivo e reinicie o servidor da aplicação web.

    Use ctrl+c para parar o servidor e, em seguida, inicie-o novamente usando:

    python3 app.py
  5. Teste a aplicação atualizada para garantir que ataques de injeção SQL não sejam mais possíveis.

Resumo

Neste laboratório, você aprendeu sobre injeção SQL, uma técnica usada por invasores para explorar vulnerabilidades em aplicações web que interagem com bancos de dados. Você configurou uma aplicação web vulnerável e um servidor de banco de dados, identificou potenciais vulnerabilidades de injeção SQL e as explorou para extrair informações sensíveis do banco de dados. Além disso, você aprendeu sobre mecanismos de defesa e as melhores práticas para mitigar ataques de injeção SQL, como validação de entrada, sanitização e o uso de consultas parametrizadas ou prepared statements (declarações preparadas).

Através desta experiência prática, você adquiriu uma compreensão mais profunda dos ataques de injeção SQL e como preveni-los em aplicações web. Você também aprendeu a importância das práticas de codificação segura e as potenciais consequências de não sanitizar adequadamente a entrada do usuário ao interagir com bancos de dados.