45
SQL Injection SQL Injection Càpsula I Arxius i Bases de Dades 2008-2009 Albert Prior [[email protected]]

3P- SQL Injection

  • Upload
    jreca

  • View
    37

  • Download
    6

Embed Size (px)

DESCRIPTION

Seminario sobre SQL Injection (iniciación)

Citation preview

Page 1: 3P- SQL Injection

SQL InjectionSQL InjectionCàpsula I

Arxius i Bases de Dades 2008-2009 Albert Prior [[email protected]]

Page 2: 3P- SQL Injection

Arxius i Bases de Dades – Càpsula 2 – SQL Injection

Í dÍndex1. Objectiu del Seminari

2. Concepte de Injecció SQL

3. Abast de la Injecció SQL

4. Escenaris Vulnerables4.1. Primer Cas: Autenticació d’Usuari4.2. Segon Cas: Deducció de Dades4.3. Tercer Cas: Eliminació de Informació4.4. Quart Cas: Diccionari de Dades i Servidor

5. Protecció vers l’usuari5 1 Teoria5.1. Teoria5.2. Exemples

6. Exercici pràcticp

7. Bibliografia recomanada

Pàgina 2 de 45

Page 3: 3P- SQL Injection

1 Obj i d l S i i1. Objectiu del SeminariA. Presentar el concepte de Injecció de SQL i les tècniques més freqüents.

B. Introduir les diferents vulnerabilitats que alguns sistemes gestors presenten.

C. Exposar com evitar que aquesta tècnica sigui efectiva.

D. Es pretén donar informació suficient a l’alumne per a que entengui el problema ipugui defendre més eficientment les seves pròpies aplicacions.

E. Cerquem donar instrucció sobre els mètodes que poden ser emprats per aaprofitar se d’una pàgina web que es vulnerable a les tècniques comentades iaprofitar-se d’una pàgina web que es vulnerable a les tècniques comentades, iaclarir quins mecanismes hauran de ser imposats al codi per a garantir unaprotecció de la informació i la validació al nostre site.

Òbviament, donem una visió superficial donat que no podem particularitzar sobretots els sistemes gestors i les seves plataformes de creixement. Nosaltres enslimitarem a posar diferents exemples típics per a exposar la problemàtica i a detallarmecanismes estereotipats per solucionar-la. En cas de voler considerar-ho esrecomana formació en l’entorn de desenvolupament pertinent.

Pàgina 3 de 45

Page 4: 3P- SQL Injection

2 C t d I j ió SQL2. Concepte de Injecció SQL● També anomenada “SQL Injection”.

● Tècnica d’explotació d’aplicacions web que empra informació subministradal li t d f i d’i f ió lid i d’ ipel client de cara a confeccionar cerques d’informació o validacions d’usuari.

● Pertany al tipus d’atacs de validació d’entrades d’usuari.

● Així, es basa en la introducció de caràcters o cadenes de caràcterspotencialment perilloses que ens permetran aprofitar la cerca resultant per aobtenir directa o indirectament qualsevol tipus de informació que, altrament, noestaria al nostre abast. També podem realitzar accions perilloses quecomprenen des de l’esborrat de taules fins l’apoderament dels serveis delservidor.

● Es troba en un nombre elevat d’aplicacions web i té un potencial grandíssim,per la tipicitat de les eines emprades per a instaurar sites web i l’ampli

i t d l’ i d’ t i ll i tconeixement de l’usuari d’aquestes, a nivell intern.

● Entenem per eines típiques: PhpNuke, PhpBB, Moodle, Drupal,...

Pàgina 4 de 45

Page 5: 3P- SQL Injection

2 C ó SQ2. Concepte de Injecció SQL● Aquests atacs són possibles arrel de les característiques del mateixllenguatge SQL, donat que ens és possible sabotejar les consultes:

Inserint comentaris en les sentències SQLo Inserint comentaris en les sentències SQL.o Inserint més d’una sentència SQL a l’execució.

● Qualsevol Sistema Gestor de Bases de Dades és sensible a aquest tipus● Qualsevol Sistema Gestor de Bases de Dades és sensible a aquest tipusd’atacs a través de les seves aplicacions client, si bé diferents plataformes dedesenvolupament disposen de diferents nivells de seguretat.

● Per aquesta mateixa raó, definirem la metodologia d’atac i les eines deprotecció de manera genèrica, concretant en alguns punts de quin sistemagestor es tracte.gesto es t acte

● És important recordar que molts sistemes gestors de bases de dades podenser accedits emprant diferents codis, com per exemple C#, ASP, PHP, .NET,etcètera.

Pàgina 5 de 45

Page 6: 3P- SQL Injection

3 Ab t d l I j ió SQL3. Abast de la Injecció SQL

● Una injecció de codi SQL ben feta pot realitzar:

o Autenticació en webs de les quals no disposemprivilegis.

o Deducció de l’estructura de dades de la base de dadesde la web.

o Selecció, Inserció, Modificació o Esborrat de informaciódel sistema gestor.g

o Execució de comandes de sistema operatiu que afectina la base de dades o al servidor que la manté en líniaa la base de dades o al servidor que la manté en línia.

Pàgina 6 de 45

Page 7: 3P- SQL Injection

4 E i V l bl4. Escenaris Vulnerables

