PHP中一些特征函数导致的漏洞总结

第一部分: 特征函数

接触到几个常用的函数:
\=\=
\=\=\=
md5
intval
strpos
in_array
preg_match
str_replace

php用这些函数实现过滤一些代码,漏洞可能有一些特性,利用这些特征代码进行对比;账号密码对比;强制检测数据类型等都会用到这些函数,接下来具体讲解一下各个函数的使用:

  1. = 赋值
  2. == 弱类型对比,但是不会对比类型,这种存在缺陷绕过,举个例子,判断一个值是否==1,这种情况用户输入的+1,1.0,1a都会被当成正确的情况进行处理,这点在数据库中也是,当输入的值是字符串类型的时候,1a和1对比时,1a只取1和1对比,和后面的a无关,利用这点,如果1a=1报错,说明是数字型,如果1a=1不报错,说明时字符型,在这里时为了说明如果不进行强类型的对比1后面可以接入字符串。
    让我们来拓展一下,如果只进行弱类型对比,假设密码用md5进行加密了存放在数据库中,存放的密码和用户输入的密码的md5加密值中间用/=/=判断而不是用/=/=/=判断的后果,就是可能产生hash碰撞,如下图所示。:在这里插入图片描述
    这样就达到了绕过的目的。
  3. . === 对比,会对比类型
    此时可以使用数组进行绕过,对于数组name[]来说$_GET[‘name’]获取到的值就是null,让我们来看个例子:
    在这里插入图片描述

如果输入的值是name[]=1&password[]=2的结果就是获取到的值为null,在图中上面的部分,判断的值也就相等了,从而达到绕过的目的。这种情况在ctf中比较常见。

  1. intval()函数:就是把其他类型的东西变成10进制int类型的数据。具体用法参考:https://www.runoob.com/php/php-intval-function.html
    这个东西,可以用来过滤sql注入,比如id=1 and 1=1 ,使用这个函数,只能获取到id = 1 ,同时根据文档里的这段话:

    语法
    int intval ( mixed $var [, int $base = 10 ] )
    参数说明:
    $var:要转换成 integer 的数量值。
    $base:转化所使用的进制。
    如果 base 是 0,通过检测 var 的格式来决定使用的进制:
    如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,
    如果字符串以 “0” 开始,使用 8 进制(octal);否则,
    将使用 10 进制 (decimal)。

在这里插入图片描述
666的十六进制的值是0x29a,此时如果用户输入的值是0x29a,这两个值仍然是相等的关系,也会输出flag。

  1. strpos()函数:查找字符串在另一字符串中第一次出现的位置(区分大小写)。
    参考:https://www.runoob.com/php/func-string-strpos.html
    在这里插入图片描述

  2. in_array() 函数:
    参考:https://www.runoob.com/php/func-array-in-array.html

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
参数 描述
needle 必需。规定要在数组搜索的值。
haystack 必需。规定要搜索的数组。
strict 可选。如果该参数设置为 TRUE,则 in_array() 函数检查搜索的数据与数组的值的类型是否相同。

如果strict的位置是true可以检查类型相当于/=/=/=,如果是false的话,就相当于/=/=,这种情况就相当于存在绕过,例如1e在[1,2,3]中也算是出现过,1d/+1/1.0也出现过。

  1. preg_match()函数:用于执行一个正则表达式匹配
    参考:https://www.runoob.com/php/php-preg_match.html
    这里可以使用数组绕过:
    在这里插入图片描述

并且这里最后获取的值num的值是1,这是chatgpt给我的解释:

$_GET['num'] 是一个数组,而数组的首个元素是1,可以成功转换为数字。
因此,intval($num) 的结果是1,条件 if(intval($num)) 为真,导致 echo $flag; 被执行。

后面我去手动输出验证了一下,该段代码中:

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

$_GET[‘num’]获取到的值是Array,而intval( $_GET[‘num’])的值是1,所以可以输出最后正确的结果。

  1. str_replace()函数:以其他字符替换字符串中的一些字符(区分大小写)。
    //参考:https://www.w3school.com.cn/php/func_string_str_replace.asp
