web-dev-qa-db-fra.com

Le serveur renvoie 403 lorsque j'essaie une injection SQL

J'essaie de penter le site de mon ami. Il est clairement vulnérable à l'attaque d'injection SQL en fonction des messages d'erreur que je reçois d'entrer dans différents paramètres d'obtention.

Chaque fois que j'essaie des attaques très simples contenant des commandes SQL telles que %27%20or%201=1%20 lequel est ' or 1=1 I Obtenir une page d'erreur 403. Je reçois aussi un message 403 chaque fois que j'essaie d'utiliser une commande SQL telle que union, select, -- ou /**/. Le site est un site PHP avec une base de données MySQL. Est-ce une sorte de WAF (pare-feu d'application Web) qu'il a configuré? Si oui, avez-vous des conseils sur la façon de la vaincre?

Essayer un paramètre comme %0b%271%0bor%20%271%27=%271 Retourne l'erreur suivante:

Vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à votre version de Server MySQL pour la syntaxe droite à utiliser près de '1OR' 1 '=' 1 'et test =' 0 'et version =' 1 '' 1 '' à la ligne 1

2
Mohammad Ali

Si le site Web renvoie une erreur de syntaxe SQL à vous, vous avez certainement trouvé une vulnérabilité SQLI. Vous ne traitez pas avec un waf (parfois, il peut être difficile de dire la différence). Cela signifie également que, commodément pour vous, il a une impression d'erreur allumée. Cela rend beaucoup plus facile de dire ce qui se passe. C'est aussi une vulnérabilité qu'il devrait corriger.

Cela étant dit, sur le SQLI! Obtenir la syntaxe de la charge utile droite peut être délicat. Cependant, le message d'erreur vous aidera beaucoup. Je regarderais cette partie:

'1or '1'='1' and test = '0' and version = '1''

Notez que MySQL lui-même enveloppe des citations simples autour de la partie qu'il est écrit est cassée, donc si nous devons supprimer les guillemets simples extérieures, nous pouvons voir ce que MySQL essaie réellement d'exécuter:

1or '1'='1' and test = '0' and version = '1'

Ce qui est légèrement déroutant parce qu'il ne correspond pas très bien à votre charge utile ('1 or 1=1). Cela signifie probablement qu'il fait des traductions supplémentaires dans les coulisses pour tenter d'atténuer SQLI. Malheureusement (pour lui) sa mise en œuvre ad hoc n'est certainement pas infaillible (puisque vous produisez des erreurs MySQL). Très probablement, la requête réelle qu'il exécute est la suivante:

WHERE column='?' and test = '0' and version = '1'

Avec la marque d'interrogation debout pour le paramètre vulnérable. Cela serait normalement très facile à exploiter, sauf qu'il semble de faire une transformation étrange à vos données. En ce sens, il peut faire quelque chose qui ressemble à un waf dans la nature, vous devrez donc faire de jouer pour construire un POC réussi. J'essaierais quelque chose de très différent, comme une injection SLEEP:

1' and sleep(10)

Tout simplement en vertu d'une "forme" différente de la charge utile, vous pouvez échapper à son "filtre". Si le serveur prend environ 10 secondes de plus pour renvoyer la réponse, vous savez que vous avez une charge utile réussie! De là, vous pouvez essayer de créer différents types de charges utiles pour extraire des informations, etc.

2
Conor Mancone