CTF题目中遇到的PHP考点总结(一)

本文主要总结了CTF比赛中遇到的PHP相关考点,包括函数特性如intval、preg_match、strpos、in_array等的使用细节及漏洞利用,以及如何通过这些函数特性构造payload来绕过限制。内容涵盖字符串比较、进制转换、文件操作等多个方面,适合PHP开发者和CTF选手学习。
摘要由CSDN通过智能技术生成

在这里插入图片描述

介绍

本篇文章主要总结了我在写ctfshow题目中遇到的关于PHP的考点。因为只总结知识点和考点会比较空洞,也不容易理解,所以我都是通过题目来总结考点,这样的话比较容易理解。

PHP函数特性相关

一、

考点一:intval函数传入非空数组时会返回1 详情可以查一下PHP手册。【https://www.php.net/manual/zh/function.intval.php】 考点二:preg_match()只能处理字符串,当传入的是数组时将会返回false,详情也可以查一下PHP手册。

例题

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

例题分析:

分析上面的代码可以看出,正则匹配0-9,匹配到则返回true,直接die,但是由于preg_match()只能处理字符串,当传入的是数组时将会返回false,从而绕过死亡函数。由于之前没怎么了解过intval函数,所以我直接选择查阅php手册【https://www.php.net/manual/zh/function.intval.php】查阅后发现 **intval()**函数用于获取变量的整数值。**intval()**函数通过使用指定的进制 base 转换(默认是十进制),返回变量var的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。也就是说,当给intval()函数传入一个非空的数组时,intval()函数将会返回1,结合我们preg_match()传入数组返回false的特性,这道题的payload就很清楚了。

payload:
?num[]=1

【技术文档】

1、200多本网络安全系列电子书
2、全套工具包
3、100份src源码技术文档
4、网络安全基础入门、Linux、web安全、攻防方面的视频
5、 网络安全学习路线
6、ctf夺旗赛解析

二、

考点一:PHP比较运算符 ===在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等。

考点二:intval( v a l u e , value, value,base)当base为0时,会检测value的格式来决定使用的进制。

例题:

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);
    }
}

例题分析:

如下图所示,通过查询php手册,我们发现,intval( v a l u e , value, value,base)当base为0时,会检测value的格式来决定使用的进制,所以我们可以通过把4476转换成16进制,经过base为0的intval函数处理,会识别16进制的4476,从

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值