前言
文章同步于我的个人博客https://quan9i.top/phpcompare 在看一些ctf简单题时发现大多用到了== 和=== 这些,因此对其进行总结学习,希望下一次看到的时候可以直接解决,知识汇总如下,希望对正在学习的师傅们有所帮助
哈希算法
哈希算法的定义如下
哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的
输出摘要。 哈希算法最重要的特点就是: 相同的输入一定得到相同的输出; 不同的输入大概率得到不同的输出。
常用的哈希算法有:
算法 输出长度(位) 输出长度(字节)
MD5 128 bits 16 bytes
SHA-1 160 bits 20 bytes
RipeMD-160 160 bits 20 bytes
SHA-256 256 bits 32 bytes
SHA-512 512 bits 64 bytes
php与哈希算法
有一种哈希算法加密后得出的特殊形式是0e +xxx(数字) 的组合。而php在处理这种字符时,统一将其视为0,测试如下 之所以出现这种情况,是因为php中科学计数法的表示方法是与此类似的,举个栗子,十的十次方 用php来表示的话就是1e10 ,二×十的十次方 就是2e10 ,测试如下 此时我们再看0exxx 这种,那么php就会将它视为是科学计数法,从而以0×10的xxx次方 来进行计算,此时的话我们就可以看出,无论它怎么算都是0,因此就出现两者值相等的情况
php弱比较
php弱比较指的是== 这种,两个== 的时候它的计算方法是先将其转换成同种类型,再进行计算,也就相当于此时它是只比较值的,因此也就出现了php弱比较漏洞,我们也因此实现了绕过
0X01
<?php
if($_POST['a']!=$_POST['b']&& md5($_POST['a'])==md5($_POST['b'])){
die("success!");
}
else
{
echo"hacker";
}
show_source(__FILE__);
?>
可以看出条件是要求两者不相等但md5值需要相当,我们知道md5是哈希算法的一种,因此此时我们就想到了用0e 这种方法来进行绕过,因此我们就需要找出几个字符串,让它进行md5加密后为0e 这种的,在学习过其他师傅的笔记后,得知下面几个字符串经md5加密后为0e 格式
aabg7XSs
aabC9RqS
s878926199a
QNKCDZO
240610708
测试结果如下 因此这里的话我们就可以用这几个来实现绕过
0X02
<?php
$flag='flag{quan9i is best}';
if ($_GET['name']!=$_GET['pwd']){
if (md5($_GET['name'])==md5($_GET['pwd'])){
echo $flag;
}
}
?>
可以看到是先比较用户名和密码是否值相同,不同时再将连两者分别进行md5加密,再进行弱比较,本来是没有什么问题的,但是这里用了md5加密,md5加密的话我们就会想到0e ,此时再用那些经过md5加密后变为0e 格式的,即可实现绕过
php强比较
<?php
if($_POST['a']!==$_POST['b']&& md5($_POST['a'])===md5($_POST['b'])){
die("success!");
}
?>
强比较指的是=== ,此时不仅检测值,而且检测是否为同一类型,因此就无法用上面的方法来进行绕过了 ,这里绕过的话需要用到数组,,我们知道php中md5 函数要求的我们放在里面的应该是string类型的,那这里我们放入一个数组的话,它既不会报错,也不会解析它的值,这时候两者都报出了相同的错误,那是不是就构成了相等,我们的数组在echo时输出都为array ,经过md5加密后全为null,因此可以进行绕过,测试如下 ,因此我们这里构造构造如下payload即可绕过
a[]=1&b[]=2
|