CTF中的PHP特性函数实例分析

这篇文章主要介绍“CTF中的PHP特性函数实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CTF中的PHP特性函数实例分析”文章能帮助大家解决问题。

MD5强弱碰撞

对于MD5加密大家一定很熟悉,在PHP里同样存在函数MD5,该函数可以将指定的字符串通过哈希函数转为复杂的加密字符串。在CTF中有着关于MD5的最基本的知识,即强/弱类型比较。

弱类型比较

观察以下代码:

if(md5($_GET['a'])==md5($_GET['b']))
echo $xino;

可以看到比较时有两个等号,我们要怎样让他们相等呢?根据php弱类型比较特性,当两个等于号时,会将变量转化为同类型,那么我们可以思考,如果把传入的数据改成md5加密后都为开头0e的字符串是不是就可以绕过了,因为这样会被认为是科学计数法,不管加什么都永远是0,我们也就绕过了,这里举几个字符串md5加密后都为0e的:

NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
s878926199a:0e545993274517709034328855841020
s1091221200a:0e940624217856561557816327384675

强类型比较

观察下面代码:

if (md5($_POST['a']) === md5($_POST['b']))
echo xino;

如果我们等号变成三个还可以用上面方法绕过吗?答案是否定的,因为三个等号在PHP里意味着强类型比较,上面的方法因为0e后面数据不同便不可行了,于是这里可以用数组来绕过,因为PHP特性允许接受数组,而数组在MD5加密后为NULL,于是借助这个特性可以进行绕过。

我们可以传入下面的PAYLOAD绕过:

a[]=a&b[]=b

强碰撞

难度进一步升级,如果我们要面对的是以下代码呢:

$a = (string)$_GET['a'];
$b = (string)$_GET['b'];
if (md5($a) === md5($b)) {
die('OK');
}

因为强制类型转换的原因,我们不能像上面一样传入数组了,于是需要进行MD5强碰撞,及内容不同而MD5值要相同,这就很难办了,但是我们可以用工具生成,这里给大家举一个可行的例子:

a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

preg_match()

这是一个正则表达式函数,简单来说会对我们设置的数据进行匹配,比如:

<?php 
if (preg_match("/xino/i", "XINO IS A BOY .")){ 
echo "查找到匹配的字符串 php。"; } 
else { echo "未发现匹配的字符串 php。"; } ?>

因为我们用/i设置了大小写不敏感,所以可以找到匹配字符串,所以会返回查询到的字符串,下面我们看看如何绕过。

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

其中intval的作用是取整,可以看到正则过滤了数字,但由于PHP特性,该函数只能处理字符串,于是我们可以传入数组进行绕过:

?num[]=1

提交后成功echo出了flag,绕过成功。

关于“CTF中的PHP特性函数实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注本站行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐:

Python中实现与PHP完全一致的ICU音译规则转换器

本文介绍如何使用PyICU在Python中精确复现PHPTransliterator::createFromRules()的音译行为,包括NFD/NFC规范化、去除非间距符号与标点、转小写等完整ICU规则链,确保跨语言环境下的字符串转换结果100%一致。 本文介绍如何使用pyicu在python中精...

php运行python脚本失败怎么解决

PHP调用Python失败主因是环境、权限、路径或错误捕获问题;需确认Python路径、用绝对路径调用、检查www-data用户权限、重定向stderr获取真实错误,并排查disable_functions等安全限制。 PHP运行Python脚本失败,通常不是PHP或Python本身坏了,而是执行环...

redis怎么使用php

问题:如何在php中使用redis?安装redisphp扩展。连接到redis服务器,使用redis类。存储和检索数据,支持字符串、散列、列表和集合等类型。使用其他命令,如检查键是否存在、删除键和设置键的过期时间。使用完redis后关闭连接。 如何在PHP中使用Redis Redis是一个高度可扩展...

PHP 如何连接 MySQL 数据库?

PHP如何连接MySQL数据库 PHP通过连接MySQL客户端来操作MySQL数据库。当PHP程序执行时,它将连接到MySQL客户端,由客户端将PHP的请求传递给MySQL服务端。 MySQL服务端是一个数据库管理器,负责处理数据库操作,存储和管理数据。PHP程序通过客户端与服务端通信,向服务端发送...

德森PHP

DecenPHP已达到版本1.4。现在,使用PHP和MySQL/MariaDB可以轻松地在数据库中搜索文件或链接。 “但是,DecenPHP是什么?” DecenPHP提供了一种简单的方法来搜索网站和HTTP服务器上托管的文件。这可以通过MySQL数据库(仅存储链接和URL)或通过直接访问网站以检索...

PHP常用语法有哪些

本篇内容主要讲解“PHP常用语法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP常用语法有哪些”吧!PHP是一款功能强大的嵌入式HTML脚本语言,经常被程序员用来作为网站开发的基础语言。我们在这里就为大家介绍一些PHP常用语法,以帮助大家对PH...