一些基本PHP函数的安全问题

本文介绍了PHP中的MD5加密、intval函数用于整数转换、strpos函数查找字符串位置以及in_array函数在数组中的应用。讨论了弱类型比较可能导致的安全问题,并举例了CTF中的应用场景和安全漏洞利用技巧。
摘要由CSDN通过智能技术生成
    echo "info1=".md5($_GET['info1']).'<br>';
    echo "info2=".md5($_GET['info2']).'<br>';
}
else {
    echo "?";
}}

解题方法十分简单,百度搜索 MD5 值相同的数据,因为`==`不区分数据类型,因此我们可以 输入如下的参数,比如`info1=s878926199a&info2=s155964671a`。  
![image.png](https://img-blog.csdnimg.cn/img_convert/e243e6e98a437082b8a9c443e6b85a35.png)  
  
 此时我们会发现,其实`info1`和`info2`的 md5 值是不一样的,那为什么为通过检测呢?  
本质上原因是因为我们在进行比较的时候,使用的是**弱类型比较**,两个开头为0的md5值相同。所以会通过测试。  
 


### 02-intval 函数


在PHP中,`intval()` 函数用于获取变量的整数值。如果变量是一个字符串,`intval()` 会尝试将该字符串转换为整数。如果变量是一个浮点数,`intval()` 会截断小数部分,只返回整数部分。如果变量是布尔值,`true` 会被转换为 `1`,`false` 会被转换为 `0`。如果变量是null,则返回 `0`。  
函数原型如下:



int intval(mixed $value [, bool $base = NULL])


参数说明:


* `$value`:需要转换的变量。
* `$base`:可选参数,指定进制。如果设置,`intval()` 会假设 `$value` 是一个进制数(基数为2-36之间),并将其转换为相应的整数。  
示例:



$str = “123”;
i n t = i n t v a l ( int = intval( int=intval(str);
echo $int; // 输出 123
$float = 123.456;
i n t = i n t v a l ( int = intval( int=intval(float);
echo $int; // 输出 123
$bool = true;
i n t = i n t v a l ( int = intval( int=intval(bool);
echo $int; // 输出 1
$null = null;
i n t = i n t v a l ( int = intval( int=intval(null);
echo $int; // 输出 0
$hex = “1a3f”;
i n t = i n t v a l ( int = intval( int=intval(hex, 16);
echo $int; // 输出 2631


需要注意的是,`intval()` 函数不会在数字前后添加空格,也不会将数字转换为字符串。如果需要将整数转换为字符串,可以使用 `strval()` 函数。  
 常见的 CTF 赛题形式如下:



<?php $flag='this is the flag 2024'; if(isset($_GET['num'])){ $NUM=$_GET['num']; if($NUM==="4476"){ die("GO out!"); } if(intval($NUM,0)===4476){ echo $flag; }else{ echo intval($NUM,0); } } ``` 此时`num`值为 8 进制的=010574,实际转换为十进制即为 4476,因此我们只要传入`info=010574`即可通过测试。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0e6b523b6fc743b89476b2aabd1b9361.png) ### 03-strpos 函数 在PHP中,`strpos()` 函数用于查找一个字符串在另一个字符串中首次出现的位置。它的基本语法如下: ``` int strpos(string $haystack, string $needle, int $offset = 0) ``` 参数说明: * `$haystack`:需要搜索的字符串。 * `$needle`:需要在 `$haystack` 中搜索的字符串。 * `$offset`:可选参数,指定开始搜索的位置。默认值为 `0`,表示从 `$haystack` 的开头开始搜索。 `strpos()` 函数会返回 `$needle` 在 `$haystack` 中首次出现的位置的索引,如果未找到 `$needle`,则返回 `false`。 示例: ``` $haystack = "Hello, World!"; $needle = "World"; $pos = strpos($haystack, $needle); if ($pos !== false) { echo "'$needle' 在 '$haystack' 中首次出现的位置是:$pos"; // 输出:'$needle' 在 '$haystack' 中首次出现的位置是:6 } else { echo "'$needle' 在 '$haystack' 中没有找到"; } ``` 在 CTF 中,`strpos`函数常见的绕过方法就是使用`%0a`作为换行,加上目标参数进行绕过。 ### 04-in\_array 函数 `in_array()` 函数在 PHP 中用于检查数组中是否存在指定的值。它的基本语法如下: ``` bool in\_array(mixed $needle, array $haystack, bool $strict = false) ``` 参数说明: * `$needle`:需要查找的值。 * `$haystack`:需要搜索的数组。 * `$strict`:可选参数,如果设置为 `true`,`in_array()` 将使用严格比较(即类型和值都相同),否则将使用宽松比较(仅值相同)。默认值为 `false`。 `in_array()` 函数会返回 `true` 如果 `$needle` 存在于 `$haystack` 数组中,否则返回 `false`。 示例: ``` $array = array("apple", "banana", "cherry"); if (in\_array("banana", $array)) { echo "找到了 'banana' 在数组中。"; } else { echo "没有找到 'banana' 在数组中。"; } ``` **其中当我们在函数**`**in_array()**`**中没有设置第三个参数为**`**true**`**时候,假设有一个安全漏洞,攻击者可以控制 **`**$haystack**`** 数组:** ``` <?php $haystack = array("apple", "banana", "cherry"); $needle = "banana"; // 假设这个检查是为了防止恶意操作 if (in\_array($needle, $haystack)) { // echo "执行敏感操作"; } else { echo "阻止执行"; }?>

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值