Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SQL Inyection

SQL Inyection

First vulnerability in the top 10 OWASP

Breakermoob

March 10, 2018
Tweet

More Decks by Breakermoob

Other Decks in Programming

Transcript

  1. ¿Qué es una inyección SQL? La inyección SQL es una

    forma de atacar los datos en una base de datos a través de un firewall que lo protege. Es un método mediante el cual se modifican los parámetros de una aplicación basada en web para cambiar las sentencias de SQL que se pasan a una base de datos para devolver datos. Por ejemplo, al agregar una comilla simple (') a los parámetros, es posible hacer que se ejecute una segunda consulta con la primera.
  2. ¿Qué es una inyección SQL? El origen de la vulnerabilidad

    radica en el incorrecto chequeo o filtrado de las variables utilizadas en un programa que contiene, o bien genera, código SQL. Es, de hecho, un error de una clase más general de vulnerabilidades que puede ocurrir en cualquier lenguaje de programación que esté embebido dentro de otro.
  3. ¿Qué es una inyección SQL? Se conoce como Inyección SQL,

    indistintamente, al tipo de vulnerabilidad, al método de infiltración, al hecho de incrustar código SQL intruso y a la porción de código incrustado. Error Común Connection con = (acquire Connection) Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';");
  4. ¿ Cómo funciona un ataque de inyección SQL? Dorks para

    inyección SQL Son combinaciones que nos permiten hallar información valiosa de forma mas rápida. pages.php?id= index.php?id= category.php category.php?catid= category_list.php?id= ancillary.php?ID= archive.php?id= article.php?id=
  5. ¿ Cómo funciona un ataque de inyección SQL? http://www.dockguard.co.uk/page.php?id=18 http://paritarian-funds-construction.eu/page.php?id=1

    http://www.f10products.co.za/index.php?id=5 http://www.katoombagroup.org/details.php?id=56 http://alphaonenow.org/info.php?id=131
  6. ¿Cómo evitar los ataques? 1. Audite el código de la

    aplicación y cambie o elimine los problemas que permiten que la inyección tenga lugar. 2. Haga cumplir el principio de privilegio mínimo en el nivel de la base de datos, de modo que, incluso si alguien puede insertar código SQL para robar datos, no pueda ver más datos de los que el desarrollador pretende a través de cualquier interfaz de aplicación normal. Principio de privilegio mínimo: El sistema debe ser capaz de acceder solo a la información y recursos que son necesarios para su legítimo propósito.
  7. ¿Cómo evitar los ataques? Existen algunos programas que nos ayudan

    a saber si nuestra pagina tienen este tipo de vulnerabilidad, como lo son SQLmap o Havij.
  8. Ejemplo 1 Error Común Java Connection con = (acquire Connection)

    Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "';");
  9. Solución ejemplo 1 Parametrización Connection con = (acquire Connection) PreparedStatement

    pstmt = con.prepareStatement("SELECT * FROM usuarios WHERE nombre = ?"); pstmt.setString(1, nombreUsuario); ResultSet rset = pstmt.executeQuery();
  10. Solución ejemplo 1 Tambien podemos usar escape SQL con la

    librería Apache Commons Lang Connection con = (acquire Connection) Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery("SELECT * FROM usuarios WHERE Nombre = '" + StringEscapeUtils.escapeSQL(NombreUsuario) + "';")
  11. Ejemplo 2 Error Común C# using( SqlConnection con = (acquire

    connection) ) { con. Open(); using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = '" + nombreUsuario + "'", con) ) { using( SqlDataReader rdr = cmd.ExecuteReader() ){ ... } } };
  12. Solución ejemplo 2 Parametrización using( SqlConnection con = (acquire connection)

    ) { con. Open(); using( SqlCommand cmd = new SqlCommand("SELECT * FROM usuarios WHERE nombre = @nombreUsuario", con) ) { cmd.Parameters.AddWithValue("@nombreUsuario", nombreUsuario); using( SqlDataReader rdr = cmd.ExecuteReader() ){ ... } } }
  13. Solución Perl Parametrización $query = $sql->prepare("SELECT * FROM Usuarios WHERE

    user=? AND pass=?"); $query->execute($user,$password);
  14. Solución .NET Parametrización SqlConnection con = new SqlConnection(_connectionString); SqlCommand cmd

    = new SqlCommand("SELECT * FROM Usuarios WHERE user=@user AND pass=@pass", con); /* Convertimos en literal estos parámetros, por lo que no podrán hacer la inyección */ cmd.Parameters.Add("@user", SqlDbType.VarChar, 32).Value = user; cmd.Parameters.Add("@pass", SqlDbType.VarChar, 64).Value = password;
  15. Referencias Inyección de SQL y Oracle, primera parte - Symantec

    https://www.symantec.com/connect/articles/sql-injection-and-oracle-part-one SQL Injection Attacks – Are You Safe? https://www.sitepoint.com/sql-injection-attacks-safe/ Indirect Attacks (SQL Injection) http://www.informit.com/articles/article.aspx?p=30124&seqNum=3 SQLrand: Preventing SQL Injection Attacks https://www.cs.columbia.edu/~angelos/Papers/sqlrand.pdf Abusing poor programming techniques in webserver scripts V 1.0 http://www.derkeiler.com/Mailing-Lists/securityfocus/secprog/2001-07/0001.html Inyección SQL https://www.owasp.org/index.php/SQL_Injection