下午好🌅🌅🌅
本答案参考ChatGPT-3.5
在给出的代码中,有三个if条件判断需要绕过才能输出flag。具体解答如下:
-
绕过第一个条件判断:
第一个条件判断需要$_GET数组中存在val1和val2两个参数,并且其值不相等。为了绕过这个判断,我们可以构造URL,使得val1和val2的值相等,例如?val1=abc&val2=abc。这样,第一个条件判断就会失败。
-
绕过第二个条件判断:
第二个条件判断需要$md5变量的值存在,并且等于自身的MD5哈希值。为了绕过这个判断,我们可以构造URL,使得$md5不存在或者不等于其MD5哈希值,例如?md5=test。这样,第二个条件判断就会失败。
-
绕过第三个条件判断:
第三个条件判断需要$XY变量的值等于$XYCTF变量的值,并且$XY的MD5哈希值等于MD5("XYCTF_550102591")。为了绕过这个判断,我们可以构造URL,使得$XY的值不等于XYCTF_550102591变量的值,例如?XY=test。然后,我们需要找到一个字符串,使得它的MD5哈希值等于MD5("XYCTF_550102591")。我们可以利用MD5碰撞的特性,找到另一个字符串,其MD5哈希值与XYCTF_550102591的MD5哈希值相同。例如,找到一个字符串$collison,使得md5($collision) = md5('XYCTF_550102591'),然后将$collision的值赋给$XY,构造URL为?XY=collision。这样,第三个条件判断就会失败,输出flag。
综上所述,我们可以绕过三个条件判断,输出flag的URL为:?val1=abc&val2=abc&md5=test&XY=collision。
修正后的代码如下所示:
highlight_file(FILE);
$XYCTF = "Warm up";
extract ($_GET);
if (isset($_GET['val1']) && isset($_GET['val2']) && $_GET['val1'] != $_GET['val2'] && md5($_GET['val1']) == md5($_GET['val2'])){
echo "ez"."
";
} else {
die("1");
}
if (isset($md5) && $md5 == md5($md5)){
echo "ezez"."
";
} else {
die("2");
}
if ($XY == $XYCTF && $XY != "XYCTF_550102591" && md5($XY) == md5("XYCTF_550102591")){
echo "flag";
} else {
die("3");
}