「学习笔记」PHP 函数安全

news/2025/11/1 22:02:45/文章来源:https://www.cnblogs.com/yifan0305/p/19183901

PHP 函数安全

is_numeric

检测变量是否为数字或者数字字符串。
当前 PHP 最新版本的 is_numeric 会忽略 %0a 等字符,但 %00 不会被忽略。

PHP 精度

PHP 为双精度格式,IEEE 754。
简单说,IEEE 754 是一个规定了计算机如何表示和处理“浮点数”的技术标准,在 IEEE 754 标准出现之前,各家电脑公司用自己的方法表示小数,结果同一段计算程序在不同电脑上算出来的结果可能不一样。IEEE 754 就像是为计算机世界统一了“小数的语法”,确保了计算的一致性和可靠性。
IEEE 754 表示方法:
IEEE754 一般分为半精度浮点数、单精度浮点数、双精度浮点数
这双精度浮点数为例,在这个长度下会使用 1 位符号,11 位指数,52 位尾数。

  • 符号:\(0\) 为正,\(1\) 为负。
  • 指数:偏移量,单精度为 \(127\),双精度为 \(1023\),存储的指数 = 真实的指数 + 偏移量。
  • 尾数:只存储的小数部分。(因为整数部分永远是 \(1\))。
$flag = 'flag{test}';
extract($_GET);
if (strstr($num,'1')) {die('Out!');
}
if($num==1){var_dump($flag);
}

这个例子大致一个情况就是,如果 num=1 则输出 flag,但是由于使用了 strstr 函数,如果我们输入 1 的话自然会返回 Out!,为此可以使用精度漏洞绕过去
?num=0.999999999999999999999999

比较和类型转换漏洞

PHP 包括松散比较 == 和严格比较 ===
字符串转化成数字后会是 \(0\)。如果一个字符串要转化成数值类型,首先对字符串进行一个判断,如果字符串里面包括 e, ., E, 则会作为 float 来取值,否则作为 int 来取值。如果字符串起始部分为 数值 ,则采用 起始的数值 ,否则一律为 \(0\)

PHP 弱类型比较

strcmp

strcmp(str1, str2)
如果 str1 小于 str2 返回 <0,如果 str1 大于 str2 返回 >0,如果 str1 等于 str2,则返回 0,如果 strcmp 比较出错后,会返回 null,null 则为 \(0\)
为了使 strcmp 比较出错,可以传入一个数组:?str[]

is_numeric

is_numeric 用于检测参数是否为数值,如果遇到这个函数,可以用上述转换类型的特性(< PHP 8.0.0),如果传入的是字符串,会先将字符串转换为数值。

is_switch

方法与类型转换差不多。

$a = "233a"; # 字符串转换为 223
$flag = "flag{Give you FLAG}";
switch ($a) {case 1:echo "No Flag";break;case 2:echo "No Flag";break;case 233:echo $flag;break;default:$a = 233;echo "Haha...";
}

MD5()

MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,可以生成一个128位(16字节)的哈希值,通常表示为32个字符的十六进制数。
MD5 就像一个“数字指纹生成器”——它能把任意长度的数据(文件、密码、文字等)转换成一个固定长度的、唯一的“指纹字符串”。
特点:

  • 固定长度输出:无论输入多大,输出永远是 \(32\) 位十六进制数(\(128\) 位二进制)。
  • 确定性:相同的输入永远产生相同的输出。
  • 快速计算:计算 MD5 哈希值非常快速。
  • 雪崩效应:输入微小变化,输出截然不同。

函数 md5()
md5(string, var2)
计算 字符串 的 MD5 散列值,如果 var2 为真的话将返回 16 字符长度的原始二进制格式。
md5 在处理哈希字符串的时候,如果 md5 编码后的哈希值时 \(0e\) (科学计数法)开头的,都一律解释为 \(0\),所以当两个不同的值经过哈希编码后他们的值都是以 \(0e\) 开头的,则每个值都是 \(0\)

常见的 MD5 以 0e 开头的值。

数值型:

240610708 0e462097431906509019562988736854 返回:0
314282422 0e990995504821699494520356953734 返回:0
571579406 0e972379832854295224118025748221 返回:0
903251147 0e174510503823932942361353209384 返回:0
$md5          md5($md5)
0e00275209979 0e551387587965716321018342879905
0e00506035745 0e224441551631909369101555335043
0e00540451811 0e057099852684304412663796608095
0e00678205148 0e934049274119262631743072394111
0e00741250258 0e899567782965109269932883593603
0e00928251504 0e148856674729228041723861799600
0e01350016114 0e769018222125751782256460324867
0e01352028862 0e388419153010508575572061606161
0e01392313004 0e793314107039222217518920037885
0e01875552079 0e780449305367629893512581736357
0e01975903983 0e317084484960342086618161584202
0e02042356163 0e335912055437180460060141819624
0e02218562930 0e151492820470888772364059321579
0e02451355147 0e866503534356013079241759641492
0e02739970294 0e894318228115677783240047043017
0e02760920150 0e413159393756646578537635311046
0e02784726287 0e433955189140949269100965859496
0e03298616350 0e851613188370453906408258609284
0e03393034171 0e077847024281996293485700020358

