0

raw_input()プロンプトを使用して別のオブジェクトのコードを実行し、これを安全な方法で実行する方法を探しています。

私には2つのクラスがあり、1つ目は、外部からも内部からも呼び出すことのないメソッドを持っています。2つ目は、次のように構築されたユーザーの要求を解析するメソッドを持っています: "method-to-call arg1arg2..."。例:「add53」。また、メソッド「do_add」は、引数として5と3を使用して呼び出されます。

class Obj1 :

    # ...

    def do_forbidden(self) :
        # Not supposed to execute

    # ...

class Obj2 :

    # ...

    def process_cmd(self, cmd) :
        words = cmd.split()
        if len(words) > 0 :
            mthdname = 'do_' + words[ 0 ]
            args = words[1:]

            if hasattr(self, mthdname):
                mthd = getattr(self, mthdname)
                mthd(*args)

    # ...

それで :

obj1 = Obj1()
obj2 = Obj2()
# ...
cmd = raw_input("Command : ")
obj2.process_cmd(cmd)

ここで、obj1から「do_forbidden()」を実行できるものを入力する方法はありますか?そして、raw_input()の代わりにinput()は違いを生みますか?

エクスプロイトが実際に可能である場合、攻撃者はそれを実行するために「メソッドの名前の1つを推測する」ことができます。それでは、プレフィックス「do_」は適切な保護ですか?

4

1 に答える 1

2

これを悪用することはできません。do_もちろん、いずれかの方法に他の脆弱性がない限り。process_cmdから呼び出されたのと同じオブジェクトで定義されていないメソッドを実行することはできません。

inputまったく別のことになるでしょう、それはあなたがあなたが望むものについて実行することを可能にします。

于 2012-06-28T12:19:29.840 に答える