● Tot seguit es realitzarà l’explicació de quatre escenarisvulnerables, per a que vegeu una aplicació tangible delproblema que tenim entre mans al dissenyar aplicacionsque es connectin amb sistemes gestors de bases ded ddades.

● Plantejarem quatre casos:1. Primer Cas: Autenticació d’Usuari2. Segon Cas: Deducció de Dades3. Tercer Cas: Eliminació de Informació4. Quart Cas: Diccionari de Dades i Servidor

Pàgina 7 de 45

Page 8: 3P- SQL Injection

4 1 C 1 A t ti ió D’U i4.1. Cas 1: Autenticació D’Usuari● Imaginem una aplicació que permet l’accés a una sèrie de dades demanant,

per exemple, un identificador o una password.

A t ’i t d i à i t t d l’ i ( l l t f )● Aquesta s’introduirà en un registre per part de l’usuari (segons la plataforma)i nosaltres emmagatzemarem aquest valor per a inserir-lo en una cerca deSQL.

● Per tant serà aquest camp la porta d’entrada en la que podrem aplicarInjecció de SQL per a intentar vulnerar la seguretat del site.

● Si la sentència estigues definida en ASP:

var SQL= " SELECT * FROM Usuari WHERE password= '"+password+"' " ;

● Típicament, un usuari introduiria la clau i aquesta seria comparada viaaquesta sentència. Per exemple, introduint la password administrador, laquery quedaria de la següent manera:

var SQL= " SELECT * FROM Usuari WHERE password= 'administrador' " ;

Pàgina 8 de 45

Page 9: 3P- SQL Injection

4 1 C 1 A t ti ió D’U i4.1. Cas 1: Autenticació D’Usuari● En cas de no coincidir el resultat no tindria cap fila i li denegaríem el servei.

Tanmateix imaginem que el usuari introdueix ‘OR ‘1’=’1. En aquest cas laconsulta prendria la forma següent:p g

var SQL= " SELECT * FROM Usuari WHERE password= '' OR '1'='1 ' " ;

● Per tant existiria un resultat i se li permetria l’accés, segons el sistemad’autenticació establert, donat que compliria la condició de selecció.

● En cas que descobríssim que la query de validació és força més extensa itractem amb un cas similar a aquest, per exemple:

var SQL= " SELECT * FROM Usuari WHERE login= '"+login+"' AND pin= '"+numpin+"' AND puck= '"+numpuck+"' " ;

● Veuríem que tampoc ens ha d’importar, donat que sent una mica més refinatsamb la inserció de la dada podríem afegir al login, per exemple, ‘OR 1=1; -- .

Pàgina 9 de 45

Page 10: 3P- SQL Injection

4 1 C 1 A t ti ió D’U i4.1. Cas 1: Autenticació D’Usuari● Això resultaria en aquesta query:

var SQL= " SELECT * FROM Usuari WHERE login= '' OR 1=1 --

● En resum, aconseguim validar la cerca afegint una condició que sempre serà

AND pin= '"+numpin+"' AND puck= '"+numpuck+"' " ;

, g g q pcerta, podent obligar al intèrpret de comandes de SQL a ometre el resta de lasentència al introduir un caràcter perillós: en aquest cas el de “comentari” (--).

T bé d à l’ i LIKE t t i ll d lid ió●També es podrà emprar l’eina LIKE tant a nivell de validació com per amostrar informació resident a la base de dades, si en coneixem l’estructura.Conèixer l’estructura d’una base de dades és possible emprant SQL Injection,

j é d tcom ja veurem més endavant.

● Així, si partim d’una query típica de validació com podria ser:

var SQL= " SELECT * FROM Usuari WHERE login= '"+login+"' AND password= '"+password+"' " ;

Pàgina 10 de 45

Page 11: 3P- SQL Injection

4 1 C 1 A t ti ió D’U i4.1. Cas 1: Autenticació D’Usuari● Podríem emprar l’eina LIKE per, per exemple, dues finalitats:

o Per autenticar-nos: Introduint a login el que volguem i a password ‘ ORg q g ppassword LIKE ‘% . La query resultant seria:

var SQL= " SELECT * FROM Usuari WHERE login= 'elquevolguem‘

P t i f ió d l b d d d Af i t t

Q g q gAND password= ' ' OR password LIKE '% ' " ;

oPer mostrar informació de la base de dades: Afegint aquest cop apassword ‘ ; SELECT * FROM Usuari WHERE password LIKE ‘% . Laquery resultant seria:

var SQL= " SELECT * FROM Usuari WHERE login= 'elquevolguem‘AND password= '';SELECT * FROM Usuari WHERE password LIKE '% ' " ;SELECT * FROM Usuari WHERE password LIKE % ;

Pàgina 11 de 45

Page 12: 3P- SQL Injection

4 2 C 2 D d ió d D d4.2. Cas 2: Deducció de Dades● Per a realitzar una Injecció de SQL efectiva caldrà que coneixem el

llenguatge d’accés i, sobretot, el tipus de sistema gestor on estanemmagatzemades les dades. Típicament, si no s’ha controlat el mostratged’errors, és relativament fàcil esbrinar aquest últim detall. A més a més podemesbrinar informació que ni esperàvem trobar. Suposem el codi ASP següent:

var SQL= " SELECT * FROM Usuari WHERE login= '"+login+"' AND password= '"+password+"' " ;

