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

news2024/12/26 12:02:59

第一部分: 特征函数

接触到几个常用的函数:
\=\=
\=\=\=
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.coloradmin.cn/o/1408925.html

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

相关文章

leetcode刷题(剑指offer) 105.从前序与中序遍历序列构造二叉树

105.从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,…

【江科大】STM32:USART串口(理论部分)上

串口 全双工&#xff1a;可以进行同步通信 单端信号&#xff1a;信号线传输的就是单端信号。&#xff08;也就是与地线&#xff08;GND&#xff09;的电势差&#xff09; 缺点&#xff1a;防干扰能力差 原因&#xff1a;当信号从A点传输到B点&#xff0c;理想条件是A&#xff0…

java steam 的使用

说steam 前看下kotlin的一个写法如果用java怎么写 fun main() {// 创建一个列表val fruits listOf("Apple", "Banana", "Cherry", "Date", "Elderberry")// 使用 Sequence 进行过滤和映射操作val uppercaseFruitLengths …

qt-C++笔记之命令行编译程序,特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况

qt-C笔记之命令行编译程序&#xff0c;特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况 —— 杭州 2024-01-24 code review! 文章目录 qt-C笔记之命令行编译程序&#xff0c;特别是使用Q_OBJECT宏包含了moc(Meta-Object Compiler)的情况1.问题现象&#xff1a;q…

【华为 ICT HCIA eNSP 习题汇总】——题目集6

1、IEEE 802.11g 标准支持的最大协商速率为&#xff08;&#xff09;。 A、300Mbps B、150Mbps C、54Mbps D、1200Mbps 考点&#xff1a;无线局域网 解析&#xff1a;&#xff08;C&#xff09; IEEE 802.11系列标准如下表&#xff1a; 标准数据传输速率主要技术IEEE 802.111M…

qml与C++的交互

qml端使用C对象类型、qml端调用C函数/c端调用qml端函数、qml端发信号-连接C端槽函数、C端发信号-连接qml端函数等。 代码资源下载&#xff1a; https://download.csdn.net/download/TianYanRen111/88779433 若无法下载&#xff0c;直接拷贝以下代码测试即可。 main.cpp #incl…

Qt/QML编程之路:ListView实现横排图片列表的示例(40)

ListView列表,在QML中使用非常多,排列一个行,一个列或者一个表格,都会用到ListView。 ListView显示从内置QML类型(如ListModel和XmlListModel)创建的模型中的数据,或在C++中定义的从QAbstractItemModel或QAbstract ListModel继承的自定义模型类中的数据。 ListView有一…

计算机服务器中了mallox勒索病毒解密方案计划,勒索病毒解密措施

计算机技术的不断应用与发展&#xff0c;为企业的生产运营提供了有利条件&#xff0c;但网络安全威胁无处不在。近期&#xff0c;广西某生物制药企业的计算机服务器遭到了mallox勒索病毒攻击&#xff0c;导致企业的计算机所有重要数据被加密&#xff0c;严重影响企业的生产运营…

H5嵌入小程序适配方案

时间过去了两个多月&#xff0c;2024已经到来&#xff0c;又老了一岁。头发也掉了好多。在这两个月时间里都忙着写页面&#xff0c;感觉时间过去得很快。没有以前那么轻松了。也不是遇到了什么难点技术&#xff0c;而是接手了一个很烂得项目。能有多烂&#xff0c;一个页面发起…

gin中使用swagger生成接口文档

想要使用gin-swagger为你的代码自动生成接口文档&#xff0c;一般需要下面三个步骤&#xff1a; 按照swagger要求给接口代码添加声明式注释&#xff0c;具体参照声明式注释格式。使用swag工具扫描代码自动生成API接口文档数据使用gin-swagger渲染在线接口文档页面 第一步&…

IDEA远程服务器开发

IDEA的远程开发是在本地去操远程服务器上的代码&#xff0c;可以直接将本地代码的编译,构建,调试,运行等工作都放在远程服务器上而本地运行一个客户端远程去操作服务器上的代码,就如同我们平常写代码一样。相比于云桌面成本更低,开发效率更高。 1.首先服务器配置jdk&#xff0…

C# 将HTML网页、HTML字符串转换为PDF文件

将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途&#xff0c;满足不同领域和情境下的需求。本文将通过以下两个示例&#xff0c;演示如何使用第三方库Spire.PDF for .NET和QT插件在C# 中将Html 网页&#xff08;URL&#xff09;或HTML字符串转为PDF文件。 HTML转…

微服务环境搭建:docker+nacos单机

nacos需要连接mysql&#xff0c;持久化相关配置。 1. 部署好mysql后&#xff0c;新建nacos数据库然后初始化nacos脚本 -- -------------------------------------------------------- -- 主机: 192.168.150.101 -- 服务器版本: …

[Go]认识Beego框架

对比Gin的简洁&#xff0c;自己之前基于Gin撸了一个架子&#xff0c;确实比beego目录看着舒服多了&#xff0c;不过最近接触到beego的项目&#xff0c;beego的bee工具使用还是很方便&#xff0c;来简单梳理下细节&#xff1b; Beego是一个开源的Go语言Web应用框架&#xff0c;…

jenkins+gitlab实现Android自动打包填坑之旅

一.背景 1.首先你需要知道你想要实现的Android自动打包的Android项目的一些环境配置及需要使用的一些开发版本。 声明&#xff1a;本文 Android项目基于&#xff1a;1.jdk11 2.SDK无要求 3.gradle无要求&#xff08;同Manven一样为项目自动化构建开源工具&#xff09; 注&am…

【安卓版】网页转应用v1.2,生成属于你的专属应用

网页转应用可以将网址转换成可安装的APP应用。无论是新闻、博客、论坛、游戏&#xff0c;还是在线购物网站或者社交媒体平台&#xff0c;只要你有个希望转换的网址&#xff0c;这款应用都能为你实现&#xff0c;应用永久免费使用&#xff0c;并且无需联网&#xff0c;即可生成你…

【JavaWeb】会话管理 cookie session 三大域对象总结

文章目录 会话管理一、Cookie1.1 Cookie的使用1.2 Cookie的时效性1.3 Cookie的提交路径 二、Session2.1 HttpSession的使用2.2 HttpSession时效性 三、三大域对象3.1 域对象概述3.2 域对象的使用 总结 会话管理 HTTP是无状态协议 无状态就是不保存状态,即无状态协议(stateless)…

GIt同时存在传入和传出更改修改,无法合并

前言 Git是常用的版本管理工具&#xff0c;之前面试被问到过一次——Git有无遇到过使用错误情况&#xff1f;当时卡壳了没答上来&#xff0c;所以这次遇到&#xff0c;特此记录学习。 问题概述 前一天提交了代码&#xff0c;mt进行了修改。但我忘记拉取最新&#xff0c;就进…

1.19号网络

超时检测 概念 1> 在网络通信中&#xff0c;有很多函数是阻塞函数&#xff0c;会导致进程的阻塞&#xff0c;例如&#xff1a;accept、recv、recvfrom、等等 2> 为了避免进程在阻塞函数处&#xff0c;无休止的等待&#xff0c;我们可以设置一个超时时间&#xff0c;当…

【云原生】Docker的端口映射、数据卷、数据卷容器、容器互联

目录 一、端口映射&#xff08;相当于添加iptables的DANT&#xff09; 二、数据卷创建&#xff08;宿主机目录或文件挂载到容器中&#xff09; 三、数据卷容器&#xff08;多个容器通过同一个数据卷容器为基点&#xff0c;实现所有容器数据共享&#xff09; 四、容器互联&am…