第29天:PHP应用弱类型脆弱Hash加密Bool类型Array数组函数转换比较

#知识点:

1、安全开发-原生PHP-弱类型脆弱

2、安全开发-原生PHP-函数&数据类型

3、安全开发-原生PHP-代码审计案例

1=====

两个等号==是弱比较,使用==进行对比的时候,php解析器就会做隐式类型转换,如果两个值的类型不相等就会把两个值的类型转为同一类型进行对比。

==:弱比较运算符,进行比较时,PHP会尝试将两个值的类型进行隐式转换为相同的类型。

===:强比较运算符,要求类型和值都相等,不进行任何隐式转换。

在弱比较下,某些值之间可能因为隐式类型转换导致不符合预期的结果。例如:

if ("123abc" == 123) {echo "True"; // 输出 "True",因为 "123abc" 被转换为数字 123 进行比较
}

建议与修复:

总是优先使用 === 进行比较,避免隐式类型转换。

如果必须使用弱比较,明确了解隐式转换规则,并确保输入类型符合预期。

if ("123abc" === 123) {echo "True"; // 不会输出任何结果
}

2MD5对比缺陷

进行hash加密出来的字符串如存在0e开头进行弱比较的话会直接判定为true

QNKCDZO0e830400451993494058024219903391

md5(QNKCDZO,32) = 0e830400451993494058024219903391

2406107080e462097431906509019562988736854

md5(240610708,32) = 0e462097431906509019562988736854

s878926199a0e545993274517709034328855841020

md5(s878926199a,32) = 0e545993274517709034328855841020

MD5 哈希值以 0e 开头时,PHP 的弱比较会将其解释为科学计数法的数字 0。例如:

if (md5('QNKCDZO') == md5('240610708')) {echo "True"; // 输出 "True",因为两个哈希值都以 `0e` 开头,被解析为 0
}

安全隐患:这种比较方式会导致哈希碰撞,攻击者可以利用特定输入生成以 0e 开头的 MD5 值,从而绕过验证。

建议与修复:

不要使用弱比较 (==) 进行哈希值验证,应使用强比较 (===)。

使用更安全的哈希算法,如 hash_hmac 或 password_hash。

if (md5('QNKCDZO') === md5('240610708')) {echo "True"; // 不会输出任何结果
}

3 函数strcmp类型比较缺陷

低版本的strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。

在 PHP 的低版本中,strcmp() 函数只能用于比较字符串。如果传入非字符串参数,会返回 0,因为出错后 PHP 内部会返回相等的结果。

if (strcmp([], "string") == 0) {echo "True"; // 输出 "True",因为出错后返回 0
}

安全隐患:攻击者可以通过传入特殊类型的参数(如数组、对象)绕过逻辑判断。

建议与修复:

确保传入参数的类型始终是字符串。

使用显式类型检查或类型强制转换:

if (is_string($param1) && is_string($param2) && strcmp($param1, $param2) === 0) {echo "Strings are equal.";
}

4、函数Bool类型比较缺陷

在使用 json_decode() 函数或 unserialize() 函数时,部分结构被解释成 bool 类型,也会造成缺陷,运行结果超出研发人员的预期

使用 json_decode() 解析 JSON 字符串或 unserialize() 反序列化数据时,如果数据的结构意外被解析为布尔值,可能会引发逻辑错误。例如:

$json = 'false';
if (json_decode($json)) {echo "True"; // 不输出任何结果,但逻辑可能被绕过
}

安全隐患:攻击者可以构造特定的 JSON 数据或序列化数据,导致解析结果超出预期。

建议与修复:

显式检查解析结果的类型和结构:

$data = json_decode($json, true);
if (is_array($data) && isset($data['key'])) {// 进一步逻辑处理
}

5、函数switch 类型比较缺陷

当在switch中使用case判断数字时,switch会将参数转换为int类型计算

switch 语句中,PHP 会将 case 参数转换为整数类型进行比较。如果传入字符串类型的参数,可能会意外被转换为数字:

switch ("123abc") {case 123:echo "Matched"; // 输出 "Matched",因为 "123abc" 被转换为 123break;
}

安全隐患:攻击者可以通过构造特定输入绕过逻辑判断。

建议与修复:

避免在 switch 中混用不同类型的数据。

