PHP比较漏洞, 代码审计, 字符串数字, “0e“字符串, 布尔值比较, 极限值, switch比较, in_array比较

news/2024/11/23 13:10:09/

PHP比较漏洞

一, 字符串与数字比较,'0e’字符串比较

在 PHP 中处理字符串和数字比较时需要小心谨慎的重要性,尤其是在安全敏感的应用中。
在某些情况下,PHP 的类型强制转换可能会导致意外和潜在的安全漏洞。

var_dump("admin" == 0);  //true
var_dump("1admin" == 1); //true
var_dump("admin1" == 1); //false
var_dump("admin1" == 0); //true
var_dump("0e123456" == "0e4456789"); //true 

这段代码展示了 PHP 中的一些有趣且可能导致安全隐患的类型强制转换行为。让我们逐一分析每个表达式:

var_dump("admin" == 0);
在 PHP 中,当一个字符串与数字进行比较时,如果字符串不是以数字开始,则该字符串会被转换为数字 0。因此,“admin” 被转换为 0,所以 0 == 0 是 true。

var_dump("1admin" == 1);
在这个例子中,字符串 “1admin” 在尝试转换为数字时,会被解析为数字 1,因为它以 1 开始,忽略后续非数字字符。因此,1 == 1 是 true。

var_dump("admin1" == 1);
这里 “admin1” 作为字符串,不能转换为数字 1,因为它不是以数字开始的。它将被转换为 0。所以,0 == 1 是 false。

var_dump("admin1" == 0);
同上,“admin1” 转换为数字时变成了 0,所以 0 == 0 是 true。

var_dump("0e123456" == "0e4456789");
这是 PHP 类型强制转换中最有趣的一个例子。当一个字符串看起来像是科学记数法时(例如 “0e123456”),在与另一个类似结构的字符串比较时,它们都会被转换为数字 0。

这是因为 e 后面的数字被解释为指数,但由于前面的数字是 0,所以整个表达式的值为 0。
因此,两个看似不同的字符串在这种情况下会被认为是相等的。

二, Hash字符串比较

原理还是科学计数法字符串比较的问题.

测试1:
var_dump("0e123456789012345678901234567890" === "0"); //false
var_dump("0e123456789012345678901234567890" == "0"); //true

因为 e 后面的数字被解释为指数,但由于前面的数字是 0,所以整个表达式的值为 0。

测试2:
$pass = $_GET['password'];
$password = '0e342768416822451524974117254469';if (md5($pass) == $password) {echo "flag{xx-xx-xxxx-xxx}";
}
else {echo "error";
}

对于上面的代码那么只要是提交的密码的md5值是以0e开头的都会绕过, 比如.

?pwd=s1885207154a

除了使用===进行判断外,从 PHP 5.6 开始,hash_equals() 函数被引入,主要用于安全地比较两个字符串的哈希值,通常用于密码或敏感数据的验证。

hash_equals() 函数的关键特点:
1. 时间恒定的比较

这意味着函数在比较两个字符串时所花费的时间不依赖于字符串的内容。这是预防某些类型的定时攻击的重要特性,例如,在一些安全关键的应用场景中,攻击者可能尝试通过测量不同输入导致的响应时间差异来推断信息

2. 二进制安全

hash_equals() 安全地处理二进制数据,确保在比较过程中不会因为特殊字符(如 NULL 字节)而意外截断或错误处理。

3. 字符串比较

它专门用于比较字符串,而不是用于其他数据类型。

一个典型例子是在用户认证系统中比较用户输入的密码哈希值与存储在数据库中的哈希值:

$expected = '存储的哈希值';
$provided = hash('sha256', '用户输入的密码');if (hash_equals($expected, $provided)) {// 密码匹配
} else {// 密码不匹配
}

三, bool比较

1. 在json字符串中:
$str = '{"user":true, "pass":true}';
$data = json_decode($str, true);if($data['user'] == 'root' && $data['pass'] == 'myPass'){echo '登陆成功 获得flag{xx-ssss-xxxx}';
}else{echo '登陆失败!';
}

这里用户名和pass都是true, 由于使用的是==判断, 两个比较的结果都是true.

2. 在序列化字符串中:
$str = 'a:2:{s:4:"user";b:1;s:4:"pass";b:1;}';
$data = unserialize($str); if($data['user'] == 'root' && $data['pass'] == 'myPass'){print_r('获得flag{xx-ssss-xxxx}');
}else{print_r('失败!');
}

