[BT]小迪安全2023学习笔记(第20天:Web攻防-Java特性)

news/2024/4/15 14:17:44

第20天

==和===

==(等值比较)
当使用 == 操作符时,PHP将进行宽松比较,也就是说,只比较两个值的等价性,而不考虑它们的类型。

如果两个值类型不同,PHP会尝试将它们转换成相同的类型,然后再进行比较。

例如,字符串 “100” 和整数 100 使用 == 比较时结果为 true,因为字符串 “100” 在比较时会被转换成整数 100。

if ("100" == 100) { // true,因为值相等echo "等值";
}

===(全等比较)
使用 === 操作符时,PHP将进行严格比较,这意味着它不仅比较两个值的等价性,还会比较它们的类型。

只有当两个值的类型相同,且值也相等时,比较结果才为 true。

使用上面的例子,字符串 “100” 和整数 100 使用 === 比较时结果为 false,因为尽管它们的值相等,但类型不同。

if ("100" === 100) { // false,因为类型不相同echo "全等";
}

MD5

PHP中MD5比对漏洞通常与==(等值比较)操作符的使用有关。这种漏洞源于PHP在使用==进行字符串比较时,如果两个比较的字符串都是以0e开头,后跟纯数字,PHP会将它们视为科学记数法表示的数值零。因此,即使两个字符串实际上是不同的,它们也会被认为是相等的。

漏洞示例

$hash1 = md5('240610708');
$hash2 = md5('QNKCDZO');if ($hash1 == $hash2) {echo '两个不同的字符串产生的MD5值被认为是相等的。';
}

md5(‘240610708’) 的结果是 0e462097431906509019562988736854,
md5(‘QNKCDZO’) 的结果是 0e830400451993494058024219903391。

由于这两个MD5值都以0e开头,后面跟随的都是数字,根据PHP的等值比较规则,这两个MD5值被认为是相等的,即使它们实际上是不同的字符串的结果。

安全建议
为避免这种安全漏洞,推荐使用全等比较操作符 ===,因为全等比较会认为这两个MD5值不相等

当涉及到敏感数据比对(如密码哈希值)时,应始终使用全等比较操作符 ===,以确保既比较值也比较值的类型,从而避免潜在的安全风险。

PHP中关于数组使用md5函数可能遇到的“漏洞”或不当行为,主要是由于md5函数对非字符串参数的处理方式引起的。由于 PHP 的 md5 函数不直接支持数组类型,尝试对任何数组使用 md5 函数将导致 PHP 内部将数组转换为字符串 “Array”,然后对该字符串计算 MD5 值。因此,不管数组的内容或数组变量的名称如何,只要传递的是数组,md5 函数都会返回对字符串 “Array” 的 MD5 哈希值,这意味着所有不同的数组都会返回相同的 MD5 值。

行为示例

$hash = md5(array('key' => 'value'));
echo $hash;

上述代码会产生类似以下的警告:

vbnet
Copy code
Warning: md5() expects parameter 1 to be string, array given in ...

并且md5函数会返回对字符串"Array"的MD5哈希值,而不是输入数组的哈希值。这意味着,无论数组的内容如何,对任何数组使用md5都会返回相同的结果,即:

echo md5("Array"); // 产生固定的输出

intval函数

PHP的intval()函数用于获取变量的整数值。这个函数可以将字符串、浮点数或布尔值转换成整数。当处理数值转换时,intval()是一个非常有用的函数。

基本语法如下:

intval(mixed $value, int $base = 10): int
$value:要转换的值。它可以是字符串、浮点数、布尔值,或者任何你想转换为整数的值。
$base:转换的基数(进制)。默认是10进制。这个参数对于字符串转换特别有用,因为它允许你指定字符串表示的数值的基数。有效的基数范围是236
字符串转整数:
echo intval("42"); // 输出: 42浮点数转整数:
echo intval(42.7); // 输出: 42布尔值转整数:
echo intval(true); // 输出: 1
echo intval(false); // 输出: 0带基数的字符串转整数:
echo intval('1e', 16); // 输出: 30,因为 '1e' 在16进制下等于十进制的30

注意事项

  • 转换规则:如果$value是字符串,则会根据字符串的起始部分尝试转换成整数。如果字符串起始部分不是数字或符号(+/-),intval()将返回0。
  • 浮点数转换:转换浮点数时,intval()会将浮点数向下取整到最接近的整数值。
  • 布尔值转换:布尔值true会被转换为1,false会被转换为0。
  • 基数的使用:当处理字符串转换时,$base参数允许你指定字符串是哪个基数(进制)下的数值,这对于处理不同进制的数值字符串特别有用。