使用 === 替代 switch 语句中的隐式比较

$value = "123abc";
if ($value === 123) {echo "Matched";
}

6、函数in_array数组比较缺陷

当使用in_array()array_search()函数时,如果第三个参数没有设置为true,则in_array()array_search()将使用松散比较来判断

in_array()array_search() 默认使用弱比较(==)。如果未设置第三个参数为 true,可能会导致意外的比较结果:

$array = ["123", 123];
if (in_array("123abc", $array)) {echo "True"; // 输出 "True",因为 "123abc" 被转换为数字 123
}

安全隐患:攻击者可以构造与数组中已有值相等的不同类型数据,绕过验证。

建议与修复:

始终设置第三个参数为 true,启用严格比较:

if (in_array("123abc", $array, true)) {echo "True"; // 不会输出任何结果
}

7===数组比较缺陷

注意此时遇到的是 “===” ,不过也不是代表无从下手。在md5()函数传入数组时会报错返回NULL,当变量都导致报错返回NULL时就能使使得条件成立。

在 PHP 中,md5() 函数不支持数组作为参数,会抛出错误并返回 NULL。如果多个变量导致函数返回 NULL,可能使条件成立:

$a = md5([]);
$b = md5([]);
if ($a === $b) {echo "True"; // 输出 "True",因为两次调用均返回 NULL
}

安全隐患:攻击者可以利用此特性通过错误处理来绕过逻辑。

建议与修复:

确保函数参数的类型符合预期:

if (is_string($input) && md5($input) === $knownHash) {echo "Valid";
}

使用显式类型验证,避免直接比较可能返回错误的结果。

案例:

CTF题目:

矛盾 - Bugku CTF平台

MD5 - Bugku CTF平台

代码审CMS:

某Info CMS代码审计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F1学习——编码器接口

一、编码器接口 编码器接口可以接收正交编码器的信号,根据编码器旋转产生的正交信号脉冲,通过硬件自动控制CNT值的自增或自减,从而指出编码器的位置、旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口,他们会占…

网络安全的学习与实践经验(附资料合集)

学习资源 在线学习平台: Hack This Site:提供从初学者到高级难度的挑战任务,适合练习各种网络安全技术。XCTF_OJ:由XCTF组委会开发的免费在线网络安全网站,提供丰富的培训材料和资源。SecurityTube:提供丰…

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统,主要是整合优质行业资源,实时更新的商机信息。在当今信息爆炸的时代,精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览:用户在工作间隙或闲暇时间&#xff0c…

[Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider

目录 输入类控件 1、Line Edit 录入个人信息 使用正则表达式验证输入框的数据 验证两次输入的密码一致 切换显示密码 2、Text Edit 获取多行输入框的内容 验证输入框的各种信号 3、Combo Box 使用下拉框模拟麦当劳点餐 从文件中加载下拉框的选项 4、Spin Box 调整…

Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案

Flink CDC 自定义函数处理 SQLServer XML类型数据方案 1. 背景 因业务使用SQLServer数据库,CDC同步到doris 数仓。对于SQLServer xml类型,doris没有相应的字段对应, 可以使用json来存储xml数据。需要进行一步转换。从 flink 自定义函数入手…

JeeSite 快速开发平台:全能企业级快速开发解决方案|GitCode 光引计划征文展示

投稿人GitCode ID:thinkgem 光引计划投稿项目介绍 JeeSite 快速开发平台,不仅仅是一个后台开发框架,它是一个企业级快速开发解决方案,后端基于经典组合 Spring Boot、Shiro、MyBatis,前端采用 Beetl、Bootstrap、Admi…

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信,道路越是曲折,前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…

Java 内存溢出(OOM)问题的排查与解决

在 Java 开发中,内存溢出(OutOfMemoryError,简称 OOM)是一个常见且棘手的问题。相比于数组越界、空指针等业务异常,OOM 问题通常更难定位和解决。本文将通过一次线上内存溢出问题的排查过程,分享从问题表现…

【51单片机零基础-chapter3:按键:独立按键|||附带常见C语句.逻辑运算符】

将unsigned char var0;看作沟通二进制和十进制的桥梁 var是8位,初始为0000 0000; 同时可以进行十进制的运算 逻辑运算 位运算 & 按位与(有0则0) | 按位或(有1则1) ~ 按位非 ^ 按位异或(相同则1,不同为0) <<按位左移 >>按位右移 位运算符解释: 0011 1100 <&…

游戏如何检测iOS越狱

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…

在Lua中,Metatable元表如何操作?

Lua中的Metatable&#xff08;元表&#xff09;是一个强大的特性&#xff0c;它允许我们改变表&#xff08;table&#xff09;的行为。下面是对Lua中的Metatable元表的详细介绍&#xff0c;包括语法规则和示例。 1.Metatable介绍 Metatable是一个普通的Lua表&#xff0c;它用于…

12306分流抢票软件 bypass v1.16.43 绿色版(春节自动抢票工具)

软件介绍 12306Bypass分流抢票软件&#xff0c;易操作强大的12306抢票软件&#xff0c;全程自动抢票&#xff0c;云识别验证码打码&#xff0c;多线程秒单、稳定捡漏&#xff0c;支持抢候补票、抢到票自动付款&#xff0c;支持多天、多车次、多席别、多乘客、短信提醒等功能。…

【Go】运行自己的第一个Go程序

运行自己的第一个Go程序 一、Go语言的安装Go环境安装查看是否安装成功配置GOPROXY(代理) 二、Goland安装三、Goland破解四、新建项目 开一篇专栏记录学习Go的过程&#xff0c;一门新语言从hello world开始&#xff0c;这篇文章详细讲解Go语言环境搭建及hello world实现 一、Go语…

计算机的错误计算(二百零一)

摘要 用两个大模型计算 &#xff0c;结果保留 10位有效数字。实验表明&#xff0c;两个大模型的输出均只有1位正确数字&#xff1b;并它们几乎相同&#xff1a;仅最后1位数字不同。 例1. 计算 , 结果保留 10位有效数字。 下面是与一个数学解题器的对话。 以上为与一个数学解…

2024 年度时序数据库 IoTDB 论文总结

论文成果总结 2024 年度&#xff0c;时序数据库 IoTDB 在数据库领域 CCF-A 类国际会议上共发表论文 8 篇&#xff0c;包括&#xff1a;SIGMOD 3 篇、VLDB 3 篇、ICDE 2 篇&#xff0c;涵盖存储、引擎、查询、分析等方面。 2024 最后一天&#xff0c;我们将分类盘点 IoTDB 本年的…

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found

这个问题之前遇到过&#xff0c;没有记录&#xff0c;导致今天又花了2小时 原因是没有GLIBC——2.32 使用以下命令查一下有哪些版本&#xff1a; strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_ 我已经安装好了&#xff0c;所有有2.32版本 原因是当前的ubuntu版本…

海南省大数据发展中心:数据资产场景化评估案例手册(第二期)

2025年1月3日&#xff0c;海南省数据产品超市印发《数据资产场景化评估案例手册&#xff08;第二期&#xff09;》&#xff08;以下简称《手册》&#xff09;&#xff0c;该手册是基于真实数据要素典型应用场景进行数据资产评估操作的指导性手册&#xff0c;为企业在数据资产入…

python3GUI--智慧交通监控与管理系统 By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;软件组成&技术难点1.软件组成结构2.技术难点3.项目结构 四&#xff0e;总结 大小&#xff1a;35.5 M&#xff0c;软件安装包放在了这里! 一&#xff0e;前言 博主高产&#xff0c;本次给大家带来一款我自己使…

Linux高并发服务器开发 第八天(makefile的规则 wildcard/patsubst函数 普通变量/自动变量/其他关键字)

目录 1.makefile 1.1makefile的规则 1.2两个函数 1.3三个自动变量 1.3.1普通变量 (自定义变量) 1.3.2自动变量 1.3.3其他关键字 - ALL/all - clean 1.makefile - 作用&#xff1a;进行项目管理。 - 初步学习&#xff1a;1个规则、2个函数、3个自动变量。 - 要想使用默…

Vue动态控制disabled属性

参考:https://blog.csdn.net/guhanfengdu/article/details/126082781 在Vue中disabled:的值是受布尔值影响的&#xff0c;false为关闭禁用&#xff0c;true为开启禁用效果。 结果就是true会让按钮禁用 相反false会让按钮重新可以使用 那如果想要通过id属性值来判断是否禁用…