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}