demonstration injection de code
TRANSCRIPT
Démonstration :Injection de code
18 mars 2016 – Po l yte ch M ars e i l le
Thomas VIAUD
Contenu
• Présentation du scénario et des objectifs
• Base de données SQL
• Langage SQL
• Injection SQL
• Failles XSS
• Conclusion
Présentation du scénario et des objectifs
Utilisateur Site internet Base de données
Base de données
Présentation du scénario et des objectifs
Hacker Maître de l’univers ?
Base de données SQL*
Users
Posts
Comments
userid intPK
firstname text
name text
postid intPK
title text
content text
commentid intPK
content text
postid intFK
userid intFK
userid intFK
username text
password text
Un article ne peut appartenir qu’à un
seul utilisateur.
Plusieurs utilisateurs peuvent commenter le même article.
Fonctionnement simplifié d’un blog :
SQL : Structured Query Language
SELECT * FROM users;+------------+-----------+-----------+----------------------------------+-------+| username | firstname | name | password | level |+------------+-----------+-----------+----------------------------------+-------+| dscott | Debie | SCOTT | e80b5017098950fc58aad83c8c14978e | user |+------------+-----------+-----------+----------------------------------+-------+| edorsa | Elsa | DORSA | f25a2fc72690b780b2a14e140ef6a9e0 | user |+------------+-----------+-----------+----------------------------------+-------+| ikeurien | Iris | KEURIEN | e99a18c428cb38d5f260853678922e03 | user |+------------+-----------+-----------+----------------------------------+-------+| jbombeur | Jean | BOMBEUR | adff44c5102fca279fce7559abf66fee | user |+------------+-----------+-----------+----------------------------------+-------+| jhultou | Jeanne | HULTOU | ab4f63f9ac65152575886860dde480a1 | user |+------------+-----------+-----------+----------------------------------+-------+| ktartines | Kimberley | TARTINES | aa47f8215c6f30a0dcdb2a36a9f4168e | user |+------------+-----------+-----------+----------------------------------+-------+| ktrophobe | Klaus | TROPHOBE | fc63f87c08d505264caba37514cd0cfd | user |+------------+-----------+-----------+----------------------------------+-------+| lgolade | Larry | GOLADE | c33367701511b4f6020ec61ded352059 | user |+------------+-----------+-----------+----------------------------------+-------+| mtete | Maude | TETE | fe01ce2a7fbac8fafaed7c982a04e229 | user |+------------+-----------+-----------+----------------------------------+-------+| shuttofond | Sacha | HUTTOFOND | 8afa847f50a716e64932d995c8e7435a | user |+------------+-----------+-----------+----------------------------------+-------+| sstiquet | Sophie | STIQUET | 70e76a15da00e6301ade718cc9416f79 | admin |+------------+-----------+-----------+----------------------------------+-------+
users
firstname varchar(50)
name varchar(50)
username varchar(100)PK
password varchar(32)
level enum('user','admin')
Schéma de la table :
Langage SQL
Langage SQLSELECT * FROM users WHERE username LIKE 'dscott';+------------+-----------+-----------+----------------------------------+-------+| username | firstname | name | password | level |+------------+-----------+-----------+----------------------------------+-------+| dscott | Debie | SCOTT | e80b5017098950fc58aad83c8c14978e | user |+------------+-----------+-----------+----------------------------------+-------+
SELECT firstname,name,'OK' FROM users WHERE username LIKE 'e%';+-----------+-------+----+| firstname | name | OK |+-----------+-------+----+| Elsa | DORSA | OK |+-----------+-------+----+
SELECT * FROM users WHERE level LIKE 'admin';#Commentaire+----------+-----------+---------+----------------------------------+-------+| username | firstname | name | password | level |+----------+-----------+---------+----------------------------------+-------+| sstiquet | Sophie | STIQUET | 70e76a15da00e6301ade718cc9416f79 | admin |+----------+-----------+---------+----------------------------------+-------+
users
firstname varchar(50)
name varchar(50)
username varchar(100)PK
password varchar(32)
level enum('user','admin')
Schéma de la table :
SELECT GROUP_CONCAT(username),COUNT(*) FROM users WHERE username LIKE 'j%';+------------------------+----------+| GROUP_CONCAT(username) | COUNT(*) |+------------------------+----------+| jbombeur,jhultou | 2 |+------------------------+----------+
SELECT 1,2,3,4,5 UNION SELECT * FROM users WHERE username LIKE 'k%';+-----------+-----------+----------+----------------------------------+------+| 1 | 2 | 3 | 4 | 5 |+-----------+-----------+----------+----------------------------------+------+| 1 | 2 | 3 | 4 | 5 |+-----------+-----------+----------+----------------------------------+------+| ktartines | Kimberley | TARTINES | aa47f8215c6f30a0dcdb2a36a9f4168e | user |+-----------+-----------+----------+----------------------------------+------+| ktrophobe | Klaus | TROPHOBE | fc63f87c08d505264caba37514cd0cfd | user |+-----------+-----------+----------+----------------------------------+------+
SELECT @@version AS 'Version:';+--------------------------+| Version: |+--------------------------+| 10.0.23-MariaDB-0+deb8u1 |+--------------------------+
users
firstname varchar(50)
name varchar(50)
username varchar(100)PK
password varchar(32)
level enum('user','admin')
Schéma de la table :
Langage SQL
• Recherche de points d’entrées
• Exécution de requêtes forgées
ReconnaissanceReconnaissance
• Présence de messages d’erreur
• Comportement inattendu du site
VulnérabilitéVulnérabilité• Contournement de
l’authentification
• Altération ou exfiltration des données
ExploitationExploitation
Injection SQL
Méthode d’attaque :
Injection SQL
SELECT * FROM users WHERE username LIKE '<user>' AND password = '<password>';
L’injection n’est possible que dans le champ 'username' car le champ 'password' est un hash :SELECT * FROM users WHERE username LIKE 'mtete' AND password = 'fe01ce2a7fbac8fafaed7c982a04e229';+----------+-----------+------+----------------------------------+-------+| username | firstname | name | password | level |+----------+-----------+------+----------------------------------+-------+| mtete | Maude | TETE | fe01ce2a7fbac8fafaed7c982a04e229 | user |+----------+-----------+------+----------------------------------+-------+
fe01ce2a7fbac8fafaed7c982a04e229 = md5('demo‘);
Exemple d’attaque :
Pour les besoins de démonstration notre site test ne possède aucun filtrage sur les données entrées dans le formulaire.
Injection SQL
Exemple d’attaque :
Qui sait ? Sur un malentendu…
Injection SQL
Attaque avancée :
Utilisation de Sqlmap pour automatiser la récupération des données.
XSS : Cross-Site Scripting
Failles XSS*
Méthode d’attaque :
Injecter du contenu malveillant dans une page, qui sera exécuté par le navigateur.
Exemple d’attaque :
Insertion du code suivant dans la page :<script>alert('xss');</script>
Conclusion
Il faut protéger son code et filtrer systématiquement les données en entrée autant qu’en sortie !
Sites proposant des challenges en sécurité :www.newbiecontest.orgwww.root-me.org
Listing des challenges « Capture The Flag » :www.ctftime.org
Exemples de challenges :www.0x90r00t.com
Questions ?
Mail : [email protected]