strpos函数

在PHP中,strpos() 函数用于查找字符串内首次出现的另一字符串的位置。如果找到了字符串,则返回首次出现的位置的索引(注意,索引从0开始)。如果没有找到,则返回 FALSE。

strpos(string $haystack, mixed $needle, int $offset = 0): int|false
$haystack:需要搜索的字符串。
$needle:要查找的字符串值。如果 needle 不是一个字符串,它将被转换为整型并视为字符的顺序值。
$offset:可选参数,指定从哪个字符位置开始搜索。默认值为0
$position = strpos("Hello world", "world");
echo $position; // 输出: 6//在这个例子中,"world" 在 "Hello world" 中首次出现的位置是索引6(H=0, e=1, l=2, l=3, o=4, 空格=5, w=6)。//未找到字符串:
$position = strpos("Hello world", "php");
if ($position === false) {echo "字符串未找到";
} else {echo "字符串位于位置: $position";
}//在这个例子中,由于 "php" 没有在 "Hello world" 中出现,所以 strpos() 返回 false。//使用偏移量:
$position = strpos("This is a test", "is", 3);
echo $position; // 输出: 5//这里,搜索从索引3("s"的位置)开始,所以找到的 "is" 是在索引5的位置,而不是字符串开头处的 "is"。

注意事项
严格比较:当 strpos() 返回0时,表示找到的字符串位于 $haystack 的开始位置。因为0在PHP中是一个有效的位置索引,但它在布尔上下文中被视为 false。因此,比较 strpos() 的结果时,应使用全等(=== 或 !==)比较,以准确区分返回的0和 false。

in_array函数

PHP中的in_array()函数用于检查数组中是否存在某个值。如果指定的值存在于数组中,则函数返回true;否则,返回false。这个函数在需要判断一个项是否已经包含在数组中时非常有用,比如在处理表单输入或验证数据时。

in_array(mixed $needle, array $haystack, bool $strict = false): bool
$needle:需要搜索的值。
$haystack:被搜索的数组。
$strict:这是一个可选参数,如果设置为true,则in_array()还会检查$needle与找到的元素的类型是否完全相同。
$array = array("Apple", "Orange", "Banana");if (in_array("Apple", $array)) {echo "找到了Apple。";
} else {echo "没有找到Apple。";
}//使用严格模式:
$array = array(1, 2, "3", 4);if (in_array("3", $array, true)) {echo "严格模式:找到了字符串'3'。";
} else {echo "严格模式:没有找到字符串'3'。";
}if (in_array(3, $array, true)) {echo "严格模式:找到了数字3。";
} else {echo "严格模式:没有找到数字3。";
}

在这个例子中,第一次in_array调用未找到"3",因为启用了严格模式,而数组中的"3"是字符串类型,与搜索的数字类型不匹配。第二次调用同样没有找到数字3,因为虽然数组中确实有一个值为3的字符串,但严格模式要求类型也必须匹配

注意事项
在不使用严格模式(默认情况)时,in_array()只比较值,不比较类型。这意味着数字1和字符串"1"会被视为相等。
在使用严格模式(将$strict参数设置为true)时,in_array()会同时比较值和类型,提高了比较的准确性。

preg_match函数

这是PHP中用于执行正则表达式匹配的函数。preg_match()函数会执行一个正则表达式匹配测试,如果模式匹配成功,则返回1;如果失败,则返回0;如果发生错误,则返回FALSE。

preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0)
$pattern:要搜索的模式,即正则表达式。正则表达式字符串需要被定界符包围,如/pattern/$subject:输入字符串,即需要进行正则表达式匹配的文本。
$matches:(可选)如果提供,它将被填充为搜索结果。$matches[0]将包含完整模式匹配到的文本,$matches[1]将包含第一个括号内的子模式匹配到的文本,依此类推。
$flags:(可选)可以用来控制匹配的各种选项。
$offset:(可选)从目标字符串的哪个位置开始搜索(以字节为单位)。
$subject = "This is a test";
$pattern = "/is/";if (preg_match($pattern, $subject, $matches)) {echo "匹配成功。\n";print_r($matches);
} else {echo "匹配失败。";
}

str_replace函数

PHP中的str_replace()函数用于替换字符串中的一些字符或子字符串。这个函数非常灵活,可以处理简单的字符替换,也能进行批量的子字符串替换,并且可以在数组中搜索和替换。