● Si afegim al camp login: ‘ having 1=1 -- o codis més senzills com ‘ () , si noestan ben filtrats, podem provocar errors.

o Si tractéssim amb MySQL per exemple l’error mostra el PHP defectuós io Si tractéssim amb MySQL, per exemple, l error mostra el PHP defectuós ila seva ruta, a més d’explicitar que es tracta d’un sistema MySQL:

Warning: mysql num rows(): supplied argument is not a valid MySQLWarning: mysql_num_rows(): supplied argument is not a valid MySQLresult resource in ruta_de_la_web_on_resideix_php/nom_del_php.phpon line XX

Pàgina 12 de 45

Page 13: 3P- SQL Injection

4 2 C 2 D d ió d D d4.2. Cas 2: Deducció de Dadeso Considerant el cas que ens ocupa, trobarem moltíssima més informació:

parlem del sistema gestor on trobem les dades, el ASP on s’origina l’errori, el que és pitjor, per quin camp es dona:, q p j , p q p

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'Usuari.id' is invalid in the select list because it is not contained in anaggregate function and there is no GROUP BY clause.

/process_login.asp, line 35

o Tenint aquestes dades, podem provar de vulnerar el sistema de nouposant a login ' group by Usuari.id having 1=1-- :posant a login group by Usuari.id having 1 1 :

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]Column'Usuari.login' is invalid in the select list because it is notcontained in either an aggregate function or the GROUP BY clause.

/process_login.asp, line 35

Pàgina 13 de 45

Page 14: 3P- SQL Injection

4 2 C 2 D d ió d D dJ t i é d d ! Ai ò h d í f t i t A é é t bé

4.2. Cas 2: Deducció de Dadeso Ja tenim més dades! Això ho podríem anar fent successivament. A més a més també ens

pot interessar esbrinar el tipus de dades concret de cada camp. Només caldria afegir alcamp login: ' union select sum(login) from Usuaris --

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or averageaggregate operation cannot take a varchar data type as an

A j b t t d’ VARCHAR T bé d t i

argument.

/process_login.asp, line 35

o Ara ja sabem que es tracte d’un VARCHAR. També podem emprar aquests mecanismesper a descobrir informació del sistema gestor concret. Com fer-ho? Doncs afegint al camplogin: ' union select @@version,1,1,1--

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 2000 -8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build2195: Service Pack 2) ' to a column of data type int.

/ l i li 35/process_login.asp, line 35

- 13 -

Page 15: 3P- SQL Injection

4 2 C 2 D d ió d D d4.2. Cas 2: Deducció de Dades● El procés de deducció de dades pot ser, altrament, molt més laboriós.

● Per a qui es vulgui documentar també existeixen moltes maneres de deduirinformació alternativesinformació alternatives.

o Per exemple, via l’eina EXIST de SQL, donat que només ens tornaràCERT si la query existeix i, per tant, si cerquem existències de noms deCERT si la query existeix i, per tant, si cerquem existències de noms detaules o camps, en cas de funcionar la consulta, implicarà que aquests estroben a la base de dades.

Gràfic de la Deducció de Dades:

1. Fem SQL Injection2. Rebem informació aliena.3 Disposem de la llista de claus3. Disposem de la llista de claus.

Pàgina 15 de 45

Page 16: 3P- SQL Injection

4 3 C 3 Eli i ió d l i f ióR l tè i l t j d i i i l t

4.3. Cas 3: Eliminació de la informació● Recuperem la sentència plantejada inicialment:

var SQL= " SELECT * FROM Usuari WHERE password= '"+password+"' " ;

• Imaginem que l’usuari que pretén vulnerar el nostre sistema coneix el nomd’algunes taules (emprant alternatives presentades anteriorment de maneraintel·ligent) i ara intenta esborrar informació d’alguna manera. Aprofitant lesvulnerabilitats abans definides veurem que podria introduir al camp passwordla sintaxi ‘ ; DROP TABLE Usuaris; -- . La sentència que es realitza des de laconta seria:

var SQL= " SELECT * FROM Usuari WHERE password= '' ;

• Així aconseguiria esborrar informació, fet que, en cas de no disposar d’unaò i d t t t b l t t d t ó i lt tó

DROP TABLE Usuari; -- ' " ;

còpia de seguretat, pot ser absolutament desastrós i molt costóseconòmicament.

Pàgina 16 de 45

Page 17: 3P- SQL Injection

4 4 C 4 DD i S id4.4. Cas 4: DD i Servidor● Via la injecció de SQL podem intentar esbrinar informació sobre el diccionari

de dades, és a dir, sobre el nom de les taules del nostre sistema gestor i elscamps que les composen.p q p

● Partim del mateix exemple que abans, és a dir:

var SQL= " SELECT * FROM Usuari WHERE password '"+password+"' " ;

● Emprant l’eina UNION, podrem concatenar diferents queries intentantesbrinar la informació que ens és d’interès Com hem dit abans l’atac

var SQL= " SELECT * FROM Usuari WHERE password= '"+password+"' " ;

esbrinar la informació que ens és d interès. Com hem dit abans l atacdependrà del sistema gestor emprat. Per exemple, en SQL Server afegiríemal camp password: ' UNION SELECT id,name FROM sysobjects WHERExtype='U';xtype='U'; --

