web-dev-qa-db-fra.com

Injection SQL: comment trouver les URL pour attaquer

Les derniers jours que j'ai lu sur SQL injection et la plupart des exemples de url que je vois sont comme suit:

get_int_filtered.php?id=1
get_int_groupby.php?id=1
get_int_having.php?id=1
get_int_img.php?id=1
get_int_inline.php?id=SELECT+name+FROM+users

(Ce qui précède est un petit exemple inclus dans: sqlmapproject/testenv )

Il me manque la partie de la façon dont quelqu'un découvre ces URL pour attaquer. S'agit-il d'une tâche manuelle? Par exemple, en vérifiant les outils de développement du navigateur pour voir les appels au backend/REST api d'un site Web? Existe-t-il un outil qui peut analyser un site Web et fournir une liste de urls et HTTP methods pour essayer (dans un deuxième temps)?

6
tgogos

Injection SQL: comment trouver les URL fragiles aux attaques par injection SQL.

Tout d'abord, vous devez comprendre les différents types de SQLi, ici .

Je vais parler ici de l'In-band Injection, le classique. divisé en 2 types:

  • SQLi basé sur les erreurs
  • SQLi basé sur UNION

SQLI basé sur les erreurs

Objectif: Collecte des informations sur la structure de la base de données en affichant les erreurs SQL sur le site Web cible. Dans certains cas, vous pouvez énumérer la base de données entière avec ceux-ci.

Recherche d'une URL faible: Utilisation de Google Dorks. Oui, Google vous aide à trouver des URL faibles.

  • exemple: inurl:"product.php?id=" site:.ru

Ici, vous demandez à Google de répertorier le site russe avec product.php?id= dans l'URL.

Pourquoi?

Parce que nous voulons trouver une page qui parle directement à la base de données. Dans la plupart des cas, vous souhaitez rechercher ces modèles: *.php?parameter=n

D'accord, mais comment savoir si cette URL est faible pour SQLi?

Vous devez mettre un ' ou %27 juste après le numéro du paramètre et appuyez sur Entrée:

  • http[:]//w34ksite.com/product.php?id=1'

Si une erreur SQL apparaît, il est probable que ce site Web soit injectable.


SQLI basé sur UNION

Objectif: Exploite l'opérateur SQL UNION pour combiner les résultats de deux ou plusieurs instructions SELECT en un seul résultat.

le bloc suivant est un matériel que j'ai écrit pour mes étudiants infoSec. (Cours de sécurité offensif)

site faible:

http://w34ksite.com

première étape

Recherchez une URL qui envoie potentiellement des requêtes SQL, comme celle-ci:

http://w34ksite.com/products.php?category=1 cette liste d'URL produits, regroupés dans la catégorie nommée 1

Essayez de vous rappeler qu'une URL se terminant par * ? * = * communiquera, dans la plupart des cas, avec une base de données SQL, nous voulons l'exploiter.

La deuxième étape

Traduire le products.php?category=1 une partie de l'URL dans une requête SQL. Oui, dans ce scénario (et dans de nombreux sites Web en production), ce morceau d'URL est une requête SQL déguisée:

products.php? category = 1 -> SELECT * FROM products WHERE category=1

La troisième étape

Peut-on injecter le paramètre catégorie? Essayons de trier la liste des produits en ajoutant ORDER BY n, par exemple :

http://w34ksite.com/products.php?category=1 ORDER BY 1 Rien ne change.

http://w34ksite.com/products.php?category=1 ORDER BY 2 Sensationnel ! la commande des produits a changé! Nous pouvons probablement injecter des trucs!

Le nombre n dans ORDER BY n indique à partir de quel numéro de colonne du tableau vous triez la sortie (dans ce cas colonne 2 du tableau du produit). Alors attendez une minute, que se passe-t-il si j'entre un nombre qui dépasse le nombre maximum de la table? Essayons.

http://w34ksite.com/products.php?category=1 ORDER BY 3 L'ordre change à nouveau.

http://w34ksite.com/products.php?category=1 ORDER BY 4 Sensationnel! Page blanche! On peut en déduire que la table du produit a colonnes. Ces informations sont cruciales pour l'utilisation de l'opérateur SQL UNION ALL.

La quatrième étape

Planification de l'attaque. Ainsi, par exemple, nous voulons vider les adresses e-mail écrites dans cette base de données. Et bien sûr, les entrées de courrier électronique ne figurent pas dans le tableau des produits. Ils devraient être ailleurs ... Vous pouvez deviner le nom de la table et plus encore lorsque Une erreur SQL apparaît directement sur la page Web, mais pas de chance cette fois, aucune erreur SQL n'apparaît sur w34ksite.com. Supposons donc que la table de l'e-mail soit nommée - e-mail, car nous savons que c'est le nom de la table de l'e-mail par défaut du CMS.

SELECT * FROM email -> http://w34ksite.com/email.php? Bien sûr que non. Qui sera assez fou pour créer une page PHP qui répertorie les e-mails de la base de données? Pourquoi pas password.php?

N'oubliez pas que products.php?category=1 est notre clé pour communiquer avec la base de données et injecter des choses. Cette clé ouvre la porte de la base de données, l'idée générale sera d'utiliser cette clé pour afficher le contenu de la table email. Alors pourquoi ne pas afficher le contenu de la table des produits (products.php? Category = 1) et ​​le contenu de la table des e-mails? Oui, c'est ce que nous ferons. En utilisant l'opérateur NION ALL.

L'UNION ALL est assez utile, vous pouvez joindre une autre requête SQL en l'utilisant. Par exemple, traduisons à nouveau cette partie URL en SQL:

products.php? category = 1 -> SELECT * FROM products WHERE category=1 droite ?

Nous allons maintenant ajouter la nouvelle requête en utilisant l'opérateur UNION ALL et essayer de récupérer la table de messagerie:

SELECT * FROM products WHERE category=1 ET UNION ALL SELECT *, NULL, NULL FROM email

Nous devrions avoir quelque chose comme ça:

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

Attendez, quel est le *, NULL, NULL?

Se souvenir du http://w34ksite.com/products.php?category=1 ORDER BY 4 pour tester si nous pouvons injecter quelque chose? Nous obtenons une information très précieuse: le nombre de colonne table du produit. Lorsque vous utilisez l'opérateur UNION ALL, le numéro de colonne du tableau doit être le même.

  • NULL: Faux une colonne vide.
  • ,: Séparer une colonne d'une autre
  • *: affiche les entrées de cette colonne

Si rien ne se passe, essayez de déplacer le * autour comme ça:

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, *, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, NULL, * FROM email

11
Baptiste