str_replace(mixed $search, mixed $replace, mixed $subject, int &$count = null): mixed
$search:要查找的字符串(或字符串数组)。这是你想要在$subject中被替换掉的部分。
$replace:用于替换的字符串(或字符串数组)。这是替换$search找到的内容的部分。
$subject:输入字符串(或字符串数组)。这是被搜索和替换的原文本。
$count:(可选)一个变量,用于统计进行替换的次数。
//返回替换后的字符串或数组。如果$subject是数组,那么str_replace()返回一个数组;如果$subject是字符串,返回一个字符串。echo str_replace("world", "PHP", "Hello world"); // 输出:Hello PHP,默认只替换一次//数组替换:
$find = array('apple', 'banana');
$replace = array('orange', 'grape');
$subject = 'I love apple and banana.';echo str_replace($find, $replace, $subject); // 输出:I love orange and grape.//统计替换次数:
$count = 0;
str_replace('apple', 'orange', 'apple pie, apple juice, and apples', $count);
echo $count; // 输出:3

注意事项
如果$search和$replace都是数组,则它们的键值一一对应,即每个$search的值将被对应$replace的值替换。
如果$replace的元素少于$search的元素,多出的$search将用空字符串进行替换。
如果$subject是数组,则$search和$replace的处理会应用于数组的每一个元素。
str_replace()是大小写敏感的。如果需要进行大小写不敏感的替换,请使用str_ireplace()函数。

例题1

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num=$_GET ['num’];if(preg_match(”f [0-9]/,$num)){die("no no no! ");}if (intval ($num) ){echo$flag;}
}

payload:url + ?num[] = 1

解析:$num是一个数组,这导致preg_match()直接返回false,并且不会执行die(“no no no!”),因为preg_match()期望的是字符串,而这里提供的是数组。当对数组应用intval()函数时,PHP会将数组转换为整数。在PHP中,将数组转换成整数通常结果为0。

综上,该代码片段试图通过正则表达式来限制输入值必须为数字,并通过intval()来确保这个值在经过类型转换后仍然为真(即非零)。然而,由于$_GET[‘num’]可以通过num[] = 1变为数组,从而绕过了正则表达式检查。

例题2

include ("flag. php");
highlight_file(__FILE__);
if(isset ($_GET ['num'])){$num =$_GET['num'];if($num==="4476"){die("no no no! ");}if(intval ($num, 0)===4476){echo $flag;}else {echo intval ($num, 0);}
}

payload: url + ?num = 010574

解析:使用intval()函数时,如果指定第二个参数(基数)为0,那么intval()函数会根据字符串的格式自动判断数值的基数。特别是,如果字符串以"0"开头,PHP会将这个字符串当作八进制数来处理。
因此,当传递num=010574时,intval($num)会将010574解释为一个八进制数,转换成十进制是4476。由于$num(字符串"010574")不严格等于(===)字符串"4476",因此不会执行die(“no no no!”);语句。在接下来的if语句中,intval($num)的结果确实等于4476(十进制),因此满足条件,执行echo $flag;,展示了$flag的内容。

例题三

show_source(__FILE__);
include('flag.php');
$a = $_GET['cmd'];
if (preg_match('/^php$/im', $a)) {if (preg_match('/^php$/i', $a)) {echo 'hacker';} else {echo $flag;}
} else {echo 'nonononono';
}

payload: url + ?cmd = %0aphp

解析:%0a是URL编码形式的换行符(\n)。由于第一个preg_match使用了多行(m)模式,它将允许正则表达式匹配字符串中的任何位置(由于换行符的存在),使得$a匹配成功。换句话说,尽管$a的值以换行符开始,它仍然满足正则表达式的条件。第二个preg_match没有使用多行模式,因此理论上不会匹配以换行符开始的字符串\nphp,这导致执行流进入else分支,打印出$flag。


http://www.ppmy.cn/news/1373979.html

相关文章

uipath调用js代码

1,调用js代码,不带参数,没有返回值 为了去掉按钮的disabled属性 function(){ document.getElementsByClassName(submitBtn)[0].removeAttribute(disabled); } 2,调用js代码,带参数,没有返回值 输入参数&a…

2023年全国职业院校技能大赛软件测试赛题第8套

2023年全国职业院校技能大赛 软件测试赛题第8套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 赛项组别: 高等职业教育 …

CKA考试必备:解锁Pod封装多容器的高级技巧!

往期精彩文章 : 提升CKA考试胜算:一文带你全面了解RBAC权限控制!揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?CKA认证必备:掌握k8s网络策略的关键要点提高CKA认证成功率,CKA真题中的节点维…

word使用bib添加参考文献

