J'utilise Security Shepherd comme outil de formation et je suis maintenant dans le défi, SQL Injection Escaping Challenge.
Le défi:
Lorsque je fais une requête comme celle ci-dessus (juste avec des noms de table différents) dans une base de données locale dans MySQL, cela fonctionne très bien (je fais l'hypothèse que Shepherd utilise MySQL dans ce défi car c'est le seul type de SGBD que j'ai jusqu'à présent).
Une idée pourquoi la requête ci-dessus pourrait ne pas fonctionner comme une injection SQL?
La requête utilisée par le backend comme mentionné dans l'indice du défi est:
SELECT * FROM customers WHERE customerId="1" OR "1"="1";
L'application échappe à tout '
en le faisant \'
comme protection contre l'injection SQL. Cela ne change pas le "
.
Réponse courte: abusez du fonctionnement de leur évasion. Essayez \' OR 1=1; --
.
Longue réponse:
Leur fonction d'échappement fonctionne en remplaçant chaque '
avec \'
. Tous, y compris ceux déjà précédés de barres obliques inverses. Cela signifie que s'ils voient \'
, cela finira par devenir \\'
- une barre oblique inversée, suivie d'un guillemet simple non échappé.
Après cela, c'est l'injection SQL standard. OR 1=1
obtient chaque ligne de la base de données, ;
termine l'instruction et --
commente le reste, de sorte que leur citation, fin de déclaration, autres conditions, etc. soient ignorés.
Ces réponses sont incorrectes. La bonne réponse à ce problème est:
" or ""="
Raison: Un pirate intelligent pourrait avoir accès aux noms d'utilisateur et aux mots de passe dans une base de données en insérant simplement "ou" "=" dans la zone de texte du nom d'utilisateur ou du mot de passe. Le résultat SQL est valide. Il retournera toutes les lignes de la table clients, car WHERE "" = "" est toujours vrai.
Les réponses ci-dessus sont correctes car elles réussissent toutes à effectuer une injection, car un pirate intelligent recherche une injection qui fonctionne. Une fois qu'un pirate trouve une injection qui fonctionne, il ne continue pas à fouiller avec d'autres requêtes possibles mais étendra plutôt celle qui fonctionne. Vous pouvez également faire une logique de calcul pour obtenir le même résultat, tel que: "OR" 1 + 1
Je viens de découvrir que si quelqu'un modifie le profil admin de la disposition du module en mode tournoi, un nouvel onglet de triche apparaît. La réponse à ce qui précède est donc: \'or"1"="1"; --
.