WEB攻防-PHP特性-函数缺陷对比

news2024/11/27 10:40:00

目录

==和===

MD5函数 

intval

​strpos

 in_array

 preg_match

str_replace


==和===

使用 == 时,如果两个比较的操作数类型不同,PHP 会尝试将它们转换为相同的类型,然后再进行比较。

使用 === 进行比较时,不仅比较值,还比较变量的类型,PHP 不会进行任何类型强制转换。如果两个操作数的类型不同,即使它们的值看起来相同,比较结果也会为假。

在 PHP 中,强制类型转换是一种显式地将一个变量从一种类型转换为另一种类型的方式。当需要将一个变量转换为特定类型时,可以使用强制类型转换。以下是 PHP 中常见的强制类型转换规则:

  1. 转换为布尔值 (bool)
    • 当转换为布尔值时,以下值被认为是 false
      • 布尔值 false 本身
      • 整数 0
      • 浮点数 0.0
      • 空字符串 ""
      • 字符串 "0"
      • 没有设置任何值的变量(null
      • 没有元素的数组
      • 特殊类型 null
      • 没有任何属性的对象
    • 所有其他值都被认为是 true
  2. 转换为整数 (int)
    • 当转换为整数时,浮点数会被截断为整数部分,字符串从开头开始解析直到第一个非数字字符为止。
    • 布尔值 true 转换为 1false 转换为 0
    • null 转换为 0
    • 对象转换为整数时,会调用对象的 __toString() 方法(如果存在),然后将结果转换为整数。
  3. 转换为浮点数 (float)
    • 当转换为浮点数时,字符串从开头开始解析直到第一个非数字字符或字符串结束。
    • 布尔值 true 转换为 1.0false 转换为 0.0
    • null 转换为 0.0
    • 对象转换为浮点数时,会调用对象的 __toString() 方法(如果存在),然后将结果转换为浮点数。
  4. 转换为字符串 (string)
    • 整数和浮点数会被转换为它们的字符串表示形式。
    • 布尔值 true 转换为 "1"false 转换为 ""(空字符串)。
    • 数组和对象转换为字符串时,会调用它们的 __toString() 方法(如果存在)。如果不存在,则会触发一个警告,并返回 null 的字符串表示形式。
    • null 转换为 ""(空字符串)。
    • 资源类型(resource)在转换为字符串时通常没有意义,除非与特定的资源处理器有关。
  5. 转换为数组 (array)
    • 转换为数组时,对于非数组和对象类型的值,将创建一个只包含该值的数组。
    • 对于对象,如果对象实现了 ArrayAccess 接口,它将被视为数组。否则,将创建一个包含对象属性的数组。
  6. 转换为对象 (object)
    • 在 PHP 中,将一个值转换为对象通常需要该值是一个已经存在的类名或者一个实现了 __invoke() 方法的对象。
    • 如果使用类名,将创建一个该类的实例。
    • 如果使用实现了 __invoke() 方法的对象,将调用该对象的 __invoke() 方法。
  7. 转换为 null
    • 将一个值设置为 null 是一种特殊的强制类型转换,它将变量设置为没有值的状态。

测试代码,参数x用于==的测试,参数y用于===的测试:

//1、== ===缺陷绕过 == 弱类型对比 ===还会比较类型
$a=1;
if($a==$_GET['x']){
    echo $flag;
}

//1.0 +1 1a

$a='1';
if($a===$_GET['y']){
    echo $flag;
}

测试用例中,传入x=+1 / x=1.0 / x=1sfd等都会与变量a相等,因为==会进行强制转换之后再比较

 

 而使用===必须类型一致,传入y=1.0  / y=1

MD5函数 

在 PHP 中,md5() 函数的一个已知缺陷是所谓的“0e”碰撞。这个问题特定于 PHP 的字符串比较机制,而不是 md5() 函数本身。当使用 == 运算符比较两个字符串时,如果字符串以“0e”开头,后面跟着一系列数字,PHP 会将这些字符串解释为科学记数法表示的浮点数,并进行数值比较而不是字符串比较。

//2、MD5函数缺陷绕过 ==弱对比 ===强类型对比
if($_GET['name'] != $_GET['password']){
    if(MD5($_GET['name']) == MD5($_GET['password'])){
        echo $flag;
    }
    echo '?';
}

根据代码逻辑,先判断传入的name和password不相等,再判断name和password讲过md5加密后相等,才会输出flag,否则输出问号

测试用例会用到以下两个字符串

QNKCDZO以MD5加密:0e830400451993494058024219903391

240610708以MD5加密:0e462097431906509019562988736854

正常情况下,如name=test&password=123456,md5加密是不相等的

而当我们使用上面两个用例字符串,md5加密后php会判断相等

当你尝试对数组使用 md5() 函数时,PHP 会发出一个警告,告诉你 md5() 期望的是一个字符串,而你提供的是一个数组。然后,由于无法对数组进行哈希计算,它会返回 null。在使用===比较时,传入两个数组比较,等于null===null返回true

//2、MD5函数缺陷绕过 ==弱对比 ===强类型对比
if($_GET['name'] != $_GET['password']){
    if(MD5($_GET['name']) === MD5($_GET['password'])){
        echo $flag;
    }
    echo '?';
}

上面解释过产生0e碰撞是因为php当作了科学计数比较,而使用 === 进行字符串比较会同时比较值和类型,因此不会受到上述“0e”碰撞问题的影响。

这种情况可以使用传入数组的方式绕过,name[]=1和password[]=2显然满足两者不相等这个条件,而md5不对数组哈希,并报Warning返回null,所以null===null返回true

intval

intval( $var, $base )是 PHP 中的一个内置函数,用于获取变量的整数值,默认是十进制。这个函数尝试将给定的变量转换为整数类型。如果变量是字符串,那么它会解析字符串直到遇到一个非数字字符为止,然后返回该数字。如果字符串开头就是一个非数字字符,那么它会返回 0。

当使用 intval() 函数并设置基数(base)为 0 时,它会根据字符串的内容来尝试猜测其原始的数字基数,并进行相应的转换。这通常用于处理以特定前缀开头的数字字符串,如十六进制(以 "0x" 或 "0X" 开头)或八进制(以 "0" 开头),如果字符串不符合这些模式,它会被尝试解析为十进制数。

注意:如果字符串不是一个有效的八进制或十六进制数(即,如果它包含除了 0-7 之外的字符对于八进制,或者除了 0-9 和 a-f(不区分大小写)之外的字符对于十六进制),那么 intval() 将返回 0。

测试代码:

//3、intval缺陷绕过
$i='666';
$ii=$_GET['n'];
if(intval($ii)==$i){
    echo $flag;
    echo "<br>";
}


$i='666';
$ii=$_GET['n'];
if(intval($ii,0)==$i){
    echo $flag;
}

使用666safs两个都能正常输出 ,都能正常截断后面的字符串,但改为十六进制0x29a则只有base等与0的才能正常识别输出

 strpos

strpos() 是 PHP 中的一个字符串函数,用于查找一个子字符串在另一个字符串中首次出现的位置。 

strpos(string $haystack, mixed $needle, int $offset = 0): int|false

参数说明:

  • $haystack:必需。要搜索的字符串。
  • $needle:必需。要查找的字符串。如果该参数不是字符串,它会被转换为整数并视为字符的 ASCII 值。
  • $offset:可选。从 $haystack 字符串中的哪个位置开始搜索。

返回值:

  • 如果找到子字符串,则返回其第一次出现的位置的索引(基于0的索引)。
  • 如果没有找到子字符串,则返回 false

测试代码:

//4、对于strpos()函数,我们可以利用换行进行绕过(%0a)
$i='666';
$ii=$_GET['h'];
if(strpos($ii,$i,0)){
    echo $flag;
}

 在这段代码中,如果h=666,并不会输出flag,因为strpos返回 666 在 $ii 中首次出现的位置的索引,而666 是字符串的开始,它将返回 0,0在php同样代表false

可以通过换行进行绕过:%0a666

%0a:表示换行

也可以在有必要的条件下使用 数组 返回null

//4、对于strpos()函数,我们可以利用换行进行绕过(%0a)
$i='666';
$ii=$_GET['h'];
if(strpos($ii,$i,0)===null){
    echo $flag;
}

 in_array

in_array() 是 PHP 中的一个函数,用于检查一个值是否存在于数组中。它的基本语法如下:

bool in_array ( mixed $search , array $array [, bool $strict = FALSE ] )

参数说明:

  • $search:必需。要搜索的值。
  • $array:必需。要搜索的数组。
  • $strict:可选。如果设置为 TRUE,则还会检查 $search 的类型是否和数组中的元素类型相同。默认为 FALSE。(True类似===,Flase类似==)

返回值:

  • 如果在数组中找到值则返回 TRUE,否则返回 FALSE

 测试代码:

//5、in_array第三个参数安全
$whitelist = [1,2,3];
$page=$_GET['i'];
if (in_array($page, $whitelist)) {
    echo "yes";
}

 preg_match

preg_match 是 PHP 中的一个函数,用于执行一个正则表达式匹配。如果匹配成功,它会返回 1;如果匹配失败或发生错误,它会返回 0;如果没有进行匹配,它会返回 false

preg_match只能处理字符串,如果不按规定传一个字符串,传一个数组进入,就会使preg_match失效,从而绕过该函数的检测。

测试代码:

if(isset($_GET['num'])){
    $num = $_GET['num'];
    if(preg_match("/[0-9]/", $num)){
        die("no no no!");
    }
    if(intval($num)){
        echo $flag;
    }
}

从代码逻辑看,获取并判断num参数值是否为空,不为空则判断匹配num值中是否有0-9的字符,符合条件执行die输出nonono并杀死程序,否则执行下一个条件intval(num)取整操作,不为flase输出flag

正常输入数字,会杀死程序

 当我们传一个数组,就能绕过正则的检测

str_replace

str_replace 是 PHP 中的一个函数,用于在字符串中查找并替换指定的值。它接受一个或多个搜索值(需要被替换的),以及对应的替换值,并在给定的主字符串中进行替换。

缺陷是无法迭代过滤,可以双写绕过

测试代码:

//7、str_replace无法迭代过滤
$sql=$_GET['s'];
$sql=str_replace('select','',$sql);
echo $sql;

这段代码会过滤掉select并替换为空

双写则可以绕过,他能过滤多个,但是二次合并的无法迭代的过滤 ,如sselectelect过滤一次后,再次合并的select不会被过滤

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

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

相关文章

网贷大数据黑名单要多久才能变正常?

网贷大数据黑名单是指个人在网贷平台申请贷款时&#xff0c;因为信用记录较差而被列入黑名单&#xff0c;无法获得贷款或者贷款额度受到限制的情况。网贷大数据黑名单的具体时间因个人信用状况、所属平台政策以及银行审核标准不同而异&#xff0c;一般来说&#xff0c;需要一定…

FebHost:注册国外域名优先考虑可用性还是成本?

在选择域名后缀时&#xff0c;应该优先考虑可用性还是成本&#xff1f;这主要取决于您的具体情况。这两个因素都很重要&#xff0c;您应根据自己的需求进行权衡。 可用性方面&#xff1a;热门的域名后缀&#xff0c;如.com和.net&#xff0c;通常需求量较大&#xff0c;因此可…

数字安全实操AG网址漏洞扫描原理与技术手段分析

在数字化世界的大舞台上&#xff0c;网络安全如同守护者一般&#xff0c;默默保卫着我们的虚拟疆界。当我们在享受互联网带来的便利时&#xff0c;一场无形的战争正在上演。黑客们利用各种手段试图攻破网站的安全防线&#xff0c;而防守方则依靠先进的技术和策略来抵御入侵。其…

安卓studio插件开发(一)本地搭建工程

下载idea 社区版本 建立IDE Plugin工程 点击create就行&#xff0c;新建立的工程长这样 比较重要的文件 build.gradle&#xff1a;配置工程的参数 plugin.xml&#xff1a;设置插件的Action位置 build.gradle.kts内容如下&#xff1a; plugins {id("java")id(&quo…

【VTKExamples::Modelling】第四期 MarchingSquares

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例MarchingSquares,并解析接口vtkMarchingSquares,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U…

c# winform 控件皮肤

控件皮肤下载&#xff1a; https://download.csdn.net/download/m0_46973223/89225992 步骤&#xff1a; 第一步 将IrisSkin4.dll文件放在debug文件下&#xff0c;选一个或者多个后缀名为.ssk文件&#xff08;各个皮肤文件&#xff09;放在debug文件下。 第二步 解决方案资…

【算法刷题】手撕LRU算法(原理、图解、核心思想)

文章目录 1.LRU算法1.1相关概念1.2图解举例1.3基于HashMap和双向链表实现1.3.1核心思想1.3.2代码解读1.3.3全部代码 1.LRU算法 1.1相关概念 LRU&#xff08;Least Recently Used&#xff0c;最近最久未使用算法&#xff09;&#xff1a; 定义&#xff1a;根据页面调入内存后的…

nvm管理多个node版本,快速来回切换node版本

前言 文章基于 windows环境 使用nvm安装多版本nodejs。 最近公司有的项目比较老需要降低node版本才能运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理&#xff0c;后面自己就简单捯饬了一下nvm来管理node&#xff0c;顺便…

【资源分享】Latex2024安装教程

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

路由重分布的概念与配置

路由重分布的概念 l 路由重分布是指连接不同路由域&#xff08;自治系统&#xff09;的边界路由器&#xff0c;它在路由协议之间交换和通告路由信息 从一种协议&#xff08;含静态/直连路由&#xff09;到另一种协议 同一种协议的多个实例 路由重分布的背景 网络出口位置…

宝宝洗衣机买什么样的好?诚意推荐四款实力超群的婴儿洗衣机

近几年家用洗衣机标准容积的大大增加&#xff0c;从5Kg、6Kg升级到9Kg、10Kg。大容量洗衣机满足了家庭中清洗大件衣物、床上用品的需求。但由于普通大型洗衣机所洗衣物混杂&#xff0c;很多时候由于宝宝小件衣物数量不多&#xff0c;却也并不适合放在一起扔进大型洗衣机中清洗。…

lesson05:C++内存管理

1.内存分布 2.c中动态内存管理 3.operator new和operator delete函数 4.new和delete实现原理 1.内存分布 1.1常见的内存分布 1.2相关问题 答案&#xff1a;CCCAA AAADAB 我们讲以下易错的部分&#xff1a; 7.数组char2是在栈上开的空间&#xff0c;然后将"a…

golang学习笔记(net/http库基本使用)

关于net/http库 我们先看看标准库net/http如何处理一个请求。 import ("fmt""log""net/http" )var count 0func main() {http.HandleFunc("/", handler)http.HandleFunc("/count", counter)log.Fatal(http.ListenAndServ…

STM32_舵机的实战

一、配置相应的管脚 二、写代码

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题出来&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题&#xff0c;帖子链接&#xff1a;《刚刚新安装的OceanBase集群&#xff0c;…

leetcode 221 最大正方形面积

示例 3&#xff1a; 输入&#xff1a;matrix [["0"]] 输出&#xff1a;0 # 最大正方形面积 def max_square(matrix):m len(matrix)n len(matrix[0])if m 0 or n 0::return Nonemax_side 1dp [[0] * (n 1) for _ in range(m 1)]for i in range(1, m 1):fo…

AI大模型探索之路-训练篇1:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

国产麒麟v10系统下打包electron+vue程序,报错unknown output format set

报错如下&#xff1a; 报错第一时间想到可能是代码配置原因报错&#xff0c;查看代码似乎感觉没啥问题 又查看具体报错原因可能是因为icon的原因报错&#xff0c;后面查阅发现ico在各系统平台会不兼容&#xff0c;也就是ico是给win下使用的&#xff0c;此处改下图标格式就ok&am…

【机器学习】近邻类模型:KNN算法在数据科学中的实践与探索

近邻类模型&#xff1a;KNN算法在数据科学中的实践与探索 一、KNN算法的基本原理二、KNN算法的变种与改进三、KNN算法的Python实践四、总结与展望 在数据科学领域&#xff0c;分类和回归是两大核心问题。随着大数据时代的到来&#xff0c;传统参数化模型在某些复杂场景中已难以…

Selenium IDE 常见错误笔记

错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反扒机制&#xff0c;脚本运行…