【问题标题】:C argument with semicolon appears truncated带有分号的 C 参数显示被截断
【发布时间】:2019-03-27 11:48:47
【问题描述】:

我正在处理一项与 OWASP 命令注入 Example 1 相关的任务。简而言之,我接受一个参数(文件名),然后将其附加到字符串“cat”,因此我的程序会对提供的文件进行分类。如果我将用户输入直接传递给system() 函数,用户可以潜入另一个以分号; 分隔的命令。例如:

./commandinject Story.txt;whoami

cat Story.txt 并打印当前用户。

我只是被要求检测分号,如果找到,出错并请求另一个文件 - 循环直到给出有效输入。

这对于strchr() 来说非常简单,至少应该如此。 我的问题是,在处理字符串 argv[1] 时,分号之后的任何内容都是不可见的。 我有一些调试代码可以打印出所有 argv 数组值,我逐步检查了 gdb 并注入了据我所知,命令是不可见的。

例如,当给定上面的输入时,代码

printf ("This is the command->%s\n", argv[1]);

会打印出来

This is the command->Story.txt

真正奇怪的是

system(argv[1]); 

仍然执行注入的代码。我确信这是我缺少的一个简单的 c-ism,但我希望能得到一些帮助。

我应该注意,如果我在参数周围使用引号,我的代码可以正常工作并捕获分号。

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

【问题讨论】:

    标签: c string argv


    【解决方案1】:

    shell 正在解释; 并运行下一个命令。如果要将其发送到您的程序,则需要将其放在引号中。

    如果您的程序正常结束,您应该会看到; 执行后的位。

    ./commandinject "Story.txt;whoami"
    

    【讨论】:

    • 天啊,真的就这么简单,不是吗?做家庭作业已经太晚了。感谢您的帮助。
    • @elBradford 祝你好运 :) 睡一觉 - 解决了多少问题(甚至只是 15 分钟的休息时间),真是令人惊讶
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 2017-01-27
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多