unserialize函数问题
知识补充
对单一的已序列化的变量进行操作,将其转换回 PHP 的值。
key和value是我们可以通过POST数据传入的值,我们把它传入bool值,unserialize函数解析为了数组,下面又因为使用的是 ==,根据php弱类型,bool值跟任何字符串都相等。
故判断成立输出了OK。
strpos函数问题
知识补充
strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int
返回 needle 在 haystack 中首次出现的数字位置。
问题的出现依然是出现了0=="admin"的弱类型比较的问题。
php中的哲学问题
(代码中还有哲学问题?)
因为以前老师问过我们这个问题,为什么呢,用一句模糊的话来说"无限接近就是相等"。
in_array()函数问题
知识补充
in_array( mixed $needle , array $haystack [, bool $strict = false ] ) : bool
— 检查数组中是否存在某个值,若第三个参数strict为默认的false,则使用松散比较。
这是便我们尝试对比的结果了。
相关题目(php审计题目):
首先我们发现in_array()并没有使用第三个参数,所以为默认值,可以进行松散比较。我们只要再*.php前面加上一个在range(1,24),比如23a.php。
array_search()问题
array_search ( mixed $needle , array $haystack [, bool $strict = false ] ) : mixed
— 在数组中搜索给定的值,如果成功则返回首个相应的键名,与in_array()函数类似。
strcmp()函数问题
知识补充
比较两个字符串(区分大小写)
strcmp(string1,string2)
返回值:
• 0 - 如果两个字符串相等
• <0 - 如果 string1 小于 string2
• >0 - 如果 string1 大于 string2
测试缺陷的方法和MD5函数类似,我们不给予这个函数string类型,而是给它array类型的值。
发现它依然是给出警告,但依然判断为ture,打印出了ok。(题目来自南京邮电大学网络攻防训练平台-pass check)
<?php $pass=@$_POST['pass']; $pass1=***********;//被隐藏起来的密码 if(isset($pass)) { if(@!strcmp($pass,$pass1)){ echo "flag:nctf{*}"; }else{ echo "the pass is wrong!"; } }else{ echo "please input pass!"; } ?> /* wp: <?php $k[]=1; var_dump(!strcmp($k, "flag")); printf("\n"); ?> */
switch相关的问题
如果switch的case是数字类型的判断的时候。switch会将参数转换为int类型。
不要慌张,继续加油哈。