Diberikan sebuah website beserta source code nya. Tampilan awal web tersebut hanya terdapat form login dan register. fungsi web tersebut adalah online editor, fungsi editor sendiri akan muncul setelah user login. Berikut daftar file source code yang diberikan

Snippet editor.php

if (preg_match("/exec|system|passthru|`|proc_open|popen/", strtolower($_POST["method"].$_POST["text"])) != 0) {
    exit("Do you really think you could pass something to the command line? Functions like this are often disabled! Maybe have a look at the source?");
}
...............
    $editedText = preg_replace_callback("/" . $_POST["regex"] . "/", function ($matches) {
        return call_user_func($_POST["method"], $matches[0]);
    }, $_POST["text"]);
    if($editedText) {
        echo("<div class='alert success'>" . $editedText . "</div>");
    }

Snippet index.php

    if($_SESSION["user"]){
        echo "<div class='alert success'>login sucessful</div>";
        if($_SESSION["user"]->getName() === "admin"){
            echo "<div class='alert success'>" . shell_exec("/usr/bin/get_flag") . "</div>";
        }
    }

Dari source code editor.php, diketahui text inputan akan di edit akan dicocokan dengan regex lalu me return hasil dari fungsi call_user_func. fungsi dari call_user_func adalah untuk memanggil suatu fungsi, yang dimana parameter pertama nya adalah nama fungsi itu sendiri dan paramter kedua adalah parameter untuk fungsi yang ingin dipanggil.

call_user_func(“system”,“id”) akan memanggil fungsi system(“id”). Tapi karena terdapat filter nama fungsi, fungsi untuk eksekusi external program tidak bisa di digunakan. Karena parameter untuk nama fungsi di ambil dari $_POST[“method”] dalam hal ini kita bisa memanipulasi nama fungsi yang dipanggil call_user_func dengan memodifikasi value dari method itu sendiri via inspect element.

        <select name="method">
            <option value="" disabled selected>select a method</option>
            <option value="strtoupper">to upper case</option>
            <option value="strtolower">to lower case</option>
            <option value="ucfirst">first letter to upper case</option>
        </select>

Berdasarkan source code index.php, lokasi flag berada di ”/usr/bin/get_flag". Oleh karena itu bisa digunakan fungsi readfile untuk membaca isi dari /usr/bin/get_flag.

Gunanya regex : ^[ -~]+$ adalah agar match dengan semua dengan karakter yang di input pada bagian text.

Setelah disubmit, akan muncul isi dari /usr/bin/get_flag. tinggal CTR + F “hxp” untuk mendapatkan string Flag.

Flag : hxp{Th1s_w2sn’t_so_h4rd_now_do_web_of_ages!!!Sorry_f0r_f1rst_sh1tty_upload}