字符型:

QLTHNDT 0e405967825401955372549139051580 返回:0
QNKCDZO 0e830400451993494058024219903391 返回:0
EEIZDOI 0e782601363539291779881938479162 返回:0
TUFEPMC 0e839407194569345277863905212547 返回:0

===(数组比较)

如果 MD5 比较用的 ===,这个时候就得使用数组来绕过。如果传入一个数组的值,就会报错,报错后就相当于绕过 === 这个条件了。
在 PHP8.0.0 这个方法行不通了!

MD5 碰撞

目前看不太懂,在慢慢啃…………

sha1

一种哈希函数,算法强度比 MD5 强,但是仍不太安全。
sha1 的参数不能为数组,传入数组会返回 NULL,所以先传一个数组使得 sha1 函数报错,接着再左右两边传入不一样的内容,两边条件自然 =1,相等即可绕过。

$flag = "flag{Chain!}";
$get = $_GET['get'];
$teg = $_GET['teg'];
if ($get != $teg && sha1($get) === sha1($teg)) {
#if ($get != $teg && sha1($get) == sha1($teg)) {echo $flag;
}else{echo 'Out!';
}

?get[]=&teg[]=1

变量覆盖漏洞

变量如果未被初始化,且能够被用户所控制,那么很可能会导致安全问题,如果传入一个参数,并且这个参数把原有的变量值给覆盖掉了则叫做变量覆盖漏洞。

$$

$$: 可变变量,简单概括就是一个可变变量获得了一个普通变量的值,举个例子。

$a = "A";
$$a = "B";

代码含义:给变量 \(a\) 赋值 "A",而 $$a 就相当于 $"A",即 $"A" = "B"

$flag = "flag{Chain!}";
foreach ($_GET as $key => $value) {$$key = $value;
}
if ($id === "admin") {echo $flag;
}else{echo "Out!";
}

?id=admin, 将 id 付给 $key, admin 赋给 $value, $$key 即为 $id, 所以 $id === "admin"

extract()

extract(array, flags, prefix)
本函数用来将变量从数组中导入到当前的符号表中。
检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。

  • array: 数组
  • flags:
    EXTR_OVERWRITE - 如果有冲突,覆盖已有的变量。(默认)
    EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
    EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。(需要 prefix 参数)
  • prefix: 该参数规定了前缀。前缀和数组键名之间会自动加上一个下划线。

parse_str()

parse_str(string $string, array &$result): void
如果 string 是通过 URL 传入的查询字符串,则将其解析,并将 key 设置到指定 result 数组中。如果未提供 result 数组,则会将值设置为当前作用域中的变量。

register_globals

register_globals 设置为 on 的时候,传递的参数会自动注册为全局变量。
ini_set("register_globals", "On");

伪协议

后面慢慢啃……

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

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

相关文章

2025 年 11 月气动执行器厂家推荐排行榜,齿轮齿条执行器,拨叉式执行器,角行程执行器,不锈钢执行器,三段式执行器,快速执行器,执行器附件公司推荐

2025 年 11 月气动执行器厂家推荐排行榜,齿轮齿条执行器,拨叉式执行器,角行程执行器,不锈钢执行器,三段式执行器,快速执行器,执行器附件公司推荐 在工业自动化快速发展的今天,气动执行器作为关键控制元件,在流…

2025 年 11 月虎头鲨养殖孵化基地厂家推荐排行榜,浙江省大型虎头鲨养殖,虎头鲨孵化,虎头鲨养殖基地公司推荐

2025年11月虎头鲨养殖孵化基地厂家推荐排行榜 浙江省虎头鲨养殖产业发展现状 虎头鲨作为特色水产养殖品种,在浙江省已形成完整的产业链条。近年来,随着生态养殖理念的深入推广,虎头鲨养殖产业呈现出规模化、标准化的…

电子丨DC-DC中的升压、降压、升降压电路解析

在DC-DC电路中,升压(Boost)、降压(Buck)、升降压(Buck-Boost)是三种基本拓扑,通过开关管(如MOSFET)、电感、二极管和电容的配合实现电压转换。以下是它们的电路结构和工作原理详解:1. 降压电路(Buck Conve…

开源 JSON 格式化工具测评:jsonformat——轻量、简洁、可本地运行

在线使用地址: https://rodert.github.io/jsonformat/ @目录🧩 项目简介🧠 功能体验功能点包括:⚙️ 技术实现解析📦 部署方式⚖️ 优点与不足🔍 适用场景推荐💡 改进建议🧭 总结 在前端或后端开发过程中…

001 vue3-admin项目说明与创建

1. 说明本项目使用Vue3全家桶 + Typescript + Vite Node版本:vite需要Node.js版本18+或20+。然而,有效模板需要依赖更高的Node版本才能运行。当你的包管理器发出告警时,请升级你的node版本。本项目采用v22.12.0版本…

团队展示选题

广工枢纽:AI驱动的校园智能信息助手这个项目属于哪个课程 课程链接作业要求 作业链接作业的目标 小组组队,完成团队展示及选题,讨论团队计划、贡献分分配规则Github链接 仓库地址1. 团队展示 (1) 队名:超能女人 (2…

PRML习题 第一章(正在做)

1.1 \(\frac{\partial E}{\partial w}=0\)得到题目所述式子。基础数学。二次函数肯定是当且仅当每一维偏导均为01.2 和上一题几乎完全一致。由此知道归一化的损失函数也是对\(w\)每一维都是二次的式子。1.3 0.34 0.5贝…

十大最佳PDF转换器,可将PDF转换为Word、Excel、PPT、图片格式

PDF 是一种广泛使用的文件格式,便于传输和共享。您可以在 Mac、PC、iPhone、iPad 和其他平台上打开和阅读 PDF 文件。有时您可能需要将 PDF 文件转换为其他格式,例如 .DOC、.DOCX、.TXT 等。在互联网上搜索,您可以找…

dotnet使用redis时需要注意的问题

1.性能问题-批量多次读写、序列化和反序列化的场景 注意看到dotnet下的IDistributedCache接口内部方法声明都是针对单个key的,当需要多次大量读写同一类型kv值时,存在多次连接redis的情况,导致性能特别慢。 在abp框…

《代码大全 2》观后感(四):函数设计 —— 拆解复杂问题的 “手术刀”

《代码大全 2》观后感(四):函数设计 —— 拆解复杂问题的 “手术刀” “函数该写多长?”“一个函数里该放多少逻辑?” 这两个问题曾困扰我很久,直到读了《代码大全 2》中 “函数设计” 的章节,才找到明确的答案…

LeetCode算法模式全解:多语言实现核心数据结构与算法

本项目系统整理了LeetCode高频算法题解,涵盖快慢指针、滑动窗口、单调栈等核心算法模式,提供C#、Java、Python、JavaScript等多语言实现,帮助开发者高效准备技术面试。LeetCode算法模式全解 项目描述 本项目是一个全…

《代码大全2》观后感(三):变量命名——藏在细节里的“代码语言”

《代码大全2》观后感(三):变量命名——藏在细节里的“代码语言” 《代码大全2》用整整一章讲“变量命名”,起初我觉得小题大做——不就是起个名字吗?能区分变量就行。但读完整章才发现,好的命名不是“随便起”,…

2025 年 11 月石墨制品厂家最新推荐,专业制造与品牌保障口碑之选

在石墨制品行业,专业制造能力决定产品品质底线,品牌口碑则反映长期服务价值。为帮助采购方筛选出兼具专业实力与良好口碑的合作厂家,本次推荐依托行业协会最新测评数据,构建 “专业制造 - 品牌口碑” 双核心测评体…

2025 年 11 月石墨制品厂家最新推荐,实力品牌深度解析采购无忧之选!

采购石墨制品时,企业实力是规避合作风险的核心保障,选择实力品牌能大幅降低供货延迟、品质不符等问题。为帮助采购方精准锁定可靠合作伙伴,本次推荐依托行业协会最新测评数据,构建 “硬实力 - 软实力 - 采购保障”…

251101

目录JT-JY11T4S1-1JT-JY11T4S1-2 JT-JY11T4S1-1Good morning, Stretton Festival box office, how can i help you? OH, hello, my family and i are holiday in the area, and we have see some posters about the f…

agent skills - 邂逅那青春

什么是agent skills是什么?将工作流程打包成可以重复使用的技能包 能按照你的标准来完成特定的任务 例如: 产品需求分析是一个skill,那代码审查可以是另外一个skillskill有两个特别强大的特性渐进式披露。传统方式直接…

IDEA 忽略 pom.xml 依赖警告

IDEA中,有时 pom.xml 中会出现如下提示:IDEA 2022.1 升级了检测易受攻击的 Maven 和 Gradle 依赖项,并建议修正,通过插件 Package Checker 捆绑到 IDE 中。 这并不是引用错误,不用担心。如果实在强迫症不想看到这…

[buuctf]jarvisoj_test_your_memory

首先查看一下文件的保护措施在用ida打开看一下这里的s在进行输入的时候可以输入没有长度限制的字符串,很明显存在栈溢出 然后观察一下函数的列表,存在一个win_func的函数这里明显直接可以进行系统调用,直接传入命令…