<!DOCTYPE html>
<html>
<body><?php
echo str_replace("world","Shanghai","Hello world!");
?></body>
</html>//输出结果:Hello Shanghai!

常常用于过滤sql
在这里插入图片描述

这种过滤无法迭代执行,例如输入sselectelect,最终还是会出现select的字样。

正则表达式中/i 是否区分大小写;/m 是否接受换行,可以使用%0a %20进行绕过。

%0a:代表换行符(Line Feed),ASCII码值为10。在URL编码中,换行符被表示为 %0a。
%20:代表空格字符。在URL编码中,空格通常被表示为 %20。

这类ctf题不仅可以参加比赛,而且还可以学习实际代码,将来实战很有帮助,不要单纯做ctf狗。
循环过滤一般用的就是正则表达式,顺序过滤用的是str_replace(),但是这个有比较特殊的用法,如下列代码:

<?php
$s = "..//..../";
$search = array('../','./');
$dir = str_replace($search,'',$s);
echo $dir;?>

首先会把$s中先将…/的结果替换完之后,再将结果中的./替换成空,这是我从实验中得来的,所以这种替换是按照数组的顺序进行替换的。

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

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

相关文章

由于找不到msvcr120.dll,无法继续执行代码

一、msvcr120.dll作用介绍 msvcr120.dll文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件。这个文件在Windows操作系统中提供C运行时库支持&#xff0c;包含了大量系统级函数和对象&#xff0c;这些函…

jetson-inference----docker内运行分类任务

系列文章目录 jetson-inference入门 jetson-inference----docker内运行分类任务 文章目录 系列文章目录前言一、进入jetson-inference的docker二、分类任务总结 前言 继jetson-inference入门 一、进入jetson-inference的docker 官方运行命令 进入jetson-inference的docker d…

数据结构——静态链表

1.定义&#xff1a; &#xff08;1&#xff09;单链表&#xff1a;各个结点散落在内存中的各个角落&#xff0c;每个结点有指向下一个节点的指针(下一个结点在内存 中的地址); &#xff08;2&#xff09;静态链表&#xff1a;用数组的方式来描述线性表的链式存储结构: 分配一…

【业务功能篇133】 Mysql连接串优化性能问题

rewriteBatchedStatementstrue开启了MySQL驱动程序的批量处理功能。 spring.datasource.urljdbc:mysql://localhost:3306/mydatabase?rewriteBatchedStatementstrue 在MyBatis Plus框架中&#xff0c;批量插入是一种高效的数据库操作方式。通过开启rewriteBatchedStatementstr…

Vue3 Teleport 将组件传送到外层DOM位置

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

力扣刷MySQL-第八弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

DAY18--learning English

一、积累 1.tobacco The disturbing History of Tobacco. 令人不安的烟草历史。 2.commodity How commodity Market work. 必需品商店是如何运作的. 3.cane Sugarcane --- 甘蔗 Sugarcane Farm --甘蔗农场 4.decay Tooth decay. 蛀牙 5.compensate Chinese gammer have evlove…

【Web前端实操13】实现100*100的盒子的阴影效果,阴影值自拟

相关知识点&#xff1a; 盒阴影 box-shadow 向框添加一个或多个阴影。 1 box-shadow: h-shadow v-shadow blur spread color inset; 值描述h-shadow必选&#xff0c;水平阴影的位置v-shadow必选&#xff0c;垂直阴影的位置blur可选&#xff0c;模糊距离spread可选&#xf…

Scrapy爬虫在新闻数据提取中的应用

Scrapy是一个强大的爬虫框架&#xff0c;广泛用于从网站上提取结构化数据。下面这段代码是Scrapy爬虫的一个例子&#xff0c;用于从新闻网站上提取和分组新闻数据。 使用场景 在新闻分析和内容聚合的场景中&#xff0c;收集和组织新闻数据是常见需求。例如&#xff0c;如果我…

史上最全知识图谱建模实践(上):本体结构与语义解耦

