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']
がtruemd5($_GET['karma']) == md5($_GET['2020'])
がtrue
php+md5の弱い比較で一致といえばMagicHashなので、適当に取ってくる。
/?karma=QNKCDZO&2020=240610708
-> Flag : _web_challenge_dark_ctf}
よって、答えはDarkCTF{very_nice_web_challenge_dark_ctf}