Anar al contingut

Injecció SQL

De L'Enciclopèdia, la wikipedia en valencià
Erro al crear miniatura:
Classificació dels ataques Web per Injecció SQL

Injecció SQL és un método d'infiltració de còdic intrús que es val d'una vulnerabilitat informàtica present en una aplicació en el nivell de validació de les entrades per a realisar operacions sobre una base de senyes.[1]

L'orige de la vulnerabilitat radica en l'incorrecta comprovació o filtrat de les variables utilisades en un programa que conté, o be genera, còdic SQL. És, de fet, un error d'una classe més general de vulnerabilitats que pot ocórrer en qualsevol llenguage de programació o script que estiga incrustat en un atre.

Es coneix com a Injecció SQL, indistintament, al tipo de vulnerabilitat, al método d'infiltració, al fet d'incrustar còdic SQL intrús i a la porció de còdic incrustat.

Descripció

Es diu que existix o es va produir una injecció SQL quan, d'alguna manera, s'inserta o "injecta" còdic SQL invasor dins del còdic SQL programat, a fi d'alterar el funcionament normal del programa i conseguir aixina que s'eixecute la porció de còdic "invasor" incrustat, en la base de senyes.

Este tipo d'intrusió normalment és de caràcter maliciós, amolador o espia, per tant és un problema de seguritat informàtica, i deu ser pres en conte pel programador de l'aplicació per a poder previndre-ho. Un programa elaborat en descuit, displicencia o en ignorança del problema, podrà resultar ser vulnerable, i la seguritat del sistema (base de senyes) podrà quedar finalment compromesa.

L'intrusió ocorre durant l'eixecució del programa vulnerable, ya siga, en computadors d'escritori o be en llocs Web, en este últim cas òbviament eixecutant-se en el servidor que els estaja.

La vulnerabilitat es pot produir automàticament quan un programa "arma descuidadamente" una sentència SQL en temps d'eixecució, o be durant la fase de desenroll, quan el programador explicita la sentència SQL a eixecutar en forma desprotegida. En qualsevol cas, sempre que el programador necessite i faça us de paràmetros a ingressar per part de l'usuari, a efectes de consultar una base de senyes; ya que, justament, dins dels paràmetros és a on es pot incorporar el còdic SQL intrús.

En eixecutar-se la consulta en la base de senyes, el còdic SQL injectat també s'eixecutarà i podria fer un sinnúmero de coses, com insertar registres, modificar o eliminar senyes, autorisar accessos i, inclús, eixecutar un atre tipo de còdic maliciós en el computador.

Per eixemple, assumint que el següent còdic residix en una aplicació web i que existix un paràmetro "nombreUsuario" que conté el nom d'usuari a consultar, una injecció SQL es podria provocar de la següent forma:

El còdic SQL original i vulnerable és:

Si l'operador escriu un nom, per eixemple "Pepe", res anormal succeirà, l'aplicació generaria una sentència SQL similar a la següent, que és perfectament correcta, en a on se seleccionarien tots els registres en el nom "Pepe" en la base de senyes:

Pero si un operador malintencionat escriu com a nom d'usuari a consultar:

, es generaria la següent consulta SQL, (el color vert és lo que pretén el programador, el blau és la senya, i el roig, el còdic SQL injectat):

SELECT * FROM usuaris WHERE nom = 'Alicia';
DROP TABLE usuaris;
SELECT * FROM senyes WHERE nom LIKE '%';

En la base de senyes s'eixecutaria la consulta en l'orde donat, se seleccionarien tots els registres en el nom 'Alicia', es borraria la taula 'usuaris' i finalment se seleccionaria tota la taula "senyes", que no deuria estar disponible per als usuaris web comunes.

En resum, qualsevol senya de la base de senyes pot quedar disponible per a ser llegit o modificat per un usuari malintencionat.

