2

Web アプリケーションの侵入テストを行っており、2 つの関数を 1 つの URL に連結する必要があります。(はい、私はすでにこれこれをチェックしました)

このような正当な質問に対する適切な回答がない理由がわからなかったので、まったく同じコードを使用します。(ちなみに、これはバックドアなどに関するものではありません)

<?php 
    if(isset($_GET['function'])){ 
        $_GET['function'](); 
    } 
?> 

このようなものを作成する可能性はありますか? http://localhost/?function=shell_exec('ls') AND phpinfo

ご協力いただきありがとうございます。今回は、誰かが正当な質問を真剣に受け止めてくれることを願っています。論理的な理由もなく地獄に反対するのではありません。

4

2 に答える 2

1

ここには 2 つの問題があります。最初に質問に答えます。

配列にしないのはなぜですか?

URL:

http://localhost/?function[]=phpinfo&function[]=bob

コード:

$functions = (array)$_GET['function'];
foreach($functions as $function) {
    $function();
}

2 番目の問題は、上記のようにパラメーターを簡単に渡すことができないことです。最初に少し正規表現を行う必要があるかもしれませんが、その後は薄氷の上にいます。

これは大まかな推測ですが、次のようなものです。

$matches = [];
preg_match('/(\w+)\(('?(\w+)'?,?)+\)/', $functions, $matches);

次に、関数名とパラメーター (文字列である限り) を抽出し、パラメーターを使用して関数を呼び出すことができるはずです。しかし、その正規表現は明らかに危険です:/

于 2015-04-16T09:39:50.033 に答える
0

それは非常に危険に見えます。次のように、関数ごとにセミコロンで区切られた文字列を渡すことができます。

http://localhost/?function=shell_exec('ls');phpinfo

したがって、実際のコードは次のようになります。

if(isset($_GET['function'])){ 
        $functions =  explode(';',$_GET['function']); 
        foreach($functions as $function){ 
                $function(); 
        } 
} 

eval次の関数を使用することもできます。

http://localhost/?function=?eval=shell_exec('ls');phpinfo();

eval($_GET['eval']);以下のコメントで示唆されているように、その後に が続きます。

于 2015-04-16T09:33:49.743 に答える