CTF中的PHP特性函数解析之上篇
作者:XINO 发布时间:2023-06-14 02:19:58
前言
对于PHP大家一定不陌生,但你知道PHP在CTF中是如何考察的吗,本文给大家带来的是通过PHP特性来进行CTF比赛中解题出题的知识,会介绍一下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,绕过成功。
来源:https://juejin.cn/post/7177356631464738871


猜你喜欢
- 如何最大限度地实现安全登录功能? 具体方法如下(这是一个程序,为便于说明,中间用虚线“------”将代
- mysql存储引擎概述什么是存储引擎?MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制
- 本文的目标是将表1论文及出版物与表2出版物及其指标进行匹配。利用pandas的merge函数实现表的左外连接。左外连接即左表的外连接,左表保
- 视频才用流媒体,有后台实时返回数据, 要支持flash播放, 所以需安装对应的flash插件。当视频播放时,每间隔3秒向后台发送请求供检测心
- 字符串字符串常用操作拼接字符串拼接字符串需要使用‘+’运算符可完成对多个字符串的拼接。如str =
- 如下所示:在def __init__(self):函数里添加self.setFixedSize(self.width(), self.hei
- 首先我们创建数据库表:CREATE TABLE `t_demo` ( `id` int(32) NOT NULL, `name` varch
- # 从X和Y中取出相应步长对应的数组并保存至x_data和y_data中x_data = []y_data = []for i in ran
- golang常用库:gorilla/mux-http路由库使用golang常用库:配置文件解析库-viper使用golang常用库:操作数据
- 本文实例为大家分享了python读取mysql数据绘制条形图的具体代码,供大家参考,具体内容如下Mysql 脚本示例:create tabl
- MySQL变量很多,其中有一些MySQL变量非常值得我们注意,下面就为您介绍一些值得我们重点学习的MySQL变量,供您参考。1 Thread
- ASP实例代码,利用SQL语句动态创建Access表。留作参考,对在线升级数据库有用处.<% nowtime = now()
- 图像的阈值处理一般使得图像的像素值更单一、图像更简单。阈值可以分为全局性质的阈值,也可以分为局部性质的阈值,可以是单阈值的也可以是多阈值的。
- Javascript有许多内建的方法来产生对话框,如:window.alert(), window.confirm(),window.pro
- 自定义指令中无法获取this问题最近在使用自定义指令时遇到一个问题,我想在指令里通过this直接去访问vue实例数据,但是显示未定义,经大佬
- 今天将一个ACC的数据库转换成ms-sql以后发现在使用replace替换语句的时候出现: SQL中函数 replace 的参数 1 的数据
- mysql设置大小写不敏感原理与参数mysql大小写敏感配置与两个参数相关 —— lower_cas
- 本文实例讲述了python用来获得图片exif信息的库用法。分享给大家供大家参考。具体分析如下:exif-py是一个纯python实现的获取
- 如果你搞过ASP的开发,你就会为ASP中没有好的完整的调试环境而头疼不己。我收集了网上相关所有信息提示,想给它做成单机的ASP开发错误提示软
- 打开链接是在新窗口还是原窗口是一个最基础的交互方式。但是很多项目进行中,我们的原型设计并没有仔细考虑链接打开方式。而为了满足运营的需要,选择