1.MD5()漏洞
php在处理字符串时会利用!=,||,==进行hash值的比较 他把每一个“0E’开头的哈希值都解释为0,因此如果两个不同的密码经过hash处理之后都是以‘0e’开头,那么PHP会认为两者是相同的,南京邮电大学一次ctf上就出了一道这个题。一些经md5()后以0e开头的例子
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
验证一下这个现象。
<?php if(md5("s155964671a")==md5("s214587387a")) { echo "successful"; } ?>
说到md5就还有一个经典案例就是
数组的MD5值都相等 都为NULL,
这里写了一小段代码
<?php if(isset($_GET['hsy']) and isset($_GET['zyg'])){ if($_GET['hsy']!=$_GET['zyg']) { if(md5($_GET['hsy'])==md5($_GET['zyg'])) echo "yes"; } } ?>
成立
2.strcmp()
strcmp(string $str1, string $str2);
比较str1和str2 如果长度1>2 返回1否则返回0
但是仅限于两者数据类型相同 如果s1是一个int型 s2是个string型就无法比较 返回的永远是0
写段代码
<?php $flag='123'; if(isset(($_GET['a']))){ if(strcmp($_GET['a'],$flag)==0) echo "yes"; else echo "no"; } ?>
刚才的说法是成立的
3.变量覆盖(GLOBLS)
我见过最常见的变量覆盖 也是最容易判断是否为变量覆盖的技巧就是审计代码时候看有没有出现$$这样的符号
<?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET['args'])){ $args = $_GET['args']; if(!preg_match("/^\w+$/",$args)){ die("args error!"); } eval("var_dump($$args);"); } ?>
这里面args变量在前面会有很多功能,但是只要在最后出现$$args 这就是一个全局变量。直接args=GLOBLS即可。
一个在阿里安全部的学长告诉我当你审计一个企业级10万行以上代码的程序不费劲的时候,基本就算顶尖安全工程师了。
剩下的好多还没想好怎么写容易理解,有时间慢慢写吧。