PHP函数黑魔法 ##web
1. md5(), shea1()
md5()是不能处理数组的,md5(数组)会返回null, 两个null相等绕过. 同理sha1()一样
echo "---------------- md5(),sha1()黑魔法 -------------------------"; echo "<br>";echo "<br>"; if (md5($md5_bug1[]=1) === md5($md5_bug2[]=1)){ if (sha1($md5_bug1[]=1) === sha1($md5_bug2[]=1)){ echo "md5传入数组绕过成功"; } }2.intval() intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。 即使出现无法转换的字符串,intval()不会报错而是返回0。 注: 在科学计数法字符串转换为数字时,如果 E 后面的数小于某个值会弄成 double 类型,再强制转换为 int 类型时可能会有奇妙的结果,测试发现某变量为 1e-1000 时已经可以触发这个漏洞绕过两个检查,使得某变量既大于 0 又不大于 0。
echo "2 的intval()转换结果:",intval('2'); echo "<br>"; echo "3abcd 的intval()转换结果:",intval('3abcd'); echo "<br>"; echo "abcd 的intval()转换结果:",intval('abcd'); echo "<br>";echo "<br>"; $intval_bug = '1e-1000'; if ((int)($intval_bug) > 0) { if ($intval_bug <= 0) { echo "intval()转换问题绕过成功"; } }3.strcmp() strcmp()函数只有在相等的情况下返回0。 那么我们传入一个数组,它会返回NULL,而判断使用了==,而NULL==0是bool(true),这样就成功绕过。
$strcmp_bug[]=1; if (@strcmp($strcmp_bug, "you_don't_know_this_string") == 0){ echo "strcmp()数组黑魔法绕过成功"; }4.ereg() 字符串对比解析,ereg函数存在NULL截断漏洞,当ereg读取字符串string时,如果遇到了 ,后面的字符串就不会被解析。 注: 这里的 是需要urldecode才可以截断的,这是url终止符,且 长度是1不是3
$input = urldecode('1e8 *-*'); // echo strlen($input); #7 if (isset($input)){ if (@ereg ("^[a-zA-Z0-9]+$",$input) === FALSE){ echo $input; echo '输入只能是数字和字母!'; } else{ echo "ereg() 截断绕过成功"; } }5.is_numeric() 当有两个is_numeric判断并用and连接时,and后面的is_numeric可以绕过 16进制也可以绕过is_numeric()检验,可以用来绕过sql注入里的过滤
$is_numeric1 = "0123"; $is_numeric2 = "abc"; $c=is_numeric($is_numeric1) and is_numeric($is_numeric2); if ($c) { if (is_numeric(' +.1234e5678')) { echo "is_numeric()连用漏洞绕过"; # 这样也能绕过检测…… } }6.switch() 当switch没有break时可以继续往下执行。
@$switch_bug = 0; if (isset ( $switch_bug )) { switch ($switch_bug) { case 0 : echo '你已经运行到了case0'; echo "<br>"; case 1 : echo '你已经运行到了case1'; echo "<br>"; case 2 : echo '你已经运行到了case2'; echo "<br>"; echo "switch()没有break连续运行绕过成功"; break; default : echo "1"; break; } }