var SQL= " SELECT * FROM Usuari WHERE password= ' ' UNION SELECT id,name FROM sysobjects WHERE xtype='U'; -- ' " ;

● On estem cercant el identificador (enter) i nom (name) de les taules.

id,name FROM sysobjects WHERE xtype U ; ;

Pàgina 17 de 45

Page 18: 3P- SQL Injection

4 4 C 4 DD i S id4.4. Cas 4: DD i Servidor● Considerar que cerquem depèn de la lletra que fem constar a xtype

si xtype = ‘C’ -- restriccions si xtype = ‘D’ -- valors per defectesi xtype = ‘F’ -- foreign keys si xtype = ‘PK’ -- primary keyssi xtype = ‘V’ -- vistes si xtype = ‘X’ -- procediments guardats

● Si en canvi poséssim ' UNION SELECT name FROM syscolumns WHEREid= valor_enter ; -- :

C d t ib t i b l id tifi d d t l

var SQL= " SELECT * FROM Usuari WHERE password= ' ' UNION SELECT name FROM syscolumns WHERE id=valor_enter; -- ' " ;

● Cercarem noms de atributs que corresponguin amb el identificador de taula.

● Com veurem, disposant de la informació del diccionari de dades, podrem fertota consulta que ens interessi, únicament limitats pels permisos dels quetota consulta que ens interessi, únicament limitats pels permisos dels quedisposem des de la conta en la que estem realitzant Injecció SQL.

Pàgina 18 de 45

Page 19: 3P- SQL Injection

4 4 C 4 DD i S id4.4. Cas 4: DD i Servidor● Disposant de privilegis d’administrador podem aplicar procediments que ens

permetin aplicar comandes de creació i manipulació d’objectes i fins i totpodrem executar directament comandes del sistema sobre el servidor on esptroba la base de dades, fent, per exemple:

var SQL= " SELECT * FROM Usuari WHERE password= ' ' ; EXEC

● Indiquem que volem parar el sistema gestor de bases de dades i, a més, no

xp_cmdshell 'net stop sqlserver', no_output -- ' " ;

volem rebre cap resposta del sistema (no output). Altrament,

var SQL= " SELECT * FROM Usuari WHERE password= ' ' ; EXEC

● Indiquem via una instrucció directa al sistema operatiu, que volem parar el

master.dbo.xp_cmdshell ‘cmd.exe shutdown' -- ' " ;

servidor que suporta el sistema gestor de bases de dades.

Pàgina 19 de 45

Page 20: 3P- SQL Injection

5 1 P t ió l’ i T i5.1. Protecció vers l’usuari: Teoria● És important que respectem una sèrie de principis que són clau a l’hora

d’evitar que usuaris malintencionats vulnerin la seguretat de la nostraaplicació:p

1. No hem de confiar en la bona fe de l’usuari: per tant, cal que fitem almàxim les possibilitats d’inserció de dades de les que disposa el client deà es poss b tats d se c ó de dades de es que d sposa e c e t del’aplicació i que controlem tota la informació que aquest afegeix, filtrant-lade ser necessari.

C l it li i à t i l t l I j ió d SQLo Cal evitar o eliminar caràcters involucrats en la Injecció de SQL:- Delimitador de consultes ( ; ).- Delimitador de cadenes de caràcters ( ‘ ).

