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.
Abra o terminal e navegue até o diretório
/home/labex/project.cd /home/labex/projectExistem dois arquivos Python no diretório
project:app.pyesetup_db.py. O arquivoapp.pycontém o código-fonte da aplicação web vulnerável, e o arquivosetup_db.pycontém o código para configurar o banco de dados.Execute o script
setup_db.pypara criar o banco de dados e preenchê-lo com dados de exemplo.python3 setup_db.pyInicie 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.
- Abra um navegador web e navegue até
http://localhost:5000.
- Procure por campos de entrada onde os dados do usuário são enviados ao servidor, como caixas de pesquisa.
- Tente inserir caracteres especiais ou palavras-chave SQL (por exemplo,
',",--,;) nos campos de entrada e observe o comportamento da aplicação. - Se a aplicação exibir mensagens de erro ou se comportar de forma inesperada, isso pode indicar uma potencial vulnerabilidade de injeção SQL.
Quando você insere uma aspa simples (') na caixa de pesquisa e clica no botão "Pesquisar", a aplicação apenas exibeNenhum resultado encontradosem 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.
Localize o campo de entrada ou parâmetro vulnerável identificado na etapa anterior.
Tente inserir diferentes payloads de injeção SQL no campo de entrada ou parâmetro.
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
usersno banco de dados.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.
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.
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
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.pyde: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 linhalogging.info(f"Search query: {query}").logging.info(f"Search query: {query}") results = cur.fetchall()Após as alterações acima, salve o arquivo e reinicie o servidor da aplicação web.
Use
ctrl+cpara parar o servidor e, em seguida, inicie-o novamente usando:python3 app.pyTeste 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.