sql >> Database >  >> RDS >> PostgreSQL

Demonstreer SQL-injectie in PL/pgSQL

SQL-query's in PL/pgSQL worden gepland als voorbereide instructies. Zolang u alleen waarden doorgeeft zoals jij, is SQL-injectie over het algemeen onmogelijk . Details:

Gebruik dynamische SQL met EXECUTE en zonder de juiste parameterafhandeling om daadwerkelijk SQL-injectie te demonstreren.

Vind ik leuk (dit is hoe niet om het te doen!):

CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar)
  RETURNS SETOF users AS
$func$
BEGIN
   RETURN QUERY EXECUTE
        'SELECT *
         FROM   users
         WHERE  email = $1
         AND    encrypted_password = crypt(''' || passwd || ''', encrypted_password)'
   USING em;
END
$func$  LANGUAGE plpgsql;

De eerste variabele em correct wordt doorgegeven met de USING clausule als waarde en kan dus niet worden misbruikt voor SQL-injectie.

Maar de tweede variabele passwd onjuist is aaneengeschakeld zonder op de juiste manier te ontsnappen. Zo kan gebruikersinvoer worden geconverteerd naar SQL-code. SQL-injectie.

Gebruik dit nooit! Behalve bij het demonstreren hoe het niet moet.

Soortgelijke kattenkwaad is mogelijk wanneer SQL-strings in de client onjuist worden samengevoegd.




  1. Hoe de lijst met tabellen in de database op te halen in Laravel 5.1

  2. Hoe moet ik wijzigingen in een MySQL-tabel controleren (met MySQL 4)?

  3. Willekeurig record uit een databasetabel (T-SQL)

  4. SELECTEER en vergrendel een rij en dan UPDATE