D li it d d t i ( # /* */ )- Delimitador de comentaris ( -- , # , /* ... */ )- Informació associada a sistema (sys, xp_)

o Cal protegir les instruccions de cerca de models coincidents.p go Cal verificar la mida i el tipus de les dades.o Cal emprar preferiblement desplegables, checkboxes i altres eines

d’acció definida.d acc ó de da

Pàgina 20 de 45

Page 21: 3P- SQL Injection

5 1 P t ió l’ i T i5.1. Protecció vers l’usuari: Teoria2. Cal que evitem construir sentències SQL dinàmicament o, en cas de

fer-ho, aplicar eines restrictives que no permetin al usuari malintencionatsobrecarregar les queries.g q

o Emprar instruccions SQL amb paràmetres.o Emprar instruccions SQL via procediments emmagatzemats.

3. No emprar privilegis d’administrador en cap moment ni revelar-los ala conta a la que els usuaris poden tenir accés legitima o il·legítimament.

P l t d’ é d’ i ti i i il i í io Procurar que les contes d’accés d’usuari tinguin privilegis mínims.o Evitar unir l’accés d’usuari i el d’administrador en un únic punt.

4. Restringir els paràmetres emprats públicament, donat que esdevenen4. Restringir els paràmetres emprats públicament, donat que esdevenennous camps que poden ser emprats per a realitzar Injecció SQL. Perexemple, a PHP és freqüent veure el pas de paràmetres a la barra dedireccions permetent realitzar injecció directament sobre la rutadireccions, permetent realitzar injecció directament sobre la ruta.

o Verificar també aquest tipus d’entrades.o Protegir tant el nivell de presentació com la resta de nivells d’aplicació.

Pàgina 21 de 45

Page 22: 3P- SQL Injection

5 1 P t ió l’ i T i5.1. Protecció vers l’usuari: Teoria5. Proporcionar només aquella informació que sigui necessària,

generalitzant al màxim per intentar no donar dades al usuari.

Per exemple en cas que l’usuari falli a l’hora d’inserir el “login” i elo Per exemple, en cas que l usuari falli a l hora d inserir el login i el“password” és recomanable advertir-lo que no s’ha autenticatcorrectament, però no cal especificar-li quin dels camps és incorrecte.

o Evitar mostrar a l’usuari missatges d’error directes del sistema gestorde bases de dades, donat que augmenten el coneixement de comrealitzar SQL Injection.j

o Els errors hauran de ser loguejats per a que els administradors elspuguin consultar i, en cas de ser necessari, arreglar-los, però no calque l’usuari hi tingui accésque l usuari hi tingui accés.

● Tots els llenguatges d’accés permeten Injecció SQL si se’n fa un mal ús.

●Recordem que podem emprar: PHP, ASP, Java, Perl, C (i variants), etc.

Pàgina 22 de 45

Page 23: 3P- SQL Injection

5 1 P t ió l’ i T i5.1. Protecció vers l’usuari: Teoria● A nivell general, si fem un cop d’ull a la seguretat dels Sistemes Gestors de

Bases de Dades actuals:

DB2 i Oracle - No permet execució de sentències múltiples- Es poden aniuar consultes de selecció.- Es poden emprar UNIONs.p p- Es poden executar procediments emmagatzemats.

MySQL - S’executa amb privilegis de root per defecte.- Execució de sentències múltiples poc probable(s’ha d’activar expressament).

Postgres - Es permet execució de sentències múltiples- Es poden aniuar consultes de selecció.

Es poden emprar UNIONs- Es poden emprar UNIONs.- Es poden executar procediments emmagatzemats.- Permet ús de COPY com a superusuari.

MS SQL Server - Es permet execució de sentències múltiplesMS SQL Server Es permet execució de sentències múltiples- Es poden aniuar consultes de selecció.- Es poden emprar UNIONs.- Es poden executar procediments emmagatzemats(molta cura amb xp_cmdshell)

Pàgina 23 de 45

Page 24: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exemples● SQL Server i Oracle: Disposem, per exemple, del llenguatge de

programació ADO.NET i les eines SqlCommand (per SQL Server) oOracleCommand (per Oracle). Aquí desenvolupem el codi en Visual Basic.(p ) q p

o Si nosaltres programem de la següent manera:

'Recuperem CustomerID per posteriorment cercarDim ID As String = TextBox1.Text

'Aquesta línia permet atacs via Injecció de SQLDim query As String = _

"SELECT * FROM dbo.Orders WHERE CustomerID = '" & ID & "';“

'Codi de connexió a dades ha sigue omés per guanyar brevetatDim cmd As SqlCommand = New SqlCommand(query, connection)Dim reader As SqlDataReader = cmd.ExecuteReader()reader.Close()

Pàgina 24 de 45

Page 25: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exempleso El usuari pot realitzar Injecció de SQL en el punt vulnerable. La manera

d’evitar-ho és:

'Recuperem CustomerID per posteriorment cercarDim ID As String = TextBox1.Text

Dim query As StringDim query As String = _ "SELECT * FROM Orders WHERE CustomerID = @CustomerID“

Dim cmd As SqlCommand = New SqlCommand(query, conn)cmd.Parameters.Add("@CustomerID", SqlDbType.VarChar, 5).Value = ID

'Codi de connexió a dades ha sigut omés per guanyar brevetatDim reader As SqlDataReader = cmd.ExecuteReader()'

'Resultats del procésreader.Close()

Pàgina 25 de 45

Page 26: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exempleso També podem realitzar filtratge de caràcters perillosos (com ‘ o “):

Private Function SafeSqlLiteral(_ByVal inputSQL As String) As StringReturn inputSQL.Replace("'", "''")

End Function'...Dim safeSQL As String = SafeSqlLiteral(Login.Text)Dim myCommand As SqlDataAdapter = _New SqlDataAdapter("SELECT au_lname, au_fname " & _ "FROM authors WHERE au_id = '" & safeSQL & "'", _ myConnection)

o O podem optar per filtratge de cerques de models coincidents (LIKE %)

Private Function SafeSqlLikeClauseLiteral( _ByVal inputSQL As String) As String

Dim s As String = inputSQLs = inputSQL.Replace("'", "''") s = s.Replace("[", "[[]") s = s.Replace("%", "[%]") s = s.Replace("_", "[_]") Return s

End Function

Pàgina 26 de 45

Page 27: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exemples● MySQL i PHP: l’accés es sol realitzar amb privilegis de root per defecte,

però l’execució de sentències múltiples és molt poc probable (s’ha de validarexpressament aquesta opció via alternatives com comandes sqli):p q p q )

o Emprar l’eina “Magic Quotes”: es tracta d’una variable que es troba alfitxer de configuració de PHP (típicament php.ini). Típicament activadaper defecte, tota entrada que disposi de cometes simples o altrescaràcters conflictius ((\x00, \n, \r, \, ‘, “, \x1a) patirà l’addició decontrabarres davant de cadascuna.

- Emprant la funció “addslashes” realitzarem el mateix efecte.p a t a u c ó adds as es ea t a e e ate e ecte- ‘ OR ‘1’=’1 esdevindrà \’ OR \’1\’=\’1- La funció inversa a “addslashes” és “stripslashes”- Tanmateix presenta problemes i no és del tot aconsellable el seu úsTanmateix presenta problemes i no és del tot aconsellable el seu úsdonat que pot portar problemes de mala gestió de les barres.

Pàgina 27 de 45

Page 28: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exempleso Emprar sempre eines que no mostrin informació, com POST en

comptes de GET (sinó es mostraran camps i valors introduïts a barra dedireccions). És una gran vulnerabilitat més.direccions). És una gran vulnerabilitat més.

