私は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);
}
まあ、それは本当に簡単でしたね。宿題をするのは遅すぎる。ご協力いただきありがとうございます。 – elBradford
@elブラッドフォード最高の幸運:いくつかの睡眠を取る - それは解決するいくつかの問題(またはわずか15分の休憩) – xaxxon