发布时间: 2020-6-12 文章作者: myluzh 分类名称: PHP 朗读文章
"0e132456789"=="0e7124511451155" //true "0e123456abc"=="0e1dddada" //false "0e1abc"=="0" //true在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中2个数的值都是0因而就相等了。如果不满足0e\d+这种模式就不会相等。
<?php $a = md5('240610708'); // = 0e462097431906509019562988736854 $b = md5('QNKCDZO'); // = 0e830400451993494058024219903391 var_dump($a == $b); ?>返回结果bool(true)
var_dump(intval('2')) //2 var_dump(intval('3abcd')) //3 var_dump(intval('abcd')) //0说明intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0。
"0x1e240"=="123456" //true "0x1e240"==123456 //true "0x1e240"=="1e240" //false当其中的一个字符串是0x开头的时候,ox开头表示16进制,PHP会将此字符串解析成为十进制然后再进行比较,0×1e240解析成为十进制就是123456,所以与int类型和string类型的123456比较都是相等。
if (isset($_GET['name']) and isset($_GET['password'])) { if ($_GET['name'] == $_GET['password']) print 'Your password can not be your name.'; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else print 'Invalid password';name和password的值不能相同,其次,sha1加密之后的name和password的值又必须完全相同 我们知道,在php中,$a[] = 1;代表着$a[x] = 1;所以name[] = 1和password[]= 2相比较,可以跳过第一个判断,而如果使用sha1对一个数组进行加密,返回的将是NULL,NULL===NULL,这是成立的,所以构造两个数组绕过
string md5 ( string $str [, bool $raw_output = false ] )md5()中需要传入的是一个string类型的参数,当我们传递一个array时,它是不会报错的,函数无法求出array的MD5值,这样导致任意两个array的MD5值都相等,从而绕过输入数值的判断,在ctf代码审计中经常遇见。
int strcmp ( string $str1 , string $str2 )进行字符串长度的比较,传入两个string的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。如果传入的参数为数字或数组
$array=[1,2,3]; var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。例2:
if (isset($_GET['password'])) { if (strcmp($_GET['password'], $flag) == 0) die('Flag: '.$flag); else print 'Invalid password'; }此处使用strcmp()对pass和flag进行判断,如果==0,则输出flag。但是strcmp()函数只有在相等的情况下返回0。那么我们传入一个数组,它会返回NULL,而判断使用了==,而NULL==0是bool(true),这样就成功绕过。
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。
$array=[0,1,2,'3']; var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //true可以看到上面的情况返回的都是true,因为’abc’会转换为0,’1bc’转换为1。
int ereg(string pattern, string string, array [regs]);字符串对比解析,ereg函数存在NULL截断漏洞,当ereg读取字符串string时,如果遇到了%00,后面的字符串就不会被解析。
发表评论