CTF中的PHP特性函数解析之中篇(php如何接收用户输入)满满干货

随心笔谈9个月前发布 admin
214 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章主要介绍了PHP中几个常用函数在CTF(网络安全竞赛)中的应用,包括`intval()`、`strpos()`和`sha1()`等函数的绕过技巧和应用场景。 1. **intval()函数** - `intval()`用于将字符串转换为整数,仅对有小数点的数字起作用,可以用来绕过输入检查。 - 当`base`参数为0时,`intval()`会自动进行进制转换,可以利用这一点绕过头部限制(如八进制前缀)。 2. **strpos()函数** - `strpos()`用于检查字符串是否存在,常用于验证输入是否正确。 - 在CTF中,可以利用`strpos()`检测特定字符串,如IP地址或特定字符,从而绕过输入验证。 3. **sha1()函数** - `sha1()`用于计算字符串的哈希值,常用于检测数据完整性。 - 通过传递数组或特定字符串,可以利用`sha1()`的弱比较特性绕过强类型验证。 4. **数组绕过与强类型比较** - 在`sha1()`中,强类型比较会导致错误,可以通过传递特定数组值来绕过强比较。 - 同理,`intval()`和`strpos()`等函数也存在强类型比较的情况,需要特别注意。 文章通过多个示例说明了这些函数在CTF中的应用场景,强调了掌握PHP特性对安全编程和CTF比赛的重要性。总结来说,文章深入浅出地讲解了PHP函数的绕过技巧,帮助读者更好地理解和应用这些知识。



目录前言intval()strpos()sha1数组比较强类型array_push()结语

上篇文章给大家带来了PHP中最基本的特性,不知道大家学习的怎样了,回顾上文,我们讲了MD5强弱碰撞以及正则匹配的绕过,总体来看还是很简单的,下面给大家带来新的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,从而实现了绕过,还有另一种绕过方法:

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

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

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

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

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

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

<?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()是搜索数组中是否存在指定的值,根据它的语法:

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

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

今天这篇文章可能有的地方不是很好理解,但总体来说还是很简单的,PHP特性很多以至于只能挑出一些著名的来说,更多关于CTF PHP特性函数的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:CTF中的PHP特性函数解析之上篇php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)Web端测试PHP代码函数覆盖率解决方案php安全攻防世界unserialize函数反序列化示例详解

© 版权声明

相关文章