解説
http://easyphp.ctf.euristica.in/ にアクセスすると以下の PHP のコードが表示される。
|
コードを読むと以下の部分はすぐにわかる。
- クエリ文字列パラメータを指定することで1つ目 (と2つ目) の
if
を突破できる- 1つ目のif:
if(isset($parsed["query"]))
- 2つ目のif:
if($parsed_query!=NULL)
- 1つ目のif:
$action
には?action=xxxx
で指定した値が入るので、?action=auth
とすれば3つ目のif
が突破できる- 3つ目のif:
if($action==="auth")
- 3つ目のif:
問題は4つ目の if($hashed_input!==$hashed_key)
をどうするかという感じ。
この問題では parse_str に着目する。マニュアルによると
URL 経由で渡されるクエリ文字列と同様に encoded_string を処理し、現在のスコープに変数をセットします。
parse_str ( string $encoded_string [, array &$result ] ) : void
と説明がある。つまり、定義済みの変数を上書きするようだ・・・。($parsed_query = parse_str($query);
このように代入してるけど無意味)
ここまでわかればあとは簡単で、方針は以下の通り
$hashed_input
と$hashed_key
を同じ値にしたい$hashed_key
は変更できない感じがあるが、実際にはクエリパラメータにhashed_key=xxxx
を渡せばparse_str
により任意の値に上書きできる$hashed_input
は与えられた文字列をsha256
でハッシュ化しているだけ
以上のことから http://easyphp.ctf.euristica.in/?action=auth&hashed_key=ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb&key=a のようなURLにアクセスすればフラグゲット
フラグ
flag{ezPz_pHp_0b9fd0f8}