array_search()的不严格检测问题

来源:互联网 发布:知英日剧 编辑:程序博客网 时间:2024/04/28 00:36

原题:

<?php show_source(__FILE__); $a=0; $b=0; $c=0; if (isset($_GET['x1'])) {         $x1 = $_GET['x1'];         $x1=="1"?die("ha?"):NULL;         switch ($x1)         {         case 0:         case 1:                 $a=1;                 break;         } } $x2=(array)json_decode(@$_GET['x2']); if(is_array($x2)){     is_numeric(@$x2["x21"])?die("ha?"):NULL;     if(@$x2["x21"]){         ($x2["x21"]>2017)?$b=1:NULL;     }     if(is_array(@$x2["x22"])){         if(count($x2["x22"])!==2 OR !is_array($x2["x22"][0])) die("ha?");         $p = array_search("XIPU", $x2["x22"]);         $p===false?die("ha?"):NULL;         foreach($x2["x22"] as $key=>$val){             $val==="XIPU"?die("ha?"):NULL;         }         $c=1; } } if($a && $b && $c ){     echo 'you get flag!'; }else{echo 'try again!';}?>

题目最终flag要求是a,b,c都为1,第一个a为1很简单,只要x1不为1就好了,接下来是b为1和c为1的条件

根据源码可知x2应该是一个json格式的字符串,经过解析后应该是一个数组,b=1的条件是键值对“x21"对应的值不能是纯数字而且要大于2017,这个就好说话了,如果是数字加字符的话很明显is_numeric()判断会不成功,字符串与数字进行大小比较,php会把字符串把前面能转换的字符转换成数字进行比较,如"2018a”>2017会把"2018a“转换成2018后与2017进行比较,这样就可以绕过第二个判断了

再来看第三个c=1的过程,首先x2的json语句中键值x22对应的值应该是一个长度为2的祝,而且数组下标为0的值所对应的值也应该是一个数组,关键就在于array_search()这里

array_search()是有第三个缺省参数的,默认为false,如果设置为true就是严格检测,默认为false的情况下就是不严格检测,不严格检测的话问题就相当于不进行类型比较而进行值的比较,就是类似于===和==

那么是0==”xxx",进行0和任意字符串的比较,php会把字符串转换成数值0,值比较,OK!

那么结果也就出来了:


阅读全文
0 0
原创粉丝点击