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

本文主要是介绍PHP比较漏洞, 代码审计, 字符串数字, “0e“字符串, 布尔值比较, 极限值, switch比较, in_array比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于PHP比较漏洞, 代码审计, 字符串数字, “0e“字符串, 布尔值比较, 极限值, switch比较, in_array比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397874

相关文章

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

修复已被利用的高危漏洞! macOS Sequoia 15.6.1发布

《修复已被利用的高危漏洞!macOSSequoia15.6.1发布》苹果公司于今日发布了macOSSequoia15.6.1更新,这是去年9月推出的macOSSequoia操作... MACOS Sequoia 15.6.1 正式发布!此次更新修复了一个已被黑客利用的严重安全漏洞,并解决了部分中文用户反馈的

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级