2016-10-20 6 views
3

私はOWASPコマンドインジェクションExample 1に多少関連している課題に取り組んでいます。要するに、私は文字列 "cat"に追加される引数(ファイル名)を受け入れるので、私のプログラムは提供されたファイルをキャッチします。ユーザー入力をsystem()関数に直接渡すと、ユーザーは別のコマンドをセミコロン;で区切ってスニークすることができます。たとえば、セミコロンを含むC引数が切り捨てられて表示される

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

答えて

3

シェルは;を解釈して次のコマンドを実行しています。プログラムに送信する場合は、引用符で囲む必要があります。

プログラムが正常に終了した場合は、;の実行後にビットが表示されます。

./commandinject "Story.txt;whoami" 
+0

まあ、それは本当に簡単でしたね。宿題をするのは遅すぎる。ご協力いただきありがとうございます。 – elBradford

+0

@elブラッドフォード最高の幸運:いくつかの睡眠を取る - それは解決するいくつかの問題(またはわずか15分の休憩) – xaxxon

関連する問題