PHP-弱类型

参加ZCTF线下时遇到一个关于php弱类型的题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
error_reporting(0);
$l01o=0;
$o1l0=0;
$o10l=0;
$lo10=0;
if (isset($_GET['vhghf'])) //GET传入一个vhghf
{
$vhghf = $_GET['vhghf'];
$vhghf=="1"?die("ha?"):NULL; //如果vhghf等于1则退出
switch ($vhghf)
{
case 0:
case 1: //如果vhghf等于1则$101o等于1
$l01o=1;
break;
}
}
$dfgdf=(array)json_decode(@$_GET['dfgdf']); //GET传入dfgdf且进行json_decode且创建一个数组
if(is_array($dfgdf)){ //如果为数组则进行接下来的
is_numeric(@$dfgdf["gvnghdjk"])?die("ha?"):NULL; //判断dfgdf中的gvnghdjk是否为数字或数字字符串
if(@$dfgdf["gvnghdjk"]){
($dfgdf["gvnghdjk"]>2017)?$o1l0=1:NULL; //gvnghdjk大于2017
}
if(is_array(@$dfgdf["uxcndffznb"])){ //uxcndffznb要为数组
if(count($dfgdf["uxcndffznb"])!==2 OR !is_array($dfgdf["uxcndffznb"][0])) die("ha?"); //数组中有两个值,且第一个还要为数组
$kghdhfghdfgbcvhgffg = array_search("ZCTF", $dfgdf["uxcndffznb"]); //查询uxcndffznb中有没有ZCTF有则返回1没则返回false
$kghdhfghdfgbcvhgffg===false?die("ha?"):NULL; //如果为false则退出
foreach($dfgdf["uxcndffznb"] as $key=>$val){ //查询uxcndffznb中是否有ZCTF如果有则退出
$val==="ZCTF"?die("ha?"):NULL;
}
$o10l=1;
}
}
$cdggjydcnfsdyjaq = $_GET['cdggjydcnfsdyjaq']; //MD5碰撞
if ($cdggjydcnfsdyjaq != '15562') {
if (strstr($cdggjydcnfsdyjaq, '2017ZCTF')) {
if (substr(md5($cdggjydcnfsdyjaq),8,16) == substr(md5('15562'),8,16)) {
$lo10=1;
}
}
}
if($l01o && $o1l0 && $o10l && $lo10){
echo 'flag';
}
?>

共有四个比较

vhghf

$vhghf=="1"?die("ha?"):NULL;将vhghf与1进行比较,而且是双等号,直接1+任意字母绕过。

dfgdf[“gvnghdjk”]

dfgdf["gvnghdjk"]>2017与第一个相似,2018加任意字母绕过。

$dfgdf[“uxcndffznb”]

1
2
3
4
5
$kghdhfghdfgbcvhgffg = array_search("ZCTF", $dfgdf["uxcndffznb"]); //查询uxcndffznb中有没有ZCTF有则返回1没则返回false
$kghdhfghdfgbcvhgffg===false?die("ha?"):NULL; //如果为false则退出
foreach($dfgdf["uxcndffznb"] as $key=>$val){ //查询uxcndffznb中是否有ZCTF如果有则退出
$val==="ZCTF"?die("ha?"):NULL;
}

array_search是弱类型的比较,0双等于所有的无数字开头的字符串,可以用0去绕过array_search的比较

cdggjydcnfsdyjaq

MD5碰撞,线上赛有提及,0e+任意数字双等于0e+任意数字