2016-09-30 9 views
2

私は$flagを取得するために何をすべきどこにこのPHPコードの脆弱性がありますか?

<?php 
    include("./config.php"); 

    $foo = $_GET['______foo_adm1nkyj______']; 
    $check = urldecode($_SERVER['QUERY_STRING']); 

    if(preg_match("/_| /i", $check)) 
    { 
     die("no hack ~_~"); 
    } 
    if($foo == "adm1nkyj") 
    { 
     echo $flag; 
    } 

    echo "<br/>"; 
    highlight_file(__FILE__); 
    ?> 

codeshell.krの問題を解決していますか? これらのコードの脆弱性は何ですか?それは$_GETにありますか?またはpreg_match()?私はGoogleで検索しているにもかかわらず、それを見つけることができません。

+1

問題は、 'preg_match()'がURLの '_ ______ foo_ad1nkyj ____ = someValue'をチェックし、' die() 'メソッドを実行するということです。 altコードですか?これは正確にこの質問のサイトではなく、プログラム可能な質問ではないので、私は下降しています。 – KDOT

答えて

4

解決策はこれです:

http://123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj 

PHPはリクエストデータ配列のキーでアンダースコアにドットとスペースを置き換えるので、それが動作します($_GET$_POST$_REQUEST,$_COOKIE)。 PHP docsから

注:ドット、変数名にスペースはアンダースコアに変換されます。例えば、<input name="a.b" />$_REQUEST["a_b"]になります。

これはおそらく、レジスタのグローバルが依然として問題であった時代からの遺物です。

+1

ありがとう!!!あなたは天才でなければなりません!! –

2

この問題は、あなたが知っている限り、実際には非常に簡単です。php GET変数名のドットをアンダースコアで置き換えます。

スクリプトは、GET変数にアンダースコアがあるかどうかをチェックし、そうであれば死ぬ。したがって、GET変数値をチェックするポイントに到達することはできません。しかし、アンダースコアをドットで置き換えると、それは通過します。

ただ、このURLを呼び出す:

123.111.158.161/codeshell/prob2/?......foo.adm1nkyj......=adm1nkyj 
関連する問題