o Emprar el caràcter “@” abans de les funcions. Aquest mètodeemmascara els errors i no els mostra, evitant donant informació sobre elemmascara els errors i no els mostra, evitant donant informació sobre elsistema gestor a l’usuari per a que aquest intenti realitzar Injecció SQL.

o Delimitar els valors de les consultes. Aquest recurs pot ser considerato Delimitar els valors de les consultes. Aquest recurs pot ser consideratde cara a qualsevol altre sistema gestor (i la seva conseqüent eina dedesenvolupament). Per exemple, si el valor és enter i no el delimitemamb cometes el farem molt més vulnerable amb el que delimitar-loamb cometes el farem molt més vulnerable, amb el que delimitar loigualment és més prudent.

G l t SELECT FROM t bl WHERE id $idGeneralment SELECT user FROM table WHERE iduser= $id ; Millor si SELECT user FROM table WHERE iduser= '$id‘ ;

Pàgina 28 de 45

Page 29: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: ExemplesoEmprar la instrucció “mysql_real_escape_string($cadena)”

- Evita tots els caràcters especials que contingui l’argument de cara al ió d “ l ”assegurar la seva execució per part de “mysql_query”.

- Retorna una cadena amb barres sobre tot caràcter perillós.- No modifica la variable original d’entrada.

o De fet, la funció 'mysql_real_escape_string' realitza la mateixa funcióque 'magic_quotes' amb un grau més de seguretat. D’aquesta manera, iper no exercir ambdós controls de seguretat indirectament, afegint perdues vegades contrabarres, es preferible comprovar si s’ha aplicatmagic_quotes primer (i de ser així, desfer-lo via stripslashes) i,posteriorment, aplicar la funció que comentem en aquest punt.

if(get_magic_quotes_gpc() != 0) {$cadena = stripslashes($cadena);

}mysql_real_escape_string($cadena);

Pàgina 29 de 45

Page 30: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exempleso Verificació de dades introduïdes per l’usuari:

- Emprar instrucció “is_int()” si esperem enter.Emprar instrucció “is long()” si esperem long- Emprar instrucció is_long() si esperem long.

- Emprar instrucció “gettype()” si esperem char, varchar o altre tipus.- Convertir dada a enter via “intval()”.

Convertir dada a qualsevol tipus via “settype()”- Convertir dada a qualsevol tipus via “settype()”- Comprovar les longituds de les cadenes via “strlen()”.- Comprovar el format de les cadenes via “strpos()”

