当前位置:网站首页>php基于哈希算法出现的强弱比较漏洞
php基于哈希算法出现的强弱比较漏洞
2022-04-23 08:18:00 【quan9i】
前言
文章同步于我的个人博客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

版权声明
本文为[quan9i]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Reme_mber/article/details/124235010
边栏推荐
猜你喜欢

ansible自動化運維詳解(一)ansible的安裝部署、參數使用、清單管理、配置文件參數及用戶級ansible操作環境構建

Transformer XL: attention language modelsbbeyond a fixed length context paper summary

396. Rotate Function

洋桃电子STM32物联网入门30步笔记三、新建CubeIDE工程和设置讲解

'恶霸' Oracle 又放大招,各大企业连夜删除 JDK。。。

K210学习笔记(二) K210与STM32进行串口通信

Notes on 30 steps of introduction to Internet of things of yangtao electronics STM32 III. Explanation of new cubeide project and setting

stm32以及freertos 堆栈解析

Talk about the basic but not simple stock data

Overview of bus structure
随机推荐
Kubernetes如何使用harbor拉去私有镜像
form表单 post提交 数据量大的问题
Green apple film and television system source code film and television aggregation film and television navigation film and television on demand website source code
Protobuf简介
Notes on English class (4)
关于cin,scanf和getline,getchar,cin.getline的混合使用
HAL库的RCC简介
How to generate assembly file
Redis Desktop Manager for Mac(Redis可视化工具)
Detailed explanation of ansible automatic operation and maintenance (I) installation and deployment, parameter use, list management, configuration file parameters and user level ansible operating envi
洋桃电子STM32物联网入门30步笔记三、CubeMX图形化编程、设置开发板上的IO口
作文以记之 ~ 二叉树的前序遍历
okcc呼叫中心外呼系统智能系统需要用多大的盘存录音?
作文以记之 ~ 二叉树的后序遍历
Detailed description of self feeling of auricular point weight loss 0422
There are some problems when using numeric type to query string type fields in MySQL
Flink SQL实现流批一体
QT reading and writing XML files
ansible自動化運維詳解(一)ansible的安裝部署、參數使用、清單管理、配置文件參數及用戶級ansible操作環境構建
SYS_ CONNECT_ BY_ Path (column, 'char') combined with start with connect by prior