はまやんはまやんはまやん

hamayanhamayan's blog

PHP İnformation [DarkCTF]

PHP İnformation
SaltanatNaibi
Let's test your php knowledge.
Flag Format: DarkCTF{}
http://php.darkarmy.xyz:7001

ソースコードが与えられる

include "flag.php";
echo show_source("index.php");

if (!empty($_SERVER['QUERY_STRING'])) {
    $query = $_SERVER['QUERY_STRING'];
    $res = parse_str($query);
    if (!empty($res['darkctf'])){
        $darkctf = $res['darkctf'];
    }
}

if ($darkctf === "2020"){
    echo "<h1 style='color: chartreuse;'>Flag : $flag</h1></br>";
}

if ($_SERVER["HTTP_USER_AGENT"] === base64_decode("MjAyMF90aGVfYmVzdF95ZWFyX2Nvcm9uYQ==")){
    echo "<h1 style='color: chartreuse;'>Flag : $flag_1</h1></br>";
}

if (!empty($_SERVER['QUERY_STRING'])) {
    $query = $_SERVER['QUERY_STRING'];
    $res = parse_str($query);
    if (!empty($res['ctf2020'])){
        $ctf2020 = $res['ctf2020'];
    }
    if ($ctf2020 === base64_encode("ZGFya2N0Zi0yMDIwLXdlYg==")){
        echo "<h1 style='color: chartreuse;'>Flag : $flag_2</h1></br>";
    }
}

if (isset($_GET['karma']) and isset($_GET['2020'])) {
    if ($_GET['karma'] != $_GET['2020'])
    if (md5($_GET['karma']) == md5($_GET['2020']))
        echo "<h1 style='color: chartreuse;'>Flag : $flag_3</h1></br>";
    else
        echo "<h1 style='color: chartreuse;'>Wrong</h1></br>";
}
?>

上から攻略していく

if (!empty($_SERVER['QUERY_STRING'])) {
    $query = $_SERVER['QUERY_STRING'];
    $res = parse_str($query);
    if (!empty($res['darkctf'])){
        $darkctf = $res['darkctf'];
    }
}
if ($darkctf === "2020"){
    echo "<h1 style='color: chartreuse;'>Flag : $flag</h1></br>";
}

$_SERVER['QUERY_STRING']x=yみたいにGETパラメタ部分が丸々でてくる。
パースして色々しているので、素直に?darkctf=2020をつける。
Flag : DarkCTF{ ok

2つ目

if ($_SERVER["HTTP_USER_AGENT"] === base64_decode("MjAyMF90aGVfYmVzdF95ZWFyX2Nvcm9uYQ==")){
    echo "<h1 style='color: chartreuse;'>Flag : $flag_1</h1></br>";
}

とりあえずCyberChefでbase64デコードする。
MjAyMF90aGVfYmVzdF95ZWFyX2Nvcm9uYQ== -> 2020_the_best_year_corona
Burp Suiteで止めてUser-Agentを改ざんすると、2つ目が出てくる。
Flag : very_

3つ目

if (!empty($_SERVER['QUERY_STRING'])) {
    $query = $_SERVER['QUERY_STRING'];
    $res = parse_str($query);
    if (!empty($res['ctf2020'])){
        $ctf2020 = $res['ctf2020'];
    }
    if ($ctf2020 === base64_encode("ZGFya2N0Zi0yMDIwLXdlYg==")){
        echo "<h1 style='color: chartreuse;'>Flag : $flag_2</h1></br>";
    }
}

ZGFya2N0Zi0yMDIwLXdlYg==を更にbase64エンコードしたものをctf2020としてGETで与える。
ZGFya2N0Zi0yMDIwLXdlYg== -> WkdGeWEyTjBaaTB5TURJd0xYZGxZZz09
/?ctf2020=WkdGeWEyTjBaaTB5TURJd0xYZGxZZz09 -> Flag : nice

4つ目

if (isset($_GET['karma']) and isset($_GET['2020'])) {
    if ($_GET['karma'] != $_GET['2020'])
    if (md5($_GET['karma']) == md5($_GET['2020']))
        echo "<h1 style='color: chartreuse;'>Flag : $flag_3</h1></br>";
    else
        echo "<h1 style='color: chartreuse;'>Wrong</h1></br>";
}

karmaと2020について、以下2つの条件を満たすように与えればいい。

  • $_GET['karma'] != $_GET['2020']がtrue
  • md5($_GET['karma']) == md5($_GET['2020'])がtrue

phpmd5の弱い比較で一致といえばMagicHashなので、適当に取ってくる。
/?karma=QNKCDZO&2020=240610708 -> Flag : _web_challenge_dark_ctf}

よって、答えはDarkCTF{very_nice_web_challenge_dark_ctf}