Je travaille sur une mission qui est quelque peu liée à la commande d'injection de l'OWASP. Exemple 1 . En bref, j'accepte un argument (un nom de fichier) qui est ensuite ajouté à la chaîne "cat", de sorte que mon programme chatte le fichier fourni. Si je passe l'entrée de l'utilisateur directement à la fonction system()
l'utilisateur peut insérer une autre commande séparée par un point-virgule. ;
. Par exemple :
./commandinject Story.txt;whoami
sera cat Story.txt
et imprimer l'utilisateur actuel.
On me demande simplement de détecter un point-virgule, et s'il est trouvé, d'émettre une erreur et de demander un autre fichier - en boucle jusqu'à ce qu'une entrée valide soit donnée.
C'est assez simple avec strchr()
du moins, il devrait l'être. Mon problème est que lors du traitement de la chaîne argv[1]
tout ce qui se trouve à partir du point-virgule est invisible. J'ai un code de débogage qui imprime toutes les valeurs du tableau argv, et j'ai parcouru les étapes suivantes gdb
et la commande injectée est invisible, pour autant que je puisse dire.
Par exemple, avec l'entrée ci-dessus, le code
printf ("This is the command->%s\n", argv[1]);
imprimera
This is the command->Story.txt
Ce qui est vraiment bizarre, c'est que
system(argv[1]);
exécute toujours le code injecté. Je suis sûr qu'il s'agit d'un simple c-isme qui m'échappe, mais j'apprécierais un peu d'aide à ce sujet.
Je dois noter que si j'utilise des guillemets autour de l'argument, mon code fonctionne correctement et prend en compte le point-virgule.
#include <stdio.h>
#include <unistd.h>
#define COMMAND_SIZE 4096
int main(int argc, char **argv) {
char cat[] = "cat ";
char *command;
char *commandRepeat;
size_t commandLength;
commandLength = strlen(cat) + strlen(argv[1]) + 1;
command = (char *) malloc(commandLength);
strncpy(command, cat, commandLength);
strncat(command, argv[1], (commandLength - strlen(cat)) );
// Search command string for ';'
while(strchr(command, ';') != NULL){
// ERROR, ask for filename again.
// Use temporary buffer for user input
commandRepeat = (char *) malloc(COMMAND_SIZE);
printf("You used an invalid character ';'\nPlease enter the filename again: ");
fgets(commandRepeat, COMMAND_SIZE, stdin);
// Trim newline that fgets includes
commandRepeat[strcspn(commandRepeat, "\n")] = '\0';
// Prepare command string
commandLength = strlen(cat) + strlen(commandRepeat) + 1;
free(command);
command = (char *) malloc(commandLength);
strncpy(command, cat, commandLength);
strncat(command, commandRepeat, (commandLength - strlen(cat)) );
free(commandRepeat);
}
printf ("This is the command->%s\n", command);
system(command);
return (0);
}