php发展

注册

 

发新话题 回复该主题

CTF题目中遇到的PHP考点总结一 [复制链接]

1#
儿童医院白癜风外用药 https://m-mip.39.net/fitness/mipso_4349562.html

介绍

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

PHP函数特性相关

一、

考点一:intval函数传入非空数组时会返回1详情可以查一下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("nonono!");}if(intval($num)){echo$flag;}}

例题分析:

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

payload:?num[]=1

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

二、

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

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

例题:

include("flag.php");highlight_file(__FILE__);if(isset($_GET[num])){$num=$_GET[num];if($num===""){#===在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等die("nonono!");}if(intval($num,0)===){echo$flag;}else{echointval($num,0);}}

例题分析:

如下图所示,通过查询php手册,我们发现,intval($value,$base)当base为0时,会检测value的格式来决定使用的进制,所以我们可以通过把转换成16进制,经过base为0的intval函数处理,会识别16进制的,从而返回flag,又因为===在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等,所以由于字符串类型不同会返回false,从而绕过死亡函数。

payloadnum=?num=0xc

三、

考点一:strpos()函数查找字符串在另一字符串中第一次出现的位置并返回

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

例题:

if(isset($_GET[num])){$num=$_GET[num];if($num===""){die("nonono!");}if(preg_match("/[a-z]/i",$num)){die("nonono!");}if(!strpos($num,"0")){#strpos()函数查找字符串在另一字符串中第一次出现的位置并返回。die("nonono!");}if(intval($num,0)===){echo$flag;}}

例题分析:

这道题目如果我们可以用八进制的来绕过,那么会有一个问题,因为八进制需要开头指定为0,而strpos()会匹配到数字0返回0,!0也就是1从而执行死亡函数,所以我们可以在八进制前面加一个空格,这样strpos()会返回1,所以我们把转换为8进制后,前面再加一个空格即可。

payload如下:

?num=0

四、

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

考点二:在PHP强比较中变量a、b两个值不一样,要求两者md5值相同时的绕过方法。

考点三:PHP中md5函数处理数组类型会返回falsefalse的特性。

例题:

if(isset($_POST[a])andisset($_POST)){  if($_POST[a]!=$_POST)    if(md5($_POST[a])===md5($_POST))      echo$flag;  else    printWrong.;}

例题分析:

这一道题涉及到了强比较的md5类型,从代码我们可以得知,要求a、b两个值不一样但是需要这两个值得md5值一样,因此强比较类型,我们可以利用md5函数处理数组类型会返回false的特性,从而利用false=false来绕过。我之前写过一篇总结相关知识点的文章链接如下:

分享 转发
TOP
发新话题 回复该主题