Buscar..


Introducción

La inyección de SQL es una técnica de inyección de código, utilizada para atacar aplicaciones controladas por datos, en la que se insertan infinidad de sentencias de SQL en un campo de entrada para su ejecución (por ejemplo, para volcar el contenido de la base de datos al atacante).

En esta sección hablaremos sobre eso y su relación con la declaración de JDBC.

Declaración y inyección SQL malvada

Tenga en cuenta que en este ejemplo utilizaremos DBMS de PostgreSQL, pero puede usar cualquier DBMS

Utilizaremos una base de datos bd_test que contiene un Schema: sch_test y dos tablas de users y test :

CREATE TABLE sch_test.users
(
  id serial NOT NULL,
  username character varying,
  password character varying,
  CONSTRAINT utilisateur_pkey PRIMARY KEY (id)
) 

CREATE TABLE sch_test.test
(
  id serial NOT NULL,
  "column" character varying
)

Inicio de sesión simple utilizando la declaración

static String DRIVER = "org.postgresql.Driver";
static String DB_USERNAME = "postgres";
static String DB_PASSWOR = "admin";
static String DB_URL = "jdbc:postgresql://localhost:5432/bd_test";

public static void sqlInjection() {
    try {
        Class.forName(DRIVER);
        Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWOR);
        Statement statement = connection.createStatement();
        String username = "admin";
        String password = "admin";
        String query = "SELECT * FROM sch_test.users where username = '" 
                + username + "' and password = '" + password + "'";

        ResultSet result = statement.executeQuery(query);

        if (result.next()) {
            System.out.println("id = " + result.getInt("id") + " | username = "
                    + result.getString("username") + " | password = " + result.getString("password"));
        }else{
           System.out.println("Login not correct");
        }

    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

Hasta ahora todo es normal y seguro.

Iniciar sesión con nombre de usuario y contraseña falsos

El hacker o el probador pueden simplemente iniciar sesión o enumerar a todos sus usuarios usando esto:

String username = " ' or ''='";
String password = " ' or ''='";

INSERTAR un nuevo usuario

Puede insertar datos en su tabla usando:

String username = "'; INSERT INTO sch_test.utilisateur(id, username, password) 
                        VALUES (2, 'hack1', 'hack2');--";
String password = "any";

BORRAR Todos los usuarios

considera que el pirata informático conoce el esquema de tu base de datos para que pueda eliminar a todos tus usuarios

String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any"; 

Usuarios de la tabla DROP

El hacker también puede borrar tu mesa.

String username = "'; drop table sch_test.table2;--";
String password = "any";

BASE DE DATOS DE GOTA

Lo peor es descartar la base de datos.

String username = "'; DROP DATABASE bd_test;--";
String password = "any";

y hay muchos otros.

¿Por qué todo esto?

Todo esto debido a que Statement no es lo suficientemente seguro como para ejecutar la consulta, por lo que se recomienda usar PreparedStatement , es más seguro que Statement .

Puedes encontrar aquí más detalles PreparedStatement



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow