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

目录

==和===

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.mzph.cn/news/830168.shtml

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

相关文章

MATLAB非均匀网格梯度计算

在matlab中&#xff0c;gradient函数可以很方便的对均匀网格进行梯度计算&#xff0c;但是对于非均匀网格&#xff0c;但是gradient却无法求解非均匀网格的梯度&#xff0c;这一点我之前犯过错误。我之前以为在gradient函数中指定x&#xff0c;y等坐标&#xff0c;其求解的就是…

Metasploit 溢出 samba 提权漏洞

一、信息收集 1.1 右键单击桌面&#xff0c;选择 Open Terminal Here &#xff0c;打开终端。 1.2 输入命令 nmap -sS -p 139,445 -A 192.168.1.254 ,对目标主机进行扫描,发现 139、445 端口开放。 1.3 输入命令“msfconsole”&#xff0c;启动 MSF 终端。 1.4 输入命令“searc…

电脑录制视频快捷键,一键开启录屏新时代(干货)

“最近尝试录制一些电脑上的操作视频&#xff0c;用来制作教学教程。不过&#xff0c;每次录制都要通过菜单或搜索来打开录屏软件&#xff0c;实在是有些繁琐。有没有人知道哪些电脑录制视频的快捷键呀&#xff1f;或者有没有通用的快捷键设置方法&#xff1f;” 在当今数字时…

免费语音转文字:自建Whisper,贝锐花生壳3步远程访问

Whisper是OpenAI开发的自动语音识别系统&#xff08;语音转文字&#xff09;。 OpenAI称其英文语音辨识能力已达到人类水准&#xff0c;且支持其它98中语言的自动语音辨识&#xff0c;Whisper神经网络模型被训练来运行语音辨识与翻译任务。 此外&#xff0c;与其他需要联网运行…

MySQL中脏读与幻读

一般对于我们的业务系统去访问数据库而言&#xff0c;它往往是多个线程并发执行多个事务的&#xff0c;对于数据库而言&#xff0c;它会有多个事务同时执行&#xff0c;可能这多个事务还会同时更新和查询同一条数据&#xff0c;所以这里会有一些问题需要数据库来解决 我们来看…

centos 7使用源码编译安装Python 3.12.2(最新版本)

&#xff08;一&#xff09;、说明 在centos 7上&#xff0c;默认安装出来的python是&#xff1a;2.7.5版本 1.查看python版本&#xff1a; python --version 2.通过yum安装出来的&#xff0c;适合当前操作系统的&#xff0c;最新的python版本是&#xff1a;3.6.8 python3…

云手机对出海企业有什么帮助?

近些年&#xff0c;越来越多的企业开始向海外拓展&#xff0c;意图发掘更广阔的市场。在这过程中&#xff0c;云手机作为一个新型工具为很多企业提供了助力&#xff0c;尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先&#xff0c;云手机的出现解决了企业在海外拓…

【Linux系统化学习】死锁 | 线程同步

目录 死锁 死锁的必要条件 避免死锁 线程同步 条件变量 同步概念和竞态条件 条件变量接口 创建和初始化条件变量 等待条件满足 唤醒等待 毁条件变量 为什么 pthread_cond_wait 需要互斥量? 条件变量使用规范 等待条件代码 给条件发送信号代码 死锁 死锁是指在一…

扭蛋机小程序带来了什么优势?扭蛋机收益攻略

在当下的潮流消费时代&#xff0c;人们对潮玩也日益个性化&#xff0c;扭蛋机作为一种新型的娱乐消费模式&#xff0c;深受大众喜爱。扭蛋机的价格低&#xff0c;各个年龄层的玩家都可以进行购买&#xff0c;潜在玩家量非常大。扭蛋机商品主打热门IP周边等&#xff0c;种类繁多…

【PostgreSQL】Postgres数据库安装、配置、使用DBLink详解

目录 一、技术背景1.1 背景1.2 什么是 DBLink 二、安装配置 DBLink2.1 安装 DBLink2.2 配置 DBLink1. 修改 postgresql.conf2. 修改 pg_hba.conf 三、DBLink 使用3.1 数据准备3.2 DBLink 使用1. 创建 DBLink 连接2. 使用 DBLink 进行查询3. 使用 DBLink 进行增删改4. 使用 DBLi…

python代码实现kmeans对鸢尾花聚类

导入第三方库和模型 from sklearn import datasets import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans2、创建画图函数 def draw_result(train_x, labels, cents, title):n_clusters np.unique(labels).shape[0]#获取类别个数color …

用vue3实现留言板功能

效果图&#xff1a; 代码&#xff1a; <script setup lang"ts"> import { ref } from vue;interface Message {name: string;phone: string;message: string; }const name ref<string>(); const phone ref<string>(); const message ref<st…

Llama 3 安装使用方法

Llama3简介&#xff1a; llama3是一种自回归语言模型&#xff0c;采用了transformer架构&#xff0c;目前开源了8b和70b参数的预训练和指令微调模型&#xff0c;400b正在训练中&#xff0c;性能非常强悍&#xff0c;并且在15万亿个标记的公开数据进行了预训练&#xff0c;比ll…

python——井字棋游戏——登入注册界面

本篇文章只讲解登入和注册页面&#xff0c;在后面的文章中会讲解井字棋游戏&#xff0c;然后把井字棋和登入界面进行连接&#xff0c;整合成一个完整的游戏。 登入注册界面在本篇文章的末尾。 1.实现登入界面 &#xff08;1&#xff09;导入图片 把这张图片存储在与代码路径…

Rundeck(四)安全配置

自动化运维工具rundeck GitHub - rundeck 是java开发的开源自动化服务&#xff0c;具有 Web 控制台、命令行工具和 WebAPI。它使您可以轻松地跨一组节点运行自动化任务&#xff0c;适合运维自动化管理、自动发布管理、运维数据分析等 网站&#xff1a;https://www.rundeck.co…

人人开源框架运行

Getting started renrenio/renren-fast-vue Wiki GitHub 人人开源 1.启动navicat&#xff1a;新建一个数据库renren-fast&#xff0c;字符集为utf-8,utf-8mb3或者utf-8mb4&#xff0c;排序规则不选 2.数据库操作在renren-fast数据库中选择表&#xff0c;运行renren-fast-ma…

LeetCode 每日一题 ---- 【1017.负二进制转换】

LeetCode 每日一题 ---- 【1017.负二进制转换】 1017.负二进制转换方法一&#xff1a;模拟进制转换推广&#xff1a;任意进制转换 1017.负二进制转换 方法一&#xff1a;模拟进制转换 我们平常做进制转换最常用的方法就是辗转相除法&#xff0c;下面的图示分别给出了普通的10…

web自动化测试详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

卷积注意力模块 CBAM | CBAM: Convolutional Block Attention Module

论文名称&#xff1a;《CBAM: Convolutional Block Attention Module》 论文地址&#xff1a;https://arxiv.org/pdf/1807.06521.pdf 我们提出了卷积块注意力模块&#xff08;CBAM&#xff09;&#xff0c;这是一种简单但有效的前馈卷积神经网络注意力模块。给定一个中间特征图…

transformer上手(10)—— 文本摘要任务

文本摘要是一个 Seq2Seq 任务&#xff0c;尽可能保留文本语义的情况下将长文本压缩为短文本。 文本摘要可以看作是将长文本“翻译”为捕获关键信息的短文本&#xff0c;因此大部分文本摘要模型同样采用 Encoder-Decoder 框架。当然&#xff0c;也有一些非 Encoder-Decoder 框架…