私は来週参加するこのCTFチャレンジの準備をしています。オンラインでこの問題に遭遇しましたが、解決できませんでした。
チャレンジ関数が取得する変数$user
と$pass
の制御のみがあり、POSTリクエストの一部として送信できます。チャレンジ関数をtrueに戻す必要があります。
空の配列をパスワードとして(パスワードフィールド名をpass[]
に変更して)送信しようとしましたが、正規表現関数では許可されません。
<?php
//by Mawekl
//more challenges coming soon ;)
function validateuser($user)
{
#Check username
if(!preg_match('/^[A-Z][a-z]{1,15}$/',$user))
die('Are you stupid hacker? Don\'t try inject my script!');
}
function validatepass($pass)
{
#Check password (injection attempt?)
if(!preg_match('/^[A-Za-z0-9_ ]+$/',$pass))
header('Location: http://piv.pivpiv.dk/');
#kick away stupid hacker!
}
function challenge($user, $pass) //Objective: return TRUE
{
$users = array(
"Admin" => $_VeryLongPasswords[0],
"Mawekl" => $_VeryLongPasswords[1]
);
validateuser($user);
validatepass($pass);
return ($users[$user] == $pass);
}
?>
スクリプトは、存在しないユーザー名と空のパスワードを使用してユーザーが存在するかどうかをチェックしないため、テストで成功します。
echo challenge('Foobar','') ? "MATCH\n":"nomatch\n";
PHP Notice: Undefined index: Foobar in ...
MATCH