3 votes

L'argument C avec point-virgule apparaît tronqué

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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X