o Per assegurar que la nul·la vulnerabilitat, es recomana reemplaçarparaules clau perilloses, tals com SELECT, DELETE, DROP, INSERT,etc a més de caràcters conflictius com l’eina de comentari (#) gràcies aletc. a més de caràcters conflictius com l eina de comentari (#) gràcies alinstrument ‘str_replace’. Per exemple:

$ #$ko= array("SELECT","INSERT","DROP","DELETE","UPDATE","#");$ok= array("\","\","\","\","\","\");$sql_segura= str_replace($ko,$ok,$sql);

Pàgina 30 de 45

Page 31: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exemples● Java: quan accedim a una base de dades emprant Java com a enllaç,

podem emprar la classe PreparedStatement:

E t do En comptes de:

Connection con = (acquire Connection) Statement stmt = con createStatement();Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';");

o Millor emprar preparedStatement precompilant sentència i desprésafegint elements dinàmics (via pstmt.setString, .setInt, etc).

Connection con = (acquire Connection) PreparedStatement pstmt = con.prepareStatement("SELECT * FROM usuarios WHERE nombre = ?"); pstmt.setString(1, nombreUsuario); ResultSet rset = pstmt.executeQuery();

Pàgina 31 de 45

Page 32: 3P- SQL Injection

5 2 P t ió l’ i E l5.2. Protecció vers l’usuari: Exemples● Solució general i definitiva:

o Codificar sense presses desconfiant de tota entrada d’usuari.

o Emprar classes i llibreries pròpies per a realitzar la captació i execucióde dades així com les connexions a bases de dades. Estalviareu temps,evitarem descuidar-nos de controlar i a més crearem una capae ta e descu da os de co t o a a és c ea e u a capad’abstracció molt poc vulnerable.

o No emprar noms típics en les estructures: res de taules “user”, “users”,t i d “id” “ ” “ ” tetc. i res de camps “id”, “pass”, “name”, etc.

o Emprar alternatives de programació ja desenvolupades, tals com elspaquets de dades PEAR, que esdevé una capa d’abstracció de dades dep q , q pque ens facilitarà molt la feina (http://pear.php.net/package/DB).

o Emprar auditories de codi manuals o automàtiques (via eines). Aquestesúltimes no suposen la panacea de la seguretat però son molt útils quanúltimes no suposen la panacea de la seguretat però son molt útils quanl’extensió del codi és desmesurada. Ajuden a detectar vulnerabilitatsfàcils d’identificar i errors lleugers de lògica. Exemples: Acunetix WebVulnerability Scanner NetcraftVulnerability Scanner, Netcraft

Pàgina 32 de 45

Page 33: 3P- SQL Injection

6 Exemple Pràctic6. Exemple PràcticA. PlantejamentA. Plantejament

● Partim del plantejament d’un exemple molt senzill per presentar un cas real (portat a l’extrem) del que suposaria una injecció SQL en el nostre sistema(portat a l extrem) del que suposaria una injecció SQL en el nostre sistema.

● Imaginem que definim una pàgina en llenguatge PHP que proporciona accés a na Agenda Personal emmagat emada en n sistema gestor M SQLuna Agenda Personal emmagatzemada en un sistema gestor MySQL.

● Caldrà que definim, primerament:

La base de dades a la que volem accedir.Un arxiu .PHP de connexió.Un arxiu PHP d’impressió de l’agendaUn arxiu .PHP d impressió de l agenda.Un arxiu .PHP per a realitzar les operacions de login.Un arxiu .PHP que permeti a l’usuari l’accés.

Pàgina 33 de 45

Page 34: 3P- SQL Injection

6 Exemple PràcticB. Creació de la base de dades

6. Exemple PràcticB. Creació de la base de dades# 1- Creació de la base de dades

CREATE DATABASE web;USE web;

# 2- Creació de taules (taula ‘Usuari’)# 2- Creació de taules (taula Usuari )

CREATE TABLE Usuari(ID_usuari INT NOT NULL AUTO_INCREMENT,username varchar(20) NOT NULL,password varchar(20) NOT NULL,CONSTRAINT pk_agenda PRIMARY KEY (ID_usuari) );

Pàgina 34 de 45

Page 35: 3P- SQL Injection

6 Exemple PràcticB. Creació de la base de dades

6. Exemple PràcticB. Creació de la base de dades# 2- Creació de taules (taula ‘Agenda’)

CREATE TABLE Agenda(ID_persona INT NOT NULL AUTO_INCREMENT,nom VARCHAR(25) NOT NULL,cognom VARCHAR(25) NOT NULLcognom VARCHAR(25) NOT NULL,telefon CHAR(9),email VARCHAR(25),CONSTRAINT pk_agenda PRIMARY KEY (ID_persona) );

# 3- Insercions

INSERT INTO Agenda(nom cognom telefon email) VALUESINSERT INTO Agenda(nom,cognom,telefon,email) VALUES ('Carlos','Perez','618123456','[email protected]'),('Albert','Martin','629123456','[email protected]'),('Juan','Rodriguez','626123456','[email protected]');

INSERT INTO Usuari(username,password) VALUES('admin','admin');

Pàgina 35 de 45

Page 36: 3P- SQL Injection

6 Exemple PràcticC. Arxius PHP: Connexió

6. Exemple PràcticC. Arxius PHP: Connexió<?

// Fitxer de connexió a Base de Dades$db_host="localhost"; // Host amb el que connectarem$db_nom="web"; // Nom de la base de dades a emprar$db user="root"; // Nom del usuari amb permisos$db_user= root ; // Nom del usuari amb permisos$db_pass="admin"; // Password del usuari amb permisos

// Realitzem una connexió a la que anomenem "link"$link = @mysql_connect($db_host, $db_user, $db_pass) or die ("Error de connexió a la base de dades!");

// Seleccionem la base de dades d'interès// Seleccionem la base de dades d interès@mysql_select_db($db_nom ,$link) or die("Error escollint la base de dades!");

?>

Pàgina 36 de 45

Page 37: 3P- SQL Injection

6 E l P à tiC Arxius PHP: Impressió de l’agenda

6. Exemple PràcticC. Arxius PHP: Impressió de l agenda<? // Afegim el include del arxiu de connexió// ginclude('connexio.inc.php');

function Imprimeix() {// Recuperem la variable de la conexió// Recuperem la variable de la conexióglobal $link; // Copiem la consulta en una variable (cadena)$sql = 'SELECT nom, cognom, telefon, email FROM Agenda';// Realitzem la consulta de la query emmagatzemada// Realitzem la consulta de la query emmagatzemada$result = mysql_query($sql) or die('La consulta següent té un error:<br>nSQL: <b>$sql</b>');// Tenim tot registre consultat a '$result'; 'fetch' avança per registreswhile ($row = mysql fetch array($result)) {while ($row mysql_fetch_array($result)) {

echo '<table border=1 cellspacing=0 width=200>';echo '<tr><th>'.$row[nom].' '.$row[cognom].'</th></tr>';echo '<tr><td>'.$row[email].'</td></tr>';echo '<tr><td>' $row[telefon] '</td></tr><br>';echo <tr><td> .$row[telefon]. </td></tr><br> ;

echo '</table>';}

} ?>

Pàgina 37 de 45

Page 38: 3P- SQL Injection

6 Exemple PràcticArxius i Bases de Dades – Càpsula 2 – SQL Injection

C. Arxius PHP: Operacions de Login

6. Exemple Pràcticp g

<? // Afegim el arxiu de connexió i impressiói l d ('i i i i h ')include('imprimeix.inc.php');

$user = $_POST[username];$pass = $_POST[password];$sql = "SELECT username FROM Usuari WHERE username='$user' AND password= '$pass'";$sql SELECT username FROM Usuari WHERE username $user AND password $pass ;$result = mysql_query($sql);$flag = mysql_num_rows($result);

// Millor codi inferior per no donar informació del SGBD (gràcies a l’@)// Millor codi inferior per no donar informació del SGBD (gràcies a l @)// $flag = @mysql_num_rows($result) or die("Error en la gestió de la consulta");// NOTA: No caldria ‘or die’ si usuari no registrat donaria missatge d’error.

if ($flag > 0){if ($flag > 0){echo '<b><u>ACCÉS APROVAT</u></b><br><br>BENVINGUT <b>'.$user.',</b><br>';echo '<br>Aquí et fem constar un resum de la nostra BBDD:<br><br>';Imprimeix();

}else{}else{echo '<b><u>ACCÉS DENEGAT</u></b><br><br>Prova-ho de nou <a href="http://localhost/login.php">aquí</a>';

};?>?>

Pàgina 38 de 45

Page 39: 3P- SQL Injection

6 Exemple PràcticArxius i Bases de Dades – Càpsula 2 – SQL Injection

C. Arxius PHP: Accés de l’usuari

6. Exemple Pràctic

<html><head>

<title>Benvingut a la pàgina de Login</title></head><style>

h1 {color:#000000; text-align:center; font-size: 15pt}h1 {color:#000000; text align:center; font size: 15pt}td {color:#000000; text-align:right; font-size: 12pt}

</style><body>

<h1>Accés Web</h1><form action="http://localhost/do_login.php" method="POST"><table style='border:1px solid #000000;' align='center'>

<tr><td> Usuari: <input type='text' name='username'/></tr>tr td Usuari: input type text name username / /tr<tr><td> Password: <input type='password'

name='password'/></tr><tr><td> <input type='submit' value='Accedeix!'/></tr>

/t bl</table></form>

</body></html>

Pàgina 39 de 45

Page 40: 3P- SQL Injection

6 Exemple PràcticD. Proves: Accés d’administrador

6. Exemple Pràctic

● Si el administrador desitja accedir a la web, i tecleja:- Usuari: admin- Clau: admin

● Veurem com accedeix amb èxit a la informació● Veurem com accedeix amb èxit a la informació.

Pàgina 40 de 45

Page 41: 3P- SQL Injection

6 Exemple PràcticD. Proves: Accés de visitant no permès

6. Exemple Pràcticp

● Si el visitant no permès desitja accedir a la web, i tecleja:- Usuari: visitant- Clau: qualsevolcosa

● Veurem com se li denega el servei tal com hauria de ser● Veurem com se li denega el servei, tal com hauria de ser.

Pàgina 41 de 45

Page 42: 3P- SQL Injection

6 Exemple PràcticD. Proves: Accés aplicant Injecció SQL

6. Exemple Pràcticp j Q

● Si el usuari malintencionat desitja aplicar Injecció SQL, i tecleja:- Usuari: sr_hacker- Clau: ‘ OR ‘1’=‘1

● Veurem com vulnera la seguretat de la web i accedeix a la informació● Veurem com vulnera la seguretat de la web i accedeix a la informació.

Pàgina 42 de 45

Page 43: 3P- SQL Injection

6 Exemple PràcticD. Proves: Intentant esbrinar informació (I)

6. Exemple Pràctic( )

● Si el usuari malintencionat desitja esbrinar informació del sistema gestor que empra la nostra web i tecleja:empra la nostra web, i tecleja:

- Usuari: ‘ having 1=1- Clau: (no cal posar-ne)

● Veurem com aconsegueix informació sobre quin sistema gestor empra la web aixícom dades sobre quin és el fitxer, funció i número de línia que falla.

Pàgina 43 de 45

Page 44: 3P- SQL Injection

6 Exemple PràcticD. Proves: Intentant esbrinar informació (II)

6. Exemple Pràctic( )

● Si el usuari malintencionat desitja esbrinar informació del sistema gestor que empra la nostra web i tecleja:empra la nostra web, i tecleja:

- Usuari: ‘ having 1=1- Clau: (no cal posar-ne)

● Veurem com no és capaç de captar informació donat que hem afegit una “@”davant de l’eina mysql_num_rows i, a més, l’eina or die li dona una altra informació.

Pàgina 44 de 45

Page 45: 3P- SQL Injection

Arxius i Bases de Dades – Càpsula 2 – SQL Injection

7 Bibliografia recomanadaÚ i t d f è i ú i llib l b t t l

7. Bibliografia recomanada● Únicament donem com a referència un únic llibre que engloba tota la

seguretat relativa a Sistemes Gestors de Bases de Dades i dos documentsque aporten informació sobre SQL Injection. Són referències interessants, sibé l ’ tà l i d’ t i t t à fà il t bbé la xarxa n’està plena i, en cas d’estar interessats, us serà fàcil trobarinformació més precisa i profunda.

o The Database Hacker's Handbook: Defending Database Servers,Litchfield, Anley, Heasman & Grindlay - Wiley Publishing 2005ISBN: 9780764578014

oAdvanced SQL Injection in SQL Server Applications, Chris Anleyhttp://www.ngssoftware.com/papers/advanced_sql_injection.pdf

o (more) Advanced SQL Injection, Chris Anleyhttp://www.ngssoftware.com/papers/more_advanced_sql_injection.pdf

o Qualsevol dels white papers o documents de Spi Labs / Spi Dynamics.(per exemple, “SQL Injection: Are your web applications vulnerable?”)

Pàgina 45 de 45