dvwa第四題:command Injection

3832 ワード

機能プログラムがシステムコマンド(system(),exec()を実行し、ユーザ入力エントリを提供する必要がある場合、コマンドライン入力が存在する可能性があります.
 
コマンドラインインジェクションは、ホストオペレーティングシステム上の攻撃を受けやすいプログラムによって任意のコマンドを実行するために使用できます.コマンドライン注入は実行可能であり、アプリケーションがユーザーデータを取得してセキュリティチェック(フォーム、cookies、httpヘッダ情報など)をsystem shellに行わなかった場合、攻撃側は高レベルの権限を持つアプリケーションを通じてシステムコマンドを実行し、コマンド注入攻撃はクライアントから入力されたデータの検証が不足している可能性が高い.
なお、コマンドライン注入はカスタムコマンドやコードを実行することはできず、システムコマンドのみを実行することができます.
 
いくつか例を挙げてみましょう.
example 1:
#include 
#include 

int main(int argc, char **argv) {
 char cat[] = "cat ";
 char *command;
 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)) );

 system(command);
 return (0);
}

これはrun in linuxのコードで、正常なユーザーはstory.txtを入力し、プログラムはcat story.txtなどのcatコマンドを実行します.ただし、ユーザーがstory.txtを入力すると、ls、プログラムはlsコマンドも実行します.プログラムが高レベルの権限で実行されている場合、より高いレベルのコマンドラインを実行できます.
 
 
example 2:
       int main(char* argc, char** argv) {
               char cmd[CMD_MAX] = "/usr/bin/cat ";
               strcat(cmd, argv[1]);
               system(cmd);
       }

これはroot権限で実行されるコードなので、system()もroot権限で実行され、ユーザーが標準のファイル名を入力すると、プログラムは正常に実行されます.しかし、ユーザがコマンドの後に増加すると、rm-rf/、システムがcatコマンドを実行できません.rmコマンドを実行すると、rootパーティションの下のファイルが削除されます.
 
 
example 3:
       ...
       char* home=getenv("APPHOME");
       char* cmd=(char*)malloc(strlen(home)+strlen(INITCMD));
       if (cmd) {
               strcpy(cmd,home);
               strcat(cmd,INITCMD);
               execl(cmd, NULL);
       }
       ...

これは、環境変数$APPHOMEを使用してアプリケーションのインストールディレクトリを決定し、そのディレクトリの下の初期化スクリプトを実行する高レベルの権限からのプログラムコードです.攻撃者は環境変数APPHOMEを異なるディレクトリに変更することができ、プログラムが読み取った環境変数の値をチェックしないようにし、環境変数を制御できる場合、アプリケーションをだまして悪意のあるコードを実行することができる.
もちろんこれらのコードは表示されるので、攻撃者は効果を明らかにすることができます.
 
 
example 4:
system("cd /var/yp && make &> /dev/null");

これはweb cgiプログラムからのコード(もちろんこれはハードコーディング)であり、ユーザーがパスワードを変更することを許可し、NISの下のパスワード更新プロセスは/var/ypディレクトリでmakeを実行することを含み、パスワードを変更するため、setuid rootの権限が必要である.
このセグメントプログラムはmakeの絶対パスを指定しておらず、コマンドを呼び出す前に環境変数を消去する動作をしていないため、攻撃者は$PATH環境変数を変更してmakeという悪意のあるバイナリファイルを指し、shellコマンドラインプロンプトからCGIスクリプトを実行することができます.プログラムにはsetuid root権限があるため、悪意のあるmakeファイルにもrootの高度な実行権限があります.
プログラムでシステムコマンドを実行するときの環境変数の役割は重要です.システム()やexec()のようにコマンドを実行する際にプログラムを使用する環境では、攻撃者は呼び出す前に彼を変える潜在的な機会がある.
web cgi紹介:汎用ゲートウェイインタフェースhttps://blog.csdn.net/weixin_39609623/article/details/86312439
setuid root:setuid権限-任意のアカウントにrootとしてコマンドを実行させる
 
 
example 5:
#include   #include   #include
int main(int argc, char **argv)  {           char command[256];     if(argc != 2)     {         printf("Error: Please enter a program to time!");         return -1;     }
    memset(&command, 0, sizeof(command));     strcat(command, "time ./");     strcat(command, argv[1]);     system(command);     return 0; }
このCコードは攻撃を受けやすいので、lsを入力することができます.cat/etc/shadowはシステムコマンドを実行します.
Java:
JAvaのRuntime.execとCのsystem関数は実は違います.彼らはあなたが新しいプログラム/プロセスを呼び出すことを許可していますが.しかし、Cのsystem関数はshell(/bin/sh)に参照します.解析では、RunTime.execは文字を配列に分割し、配列の最初のコマンドを実行すると、後の文字がパラメータとして使用されます.runtime.execはshellを呼び出すことはありません.多くの関数はshellによって実行されると、後続のコマンドをスキップするためにコネクタ(&,&,|,|,または入力と出力にリダイレクト)を追加しやすくなります.
 
 
 
 
dvwaのcommand Injection練習は、pingip機能であり、各レベルはユーザー入力パラメータに対して異なる程度の合法性検査を行い、コマンドリンク特殊文字によってコマンドライン注入を行い、192.168.1.1102&&lsなどのunix/windowsコマンドを実行することができます. 192.168.1.102 & ls , 192.168.1.102 || ls , 192.168.1.102 | ls , 192.168.1.1102&&lsなど.