a:2: 表示一个数组,包含 2 个元素。
s:4:"user";b:1; 表示数组的第一个键值对。键是一个长度为 4 的字符串 “user”,值是布尔值 true(在 PHP 序列化格式中表示为 b:1)。
s:4:"pass";b:1; 表示数组的第二个键值对。键是一个长度为 4 的字符串 “pass”,值也是布尔值 true。
那么用户名和pass都是true, 绕过了判断.

四, 极限值比较

$a=98869694308861098395599991222222222222;
$b=98869694308861098395599992999999999999;
var_dump($a === $b);

虽然两个值不同, 但是比较的结果是true.

五, switch比较

PHP 中的 switch 语句是松散比较(==),而不是严格比较(===)。这意味着类型强制转换会发生。

$num = '3number';
switch($num){case 0:echo '000';break;case 1:echo '111';break;case 2:echo '222';break;case 3:echo '333';break;default:echo "error";
}

$num = '3number'; 时,由于进行松散比较,PHP 会尝试将这个字符串转换为数字。
由于字符串以数字 3 开始,其余部分在转换过程中将被忽略,因此 $num 被视为数字 3。
结果并不会输出error, 而是333.

六, in_array函数比较

在 PHP 中,in_arrayarray_search 函数在默认情况下使用松散比较(==)
如果没有明确设置 strict 参数为 true,这些函数会执行类型强制转换,可能导致一些非直观的结果。

$array = ['a', 0, 1, 2, '3'];
var_dump(in_array('abc', $array)); // bool(true) 
var_dump(array_search('abc', $array)); // int(1) 

in_array('abc', $array) 在比较 'abc' 和数组中的0时,由于'abc'在松散比较中会被视为 0(非数字开头的字符串在转换为数字时会成为 0),因此 in_array 会返回 true
同理,array_search('abc', $array) 在寻找'abc'时也会找到0这个元素的位置,因此返回 1


http://www.ppmy.cn/news/1230201.html

相关文章

记GitLab服务器迁移后SSH访问无法生效的问题解决过程

公司IT心血来潮对GitLab服务器进行安全升级,升级后无法启动。。。只得启用备用服务器,具体的备份机制不祥,只知道原数据都在,但文件系统是否完全一样不清楚。切换为备用服务器后使用SSH下载代码死活不成功,反复提示需要…

MATLAB实战应用案例精讲(二)-【图像处理】图像分类(附MATLAB代码实现)

目录 知识储备 图像分类、检测,语义分割 (1) 图像分类常用数据集 (2) 图像分类经典网络结构

【MySQL】聚合函数、group by、update、delete

聚合函数、group by、update、delete 前言正式开始update将孙悟空同学的数学成绩变更为 80 分将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分将总成绩倒数前三的 3 位同学的数学成绩加上 30 分将所有同学的语文成绩更新为原来的 2 倍 delete删除孙悟空同…

基于单片机K型热电偶温度采集报警系统

**单片机设计介绍, 基于单片机K型热电偶温度采集报警系统 文章目录 一 概要简介系统特点系统组成工作原理应用领域 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于单片机K型热电偶温度采集报警系统介绍 简介 该系统是基于单片…

网络工程师-HCIA网课视频学习

这里是速成的,只积累下,自己未曾学习到的东西。通过书本补充知识点。 视频:hcia17-链路聚合_哔哩哔哩_bilibili hcia16-路由高级特性: hcia17-链路聚合: 由于如果根据视频来学习的话,感觉视频的总结并不…

【机器学习】038_梯度消失、梯度爆炸

一、原因 神经网络梯度 假设现在有一个 层的神经网络,每层的输出为一个对输入作 变换的函数结果 用 来表示第 层的输出,那么有下列公式: 链式法则计算损失 关于某一层某个参数 的梯度: 注意到, 为向量&am…

EI论文程序:Adaboost-BP神经网络的回归预测算法,可作为深度学习对比预测模型,丰富实验内容,自带数据集,直接运行!

适用平台:Matlab 2021及以上 本程序参考中文EI期刊《基于Adaboost的BP神经网络改进算法在短期风速预测中的应用》,程序注释清晰,干货满满,下面对文章和程序做简要介绍。 为了提高短期风速预测的准确性,论文提出了使用…

Django实战:从零到一构建安全高效的Web应用

目录 一、概述 二、版本控制和部署 1、Git版本控制 2、Docker部署 三、数据库配置 1、配置数据库设置 2、创建数据库模型 四、URL路由和视图 1、定义URL路由 2、创建视图 五、模板渲染 1、创建模板 2、在视图中使用模板 总结 一、概述 Django是一个高级Python W…