在“无需复杂图谱术语&#xff0c;7个原则搞定Schema建模”一文中&#xff0c;我们总结了知识建模最佳实践的7个指导原则。本文中&#xff0c;我们将分基础篇、进阶篇&#xff0c;针对不同业务场景的建模需求&#xff0c;由浅及深讲解基于SPG的知识建模的方法和案例&#xff0c…

JS进阶-深入面向对象(三)

看文章可以得到的收获&#xff1a; 1.在日常开发中&#xff0c;我们在声明一个数组对象后&#xff0c;没有声明有map&#xff0c;filter等方法&#xff0c;为什么可以调用这些方法呢&#xff1f; 2. 什么是面向过程思想&#xff0c;什么是面向对象思想呢&#xff1f; 3.JS中…

免费的 UI 设计资源网站 Top 8

今日与大家分享8个优秀的免费 UI 设计资源网站。这些网站的资源包括免费设计材料站、设计工具、字体和其他网站&#xff0c;尤其是一些材料站。它们是免费下载的&#xff0c;材料的风格目前很流行&#xff0c;适合不同的项目。非常适合平面设计WEB/UI设计师收藏&#xff0c;接下…

C#,数据检索算法之线性检索(Linear Search)的源代码

数据检索算法是指从数据集合&#xff08;数组、表、哈希表等&#xff09;中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 线性&#xff1f;听起来就“高大上”&#xff0c;其实&#xff0c;只不过就是挨个比较呗。 本文发布&#xff08;听起来很正式 &#x…

一个好用的服务器控制面板

简介 它是一个免费开源的管理面板工具&#xff0c;可以帮助你集中管理多个服务器和网站。Ajenti 支持 Linux、BSD、Mac OS X和Windows 等多个操作系统&#xff0c;并且可以通过一个直观的 Web 界面来完成各种系统管理任务。 相比于其他管理面板&#xff0c;Ajenti有以下几个优…

损失函数详细复现(pytorch版本)

什么是损失函数 损失函数&#xff08;Loss Function&#xff09;是在机器学习和深度学习中用于评估模型预测结果与实际标签之间差异的函数。它衡量了模型的性能&#xff0c;即模型对训练样本的预测与实际标签的偏差程度。目标是通过调整模型参数&#xff0c;使损失函数的值最小…

有向图的拓扑序列——拓扑排序

问题描述 什么是拓扑序列 若一个由图中所有点构成的序列 A 满足&#xff1a;对于图中的每条边 (x,y)&#xff0c;x 在 A 中都出现在 y 之前&#xff0c;则称 A 是该图的一个拓扑序列。图中不能有环图中至少存在一个点的入度为0 如何求拓扑序列&#xff1f; 计算出每个节点的…

06 BGP 基础报文状态

06 BGP 基础 报文状态 05 BGP 大纲-CSDN博客 1 BGP 的基础 1.1 为什么要使用 BGP 我们要在不同AS之间实现网络通信,需要使用EGP-BGP协议,当然我们还看重BGP的一些优势 1)非常稳定 2)可以传输大量的路由,支持大规模网络 3)具有非常丰富的路由控制策略,可以实现灵活…

常用通信总线学习——RS232与RS485

RS232概述 RS-232标准接口&#xff08;又称EIA RS-232&#xff09;是常用的串行通信接口标准之一&#xff0c;它是由美国电子工业协会(Electronic Industry Association&#xff0c;EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定&#xff0c;其全…

缓存和CDN完整指南

1*JfOWR6ECe92QhH_UTwulrg.png 假设一家公司将其网站托管在芬兰的Google Cloud数据中心的服务器上。对于欧洲的用户&#xff0c;加载可能需要大约100毫秒&#xff0c;但对于墨西哥的用户&#xff0c;可能需要3-5秒。幸运的是&#xff0c;有策略可以最小化远程用户的请求延迟。 …

破解不了WIFI?也许你应该试试社工...

以下案例为虚拟环境,请勿模仿 做什么? 由于工作出差在该某某企业出差,手机和电脑都没办法用流量…流量包1G1块…太贵了…我勒个豆啊…发现WIFI密码难以破解&#xff08;小kali上过了&#xff09;。 出去逛逛吧…发现楼道有海康威视摄像头,学过交换机的一般都看得出来这个摄像…