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不会被过滤

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Linux操作系统中关于磁盘(硬盘)管理的操作

电脑中数据存储设备&#xff1a;硬盘&#xff08;实现数据的持久化存储&#xff09;&#xff0c;内存 在Linux操作系统中一切皆文件的思想&#xff0c;所有的设备在Linux操作系统中都是通过文件来标识的&#xff0c;所以每一个硬盘都对应一个块设备文件。 在Linux操作系统中所…

虚函数表与虚函数表指针

虚函数表与虚函数表是用来实现多态的&#xff0c;每一个类只有一个虚函数表 静态多态&#xff1a;函数重载&#xff08;编译期确定&#xff09; 动态多态&#xff1a;虚函数&#xff08;运行期确定&#xff09; 虚函数表的创建时机&#xff1a; 生成时间&#xff1a; 编译期…

C++——map和set的基础应用

目录 1.关联式容器 2.键值对 3.树型结构的关联式容器 4.set&#xff08;key模型&#xff09; 1.set性质 2.注意 3.set的使用 1.创建对象 2.插入 3.删除 4.查找 4.map&#xff08;key value模型&#xff09; 1.性质 2.map的使用 1.创建对象 2.插入 3.删除 4.[] 1.关联式容器 C中…

pytho爬取南京房源成交价信息并导入到excel

# encoding: utf-8 # File_name: import requests from bs4 import BeautifulSoup import xlrd #导入xlrd库 import pandas as pd import openpyxl# 定义函数来获取南京最新的二手房房子成交价 def get_nanjing_latest_second_hand_prices():cookies {select_city: 320100,li…

C语言 | Leetcode C语言题解之第50题Pow(x,n)

题目&#xff1a; 题解&#xff1a; double myPow(double x, int n){if(n 0 || x 1){return 1;}if(n < 0){return 1/(x*myPow(x,-(n1)));}if(n % 2 0){return myPow(x*x,n/2);}else{return x*myPow(x*x,(n - 1)/2);} }

selenium 4.x入门篇(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型…

68.网络游戏逆向分析与漏洞攻防-利用数据包构建角色信息-自动生成CPP函数解决数据更新的问题

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

0426GoodsBiddingAJAX项目

0426GoodsBiddingAJAX项目包-CSDN博客 数据库字段 ​ 管理员的登录界面 ​ 登录成功跳转在线拍卖界面&#xff0c;使用监听器拦截请求&#xff0c;只能登录管理员后访问该界面 ​ 商品竞拍列表 ​ 商品竞拍列表的竞拍操作&#xff1a; ​ 1 用户未登录跳转用户登录界面&#x…

(三十一)第 5 章 数组和广义表(稀疏矩阵的三元组行逻辑链接的顺序存储表示实现)

1. 背景说明 2. 示例代码 1)errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

算法03贪心与动态规划

算法03贪心与动态规划 1. 贪心与动态规划概述1.贪心1.1贪心概述1.2贪心常用场景1.3贪心解题思路 2.动态规划2.1动态规划概述2.2动态规划常用场景2.3动态规划解题模板 3.浅谈贪心与动态规划的关系 2.贪心经典题目区间问题 3.动态规划经典题目3.1体会“从整体到局部”的思考过程3…

2024Mac系统热门游戏排行榜 Mac支持的网络游戏有哪些?mac能玩哪些大型网游 苹果电脑Mac游戏资源推荐 Mac玩Windows游戏

“游戏是这个世界上唯一能和女性争夺男朋友的东西&#xff08;/滑稽&#xff0c;有不少女生也喜欢玩游戏&#xff09;。” 虽然只是一句玩笑话&#xff0c;不过也可以看出游戏对大多数男生来说是必不可少的一项娱乐活动了。而网络游戏是游戏中的一大分支&#xff0c;能让玩家们…

zabbix自动发现和自动注册

一、zabbix自动发现 1.1 确保客户端上的zabbix-agent2服务器状态正常 1.2 在web页面删除原有的客户端主机 1.3 在服务端和客户端上配置hosts 1.4 web端配置自动发现 二、zabbix自动注册 2.1 环境配置 2.2 修改zabbix-agent2配置文件 过滤非#或非&#xffe5;开头的内容 2.3 we…

基于遗传优化算法的TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的TSP问题求解&#xff0c;分别对四个不同的城市坐标进行路径搜索。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ....…

前端开发攻略---用原生JS在网页中也能实现语音识别

1、语音识别的过程 语音识别涉及三个过程&#xff1a;首先&#xff0c;需要设备的麦克风接收这段语音&#xff1b;其次&#xff0c;语音识别服务器会根据一系列语法 (基本上&#xff0c;语法是你希望在具体的应用中能够识别出来的词汇) 来检查这段语音&#xff1b;最后&#xf…

基于EBAZ4205矿板的图像处理:02生成测试彩条图像

基于EBAZ4205矿板的图像处理&#xff1a;02生成测试彩条图像 生成测试彩条图像可以有两种方式 VDMA缓存PS端生成彩条图像数据&#xff0c;PL端输出 这里可以直接看超级大电工开源的代码&#xff0c;写的很好详细&#xff0c;我就不再班门弄斧了&#xff08;下面是链接&#…

22 - Hadoop HA 高可用集群搭建、手动模式、自动模式以及HA模式集群

目录 1、HA 概述 2、HDFS-HA 集群搭建 2.1、HDFS-HA 核心问题 3、HDFS-HA 手动模式 3.1、环境准备 3.2、规划集群 3.3、配置 HDFS-HA 集群 3.4、启动 HDFS-HA 集群 4、HDFS-HA 自动模式 4.1、HDFS-HA 自动故障转移工作机制 4.2、HDFS-HA 自动故障转移的集群规划 4.…

AI助力后厨可视化智慧监管,让“舌尖安全”看得见

一、背景与需求分析 夏天是食物易腐败的季节&#xff0c;高温容易引发食品安全问题。在后厨环境中&#xff0c;食品安全问题可能涉及食品加工、后厨环境、食品是否被污染等方面&#xff0c;而不合格的食品安全管理可能导致食品中毒事件等风险&#xff0c;损害消费者的健康和餐…

Asp .Net Core 系列:国际化多语言配置

文章目录 概述术语 本地化器IStringLocalizer在服务类中使用本地化 IStringLocalizerFactoryIHtmlLocalizerIViewLocalizer 资源文件区域性回退 配置 CultureProvider内置的 RequestCultureProvider实现自定义 RequestCultureProvider使用 Json 资源文件 设计原理IStringLocali…

你的动漫AI女友 Anime gf :自定义创建各种独特个性、语言风格的虚拟角色

一个本地且开源的 CharacterAI 替代工具 Anime gf&#xff0c;提供了一个用户友好的界面&#xff0c;允许用户在桌面上与虚拟角色互动。你可以自定义创建各种角色&#xff0c;让每个虚拟角色都有自己的独特个性和语言风格&#xff0c;可以接入OpenAI、Anthropic、Mistral和 Tog…

建立外贸网站常用的WordPress插件

我们最近使用hostease的虚拟主机在创建wordpress外贸网站时&#xff0c;需要选择安装一些插件。对于wordpress建站选择合适的WordPress插件至关重要。面对琳琅满目的插件选择&#xff0c;根据多年的实践经验&#xff0c;我为您推荐以下必备插件清单&#xff0c;让您的网站建设更…