文章目录 安装TexLive安装bibtex4word使用在word中添加参考文献使用bibtex4word在word中添加参考文献设置参考文献格式为毕业论文格式 参考 安装TexLive 从下载地址下载镜像iso文件texlive2023.iso双击打开iso镜像文件运行 install-tl-windows.bat点击安装非常非常非常耐心地安…

Python 文件基础科普与文件打开技术详解【第117篇—文件打开技术】

Python 文件基础科普与文件打开技术详解 在Python编程中,文件操作是一项基础而重要的任务。无论是读取数据、写入文件还是进行其他文件处理操作,都需要对文件基础知识有一定的了解。在本文中,我们将首先介绍Python文件的基础概念&#xff0c…

【Spring】21 通过@Primary注解优化注解驱动的自动装配

文章目录 Primary注解简介优势和适用场景小结 Spring 框架提供了强大的依赖注入机制,其中 Autowired 注解是一种常用的方式。然而,当存在多个候选 bean 时,通过类型自动装配可能导致选择困难。为了更好地控制这一过程,Spring 引入…

spring boot3token拦截器链的设计与实现

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 写在前面 流程分析 需要清楚的 实现步骤 1.定义拦截器 2.创建拦截器链配置类 3.配置拦截器链顺序 4.配置拦截…

python爬虫(一)

一、python中的NumPy模块(数据的存储和处理) 这里是下载完成之后的表现 (1)创建数组 1、使用array()函数创建数组 使用array函数可以创建任意维度的的数组 下面是一个创建二维数组的代码示例 下面是代码…

vue实现虚拟键盘

本文介绍一体机常用的虚拟键盘实现,主打一个免费文章。喜欢就点个赞支持一下吧 simple-keyboard官网:simple-keyboard - simple-keyboard - Francisco HodgeSimple-keyboard is a virtual keyboard for Javascript. You can use it as an input for dev…

工厂企业能源计量监测管理系统,让效果看得见、摸得着

工厂企业能源计量监测管理系统在我国工业企业中扮演着十分重要的角色。然而,我们也不得不面对一系列存在的问题,比如工业企业能源计量工作效率低下、工业企业能源计量使用的器具老旧等。这些问题不仅影响了工业企业的生产效率,还可能给环境造…

Vue.js+SpringBoot开发天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

本地部署websocket服务端并结合内网穿透实现固定公网地址连接

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

【二】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题

教学管理系统201703153 教学管理系统数据库展示 成绩表展示 课程表展示 学生表展示 院系表展示 一、基本操作 设置复合主键 设置其他表的主键 设置字段取值范围 二、简单操作 第一题 第二题 第三题 第四题 结尾 最后,感谢您阅读我的文章,希望这些内容能…

pytorch常见的函数梯度

目录 1. 常见的函数导数2. 常见函数梯度 1. 常见的函数导数 2. 常见函数梯度

wps没保存关闭了怎么恢复数据?恢复文件教程

Microsoft Word是我们不可或缺的工具。很多小伙伴都遇到在WPS中编辑文件时,它可能会突然闪退,或者忘记及时保存文件就直接关闭了,导致我们辛苦编辑的文档丢失。面对这种情况我们该如何应对,尽量减小损失呢?接下来让我为…

人工智能在信息系统安全中的运用

一、 概述 对于企业和消费者来讲,人工智能是非常有用的工具,那又该如何使用人工智能技术来保护敏感信息?通过快速处理数据并预测分析,AI可以完成从自动化系统到保护信息的所有工作。尽管有些黑客利用技术手段来达到自己的目的,但…

灵魂指针,教给(一)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 一、内存和地址 1.1 内存 在介绍知识之前,先来想一个生活中的小栗子: 假如把你放在一个有100间屋子的酒店…

应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控

作者:古琦 在现代软件架构中,微服务已成为构建可扩展和灵活应用程序的流行方式。每个微服务负责应用程序的一部分功能,它们共同工作以提供完整的服务。由于微服务架构的分散特性,监控变得至关重要,有效的微服务监控是…

EI论文复现:基于线性化方法的交直流混合配电系统网架规划程序代码!

适用平台:MatlabYalmipCplex 程序以系统的投资运行成本最小为目标,考虑了系统配置方案的所有可能性,对系统中每个节点之间的线路连接进行规划,为配电网提供最优的网架配置方案。程序算例丰富、注释清晰、干货满满,可扩…

删除指定的数

删除指定的数 题目描述:解法思路:解法代码:运行结果: 题目描述: 先输入10个整数存放在数组中,再输入⼀个整数n,删除数组中所有等于n的数字,数组中剩余的数组保证数组的最前面&#…
最新文章