0

Python でサーバー/クライアント ソケット ペアを使用しています。サーバーは特定のコマンドを受信し、応答を準備してクライアントに送信します。

この質問では、私の懸念はコードへのインジェクションの可能性についてです.2番目のパラメーターで何か奇妙なことをサーバーに依頼できるかどうか-コマンドコンテンツの制御が望ましくない動作を回避するのに十分でない場合.

編集:

  • 頂いたアドバイスによると
  • Windows でshell=True呼び出すときにパラメーターを追加しました。check_outputコマンドは単純な「dir」であるため、危険ではありません。

.

self.client, address = self.sock.accept()

...

cmd = bytes.decode(self.client.recv(4096))

ls: システム コマンドを実行しますが、ディレクトリの内容のみを読み取ります。

if cmd == 'ls':
    if self.linux:
        output = subprocess.check_output(['ls', '-l'])
    else:
        output = subprocess.check_output('dir', shell=True)
    self.client.send(output)

cd: を呼び出すだけos.chdirです。

elif cmd.startswith('cd '):
    path = cmd.split(' ')[1].strip()
    if not os.path.isdir(path):
        self.client.send(b'is not path')
    else:
        os.chdir(path)
        self.client.send( os.getcwd().encode() )

get: ファイルの内容をクライアントに送信します。

elif cmd.startswith('get '):
    file = cmd.split(' ')[1].strip()
    if not os.path.isfile(file):
        self.client.send(b'ERR: is not a file')
    else:
        try:
            with open(file) as f: contents = f.read()
        except IOError as er:
            res = "ERR: " + er.strerror
            self.client.send(res.encode())
            continue

        ... (send the file contents)
4

2 に答える 2

2

クライアント/サーバー シナリオの典型的な問題は次のとおりです。

  • クライアントによって決定されたコマンドを実行するようにサーバーをだます。最も明白な形式では、これは、サーバーがクライアントにコマンドの実行を許可した場合に発生します (はい、ばかげています)。ただし、これは、クライアントがコマンド パラメータしか指定できないshell=Trueが使用されている場合にも発生する可能性があります。たとえばsubprocess.check_output('dir %s' % dir, shell=True)、クライアント提供のdir変数を使用すると、セキュリティ上の問題が発生し、次dirのような値になる可能性がありますc:\ && deltree c:\windows(シェルのコマンド ライン インタープリターの柔軟性により、2 つ目のコマンドが追加されました)。この攻撃の比較的まれなバリエーションは、クライアントが環境変数に影響を与えPATH、サーバーをだまして意図したものとは異なるコマンドを実行させることです。
  • 組み込みのプログラミング言語関数の予期しない機能の使用。たとえば、fopen()PHP では、ファイルを開くだけでなく、URL もフェッチします。これにより、ファイル名を期待する機能に URL を渡し、サーバー ソフトウェアであらゆる種類のトリックを実行できます。幸いなことに、Python は健全な言語です。つまりopen()、ファイルだけで動作します。それでも、クライアントから提供された情報 ( SQL インジェクション)を使用して SQL クエリが動的に生成される場合、たとえばデータベース コマンドは問題になる可能性があります。
  • 許可された領域外のデータを読み込んでいます。典型的なシナリオは、特定のディレクトリからのファイルの読み取りのみを許可するサーバーですが、../../../etc/passwdパラメーターとして渡すことで、任意のファイルを読み取ることができるサーバーです。もう 1 つの典型的なシナリオは、特定のファイル拡張子 (例: .png)を持つファイルのみの読み取りを許可するサーバーpasswords.txt\0harmless.pngですが、他のタイプのファイルの読み取りは引き続き許可するようなものです。

これらの問題のうち、最後の問題のみがコードに存在するようです。実際、サーバーは、クライアントが読み取りを許可されているディレクトリとファイルをまったくチェックしていません。これは潜在的な問題であり、クライアントが機密ファイルを読み取れる可能性があります。

于 2014-07-06T19:20:53.050 に答える