MySQL Injection d'Utiliser SELECT de la requête de mise à JOUR/SUPPRESSION
J'ai une question facile: dire qu'il y a un site avec une requête comme:
SELECT id, name, message FROM messages WHERE id = $_GET['q']
.
Est-il un moyen d'obtenir quelque chose de mis à jour, supprimé dans la base de données (MySQL)? Jusqu'à maintenant, je n'ai jamais vu une injection qui a été en mesure de supprimer/mettre à jour à l'aide d'un requête SELECT, donc, est-il même possible?
Je voudrais noter, cependant, que les informations récupérées à partir d'un compromis de la base de données a très souvent une valeur plus élevée, puis juste d'être capable de corrompre les données. La base de données de contenu sont facilement restaurées à partir d'une sauvegarde, cependant une fois que les données de vol, il ne peut pas être repris.
OriginalL'auteur Simon | 2011-04-22
Vous devez vous connecter pour publier un commentaire.
Si vous dites que vous utilisez
mysql_query
qui ne supporte pas les requêtes multiples, vous ne pouvez pas ajouter directementDELETE
/UPDATE
/INSERT
, mais il est possible de modifier des données dans certaines circonstances. Par exemple, disons que vous avez la fonction suivanteMaintenant, vous pouvez appeler cette fonction en
SELECT
:SELECT id, name, message FROM messages WHERE id = NULL OR testP()
(
id = NULL
- toujours la valeur NULL(FAUX), donc testp n'() toujours est exécuté.OriginalL'auteur a1ex07
Avant de répondre directement à la question, il est intéressant de noter que, même si toutes un attaquant peut faire est de lire de données qu'il ne devrait pas être en mesure de, qui généralement encore vraiment mauvais. Considérer qu'en utilisant
JOIN
s etSELECT
ing à partir des tables système (commemysql.innodb_table_stats
), un attaquant qui commence avec unSELECT
injection et aucune autre connaissance de votre base de données pouvez mapper votre schéma et ensuite en extraire l'intégralité des données que vous avez dans MySQL. Pour la grande majorité des bases de données et des applications, qui déjà représente une catastrophique trou de sécurité.Mais pour répondre directement à la question: il y a quelques façons que je connais par lequel l'injection dans une base de données MySQL
SELECT
peut être utilisé pour modifier des données. Heureusement, ils nécessitent tous raisonnablement circonstances inhabituelles être possible. Tous les exemples injections ci-dessous sont donnés par rapport à l'exemple injectable requête à partir de la question:1. "Empilées" ou "lots" requêtes.
La classique technique d'injection de simplement mettre une toute autre déclaration, après celui d'être injecté dans. Comme suggéré dans une autre réponse ici, vous pouvez définir
$_GET['q']
à1; DELETE FROM users; --
ainsi que les formulaires de requêtes par deux instructions qui sont exécutées consécutivement, le deuxième de ce qui supprime tout ce qui dans leusers
table.Dans l'atténuation
La plupart des connecteurs MySQL - notamment en PHP (obsolète)
mysql_*
et (non dépréciés)mysqli_*
fonctions ne prennent pas en charge empilés ou par lot de requêtes à tous, donc ce genre d'attaque tout simplement ne fonctionne pas. Cependant, certains ne - notamment en PHP PDO connecteur (même si le support peut être désactivé pour augmenter la sécurité).2. Exploiter les fonctions définies par l'utilisateur
Fonctions peuvent être appelées à partir d'un
SELECT
, et peut altérer les données. Si une des données d'altération de la fonction a été créée dans la base de données, vous pourriez faire leSELECT
l'appeler, par exemple en passant0 OR SOME_FUNCTION_NAME()
que la valeur de$_GET['q']
.Dans l'atténuation
La plupart des bases de données ne contiennent pas toutes les fonctions définies par l'utilisateur - et encore moins de données-modifier - et n'offrent pas la possibilité à tous de réaliser ce genre d'exploit.
3. L'écriture de fichiers
Comme décrit dans Muhaimin Dzulfakar (un peu présomptueux nommé) papier Avancées De MySQL Exploitation, vous pouvez utiliser
INTO OUTFILE
ouINTO DUMPFILE
clauses sur une base de données MySQL sélectionnez vider le résultat dans un fichier. Depuis, à l'aide d'unUNION
, n'importe quel résultat peut êtreSELECT
ed, ce qui permet l'écriture de nouveaux fichiers de contenu arbitraire à n'importe quel endroit que l'utilisateur qui exécutemysqld
peut accéder. Éventuellement, cela peut être exploité non seulement de modifier des données dans la base de données MySQL, mais pour accéder à un shell sur le serveur sur lequel il est en cours d'exécution - par exemple, par l'écriture d'un script PHP à la racine du site et ensuite faire une demande, si le serveur MySQL est co-animé avec un serveur PHP.Dans l'atténuation
Beaucoup de facteurs à réduire la pratique de l'exploitabilité de la présente autrement impressionnante qui sonne attaque:
INTO OUTFILE
ouINTO DUMPFILE
pour remplacer un fichier existant, ni écrire dans un dossier qui n'existe pas. Cela empêche les attaques, comme la création d'un.ssh
dossier avec une clé privée dans lamysql
répertoire home de l'utilisateur et ensuite SSHing, ou à l'écrasement de lamysqld
binaire lui-même avec un malveillant version et en attente d'un redémarrage du serveur.mysql
) pour exécutermysqld
, et donnent à l'utilisateur que très peu d'autorisations. En tant que tel, il ne devrait pas être en mesure d'écrire à la plupart des endroits sur le système de fichiers - et certainement ne devrait pas normalement être en mesure de faire des choses comme écrire une application web racine de votre site.--sécurisé des fichiers de conf
définie par défaut, la prévention de MySQL, de l'écriture à un autre endroit que désigné de données importation/exportation de répertoire et de rendre ainsi cette attaque presque complètement impuissant... à moins que le propriétaire du serveur a délibérément désactivé. Heureusement, personne ne serait jamais juste complètement désactiver une fonctionnalité de sécurité de semblable depuis que serait évidemment - oh, attendez, jamais l'esprit.4. L'appel de la
sys_exec()
fonction delib_mysqludf_sys
pour exécuter des commandes shell arbitrairesIl y a une extension MySQL appelée
lib_mysqludf_sys
qui - à en juger par ses stars sur GitHub et un rapide Débordement de Pile de recherche - a au moins quelques centaines d'utilisateurs. Il ajoute une fonction appeléesys_exec
qui exécute des commandes shell. Comme indiqué dans le #2, les fonctions peuvent être appelées depuis unSELECT
; les implications ne sont heureusement évident. Pour citer la source, cette fonction "peut être un risque de sécurité".Dans l'atténuation
La plupart des systèmes n'ont pas cette extension est installée.
OriginalL'auteur Mark Amery
Cela dépend du SGBD connecteur que vous utilisez. La plupart du temps, votre scénario ne devrait pas être possible, mais dans certaines circonstances, il pourrait travailler. Pour plus de détails, vous devriez jeter un oeil au chapitre 4 et 5 de la Blackhat-Papier Avancées De MySQL Exploitation.
OriginalL'auteur Demento
Oui c'est possible.
$_GET['q'] tiendrait
1; DELETE FROM users; --
Vous vous trompez! sqlmap.sourceforge.net/doc/... Aussi s'il vous plaît vérifier: ferruh.mavituna.com/sql-injection-cheatsheet-oku
il n'. Si vous copie exacte de la requête et de l'exécuter dans phpmyadmin par exemple, il sera exécuté sans erreur. Toutefois, si vous utilisez une base de données mysql bibliothèque qui ne prend pas en charge plusieurs requêtes, vous obtiendrez une erreur. Par exemple, si vous utilisez php avec la fonction mysql_query et de l'entrée de la requête sql, vous obtiendrez une erreur qu'il ne prend pas en charge plusieurs requêtes en une seule fois, mais si vous utilisez la bibliothèque mysqli place, la requête s'exécute correctement.
mysql_query en PHP ne le supporte pas 😐 Et c'est l'un des plus utilisé dans les sites PHP, je suppose... Est-il un moyen de contourner ce problème?
toute réponse qui comprend "les plus utilisés" ou "je pense" est incorrecte.
OriginalL'auteur Pentium10