1.MD5 compare漏洞
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
常见的payload有
0x01 md5(str) QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a sha1(str) sha1('aaroZmOk') sha1('aaK1STfY') sha1('aaO8zKZF') sha1('aa3OFF9m')0x02 md5(md5(str)."SALT") 2123456789101112131415
同时MD5不能处理数组,若有以下判断则可用数组绕过
if(@md5($_GET['a']) == @md5($_GET['b'])) { echo "yes"; }//http://127.0.0.1/1.php?a[]=1&b[]=212345
2.ereg函数漏洞:00截断
ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE1
字符串对比解析
在这里如果 $_GET[‘password’]为数组,则返回值为NULL
如果为123 || asd || 12as || 123%00&&&**,则返回值为true
其余为false
3.变量本身的key
说到变量的提交很多人只是看到了GET/POST/COOKIE等提交的变量的值,但是忘记了有的程序把变量本身的key也当变量提取给函数处理。
<?php //key.php?aaaa'aaa=1&bb'b=2 //print_R($_GET); foreach ($_GET AS $key => $value) { print $key."\n"; } ?>123456789101112131415
4.变量覆盖
extract()这个函数在指定参数为EXTR_OVERWRITE或者没有指定函数可以导致变量覆盖
<?php $auth = '0'; // 这里可以覆盖$auth的变量值 extract($_GET); if($auth == 1){ echo "private!"; } else{ echo "public!"; } ?>12345678910
<?php $a='hi';foreach($_GET as $key => $value) { echo $key; $$key = $value; }print $a;?>123456789
5.strcmp
如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
5.2 中是将两个参数先转换成string类型