Note's per qué es diu "Injecció" SQL. Si s'observa el còdic maliciós, de color roig, es notarà que està insertat en el mig del còdic bo, el vert. Aixina, el còdic roig ha segut "injectat" dins del vert.

L'injecció SQL és fàcil d'evitar, per part del programador, en la majoria dels llenguages de programació que permeten desenrollar aplicacions web. En la següent secció es tracta breument eixe tema.

Blind SQL injection

'Atac a cegues per injecció SQL', en anglés, Blind SQL injection, és una funció i una tècnica d'atac que utilisa l'injecció SQL. S'evidencia quan en una pàgina web, per un fallo de seguritat, no es mostren mensages d'error al no produir-se resultats correctes davant una consulta a la base de senyes, mostrant-se sempre el mateix contingut (és dir, solament hi ha resposta si el resultat és correcte).

Sentències condicionals en el tipo "Or 1=1" o "having 1=1" oferixen respostes sempre correctes (true o verdader) per lo que solen ser usades pels programadors com a formes de comprovació. El problema per a la seguritat de la pàgina radica que esta tècnica és utilisada en combinació en diccionaris o força bruta per a la busca, caràcter per caràcter, d'una contrasenya, un nom d'usuari, un número de teléfon o qualsevol atra informació que albergue la base de senyes atacada; per a això s'utilisa còdic SQL específic que "va provant" cada caràcter conseguint un resultat positiu acumulable quan hi ha una coincidència. D'esta manera es pot saber, per eixemple, que una contrasenya comença per "F...", despuix continua en ". i...", i despuix ".. r...", etc (acumula Fir...), fins a donar en la paraula completa.

Existixen programes que automatisen este procés de "tantejos" lletra per lletra en el resultat de la consulta SQL, que un intrús podria enviar injectat.

Algunes formes d'evitar la Injecció SQL

Ruby on Rails

En el framework Ruby on Rails (RoR), les consultes són verificades automàticament per qualsevol dels métodos de busca inclosos. Per eixemple:


L'única forma de que un usuari mal intencionat puga usar una injecció de SQL en RoR és que per mig de còdic es transforme la variable a tipo string i s'utilise com a argument de la busca directament. Per eixemple:


Perl

En llenguage Perl DBI, el método DBI::quote filtra els caràcters especials (assumint que la variable $sql conté una referència a un objecte DBI):


O també es pot usar la característica placeholder (en comillado automàtic) com seguix:


PHP

En el llenguage PHP, hi ha diferents funcions que poden servir d'ajuda per a usar en distints sistemes de gestió de bases de senyes.

Si s'usa MySQL, la funció a usar és mysql_real_escape_string:


No obstant és més recomanat usar alternatives que oferixen consultes preparades com la classe PDO.

I si s'utilisa MySQLi...

Java

En llenguage Java, es pot usar l'interfaç PreparedStatement

En lloc de:


es pot usar parametrisació o escape de variables, com s'indica en els següents apartats.

Parametrisació de sentències SQL

Escape de les variables a insertar en la sentència SQL

Escapar el text contingut en la variable remplazando els caràcters especials en SQL pel seu equivalent textual, de tal forma que SQL interprete tot el contingut de la variable com si fora text.


També es pot utilisar el método escapeSQL de la classe procedent de la llibreria de Apache Commons Lang

En C#

En llenguage C#, de la plataforma . NET (o la seua alternativa lliure Mona), es té ADO. NET SqlCommand (para Microsoft SQL Server) o OracleCommand (per a servidors de bases de senyes Oracle). L'eixemple següent mostra cóm previndre els atacs d'injecció de còdic usant l'objecte SqlCommand. El còdic per a ADO. NET es programa de forma similar, encara que pot variar lleument segons l'implementació específica de cada proveïdor.

En lloc de:


es podria usar lo següent:


Vore també

Referències

  1. ↑ «SQL Injection | OWASP» (en en). owasp. org. Consultat el 2021-09-13.

Enllaços externs