首页 > 编程语言 >ctfshow(94,95)--PHP特性--strpos函数

ctfshow(94,95)--PHP特性--strpos函数

时间:2024-11-06 22:46:08浏览次数:4  
标签:num no -- flag strpos ctfshow 返回值 绕过

建议先学习intval函数相关内容

Web94

源代码:

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

审计

共四处条件判断:
第一处,严格比较$num==="4476",返回值为false则进入下一处。
第二处,preg_match("/[a-z]/i", $num),返回值为0则进入下一处。
第三处,!strpos($num, "0"),strpos函数返回值不为false则进入下一处.

int|false strpos(str $str , str $find)

strpos函数,第一个参数为字符串,第二个参数为要从字符串中寻找的字符
当没有匹配到目标字符时,返回值为bool型的false
当匹配到目标字符时,返回值目标字符第一次出现的索引位置,int类型

第四处,intval($num,0)===4476,返回值为true则获得flag。

思路

第一处,可以使用八进制、十六进制、科学计数法绕过

?num=4476e1
?num=010574
?num=0x117c

第二处,过滤了字母,因此十六进制、科学计数法绕过被过滤。
第三次,strpos($num, "0")在num中搜索0,搜索到则返回索引位置。

?num=010574

'0'在num中第一次出现的索引位置为0,因此strpos函数的返回值为0
由于函数前有!,所以条件判断最后的返回值为true,绕过失败

以上三种方法全部绕过失败。

这里学习新的绕过方法。

?num=+010574 正数符号绕过
?num=4476.0 小数绕过

正数符号绕过
在数字前面加+号,不影响数字的值。
?num=+010574显然绕过了第一处和第二处条件判断。
而到第三处判断,由于第一个0的索引位置变成了1,索引strpos($num, "0")的值变成了1,那么!strpos($num, "0")的值就变成了false,成功绕过。
第四处返回值显然为true,得到flag。

小数绕过
?num=4476.0显然绕过了第一处和第二处条件判断。
而到第三处判断,由于第一个0的索引位置变成了5,索引strpos($num, "0")的值变成了5,那么!strpos($num, "0")的值就变成了false,成功绕过。
第四处返回值显然为true,得到flag。

这里补充一个知识点,intval函数将小数转换为整数时,只保留整数部分,小数点及其之后的数字是直接被去掉的。

Web95

源代码:

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

审计

第一处条件判断换成了弱类型比较。
第二次多过滤了点.
其他两处与94题相同。

思路

科学计数法、小数绕过不能绕过弱类型比较。
使用八进制和十六进制绕过第一处弱类型比较。

?num=010574
?num=0x117c

第二处过滤了字母,不能使用十六进制绕过。
第三处!strpos($num, "0"),正常使用八进制绕过返回值为true,绕过失败。在八进制前加正数符号+,成功绕过。

?num=+010574

第四处返回值显然为true,得到flag.

标签:num,no,--,flag,strpos,ctfshow,返回值,绕过
From: https://blog.csdn.net/m0_56019217/article/details/143456712

相关文章

  • 【云岚到家】-day09-2-秒杀抢购
    【云岚到家】-day09-2-秒杀抢购4.3抢券4.3.1解决超卖问题1)系统需求2)什么是超卖问题3)悲观锁与乐观锁4)数据库行锁控制方案5)Redis分布式锁方案6)Redis原子操作方案4.3.2Redis原子操作方案1)通过MULTI事务命令实现2)了解Pipeline与MULTI的区别3)Redis+Lua实现4)选择方案5)使......
  • Spring学习记录02
    IoC/DI配置第三方bean案例:数据源对象的管理管理alibaba的druid数据源新建一个工程,结构如下                                        首先需要在pro.xml文件中配置druid对象,添加相关依赖<dependency><groupId>c......
  • 遇到XINPUT1-3.dll未在Windows上指定运行?尝试这些解决方案
    当出现“XINPUT1-3.dll没有被指定在Windows上运行”这样的错误提示时,可能是由于以下几种原因导致的,下面是一些相应的解决方法:一、文件损坏或不兼容1.重新下载DLL文件从可靠的来源获取XINPUT1-3.dll文件。最好是从微软官方网站或者游戏官方网站寻找该文件。避......
  • Vue 3 项目中导入外部的 <link> 和 <script> 资源
    在Vue3项目中,可以通过以下几种方式来导入外部的<link>和<script>资源:导入外部CSS文件方法1:在单个组件中使用 <style> 标签可以在单个Vue组件的<style>部分使用@import语句来导入外部CSS文件:<template><!--组件模板--></template><scriptsetup......
  • 构建使用 Vite 和 Vue 的项目
    构建一个使用Vite和Vue的项目是一项非常实用且快速的方式,能够帮助开发者迅速搭建起一个现代前端应用的基础架构。以下是根据您提供的信息整理出的一个详细的步骤指南,用于指导如何从零开始创建一个Vite+Vue项目。准备工作确保您的计算机已经安装了Node.js。您可以通......
  • 新模块缺少 .iml 文件
    当您在IntelliJIDEA中为现有项目添加新模块时,有时可能会遇到新模块缺少.iml文件的情况。.iml文件是IntelliJIDEA用于存储模块配置的XML文件。没有这个文件,IDE可能无法正确识别模块的设置。下面提供了解决这个问题的方法。解决方案方法一:等待IDEA自动生成 .iml......
  • dvwa-sql注入中级
    因为页面上只能选择相应数字查询,因此需要抓包进行注入;首先通过语句判断是字符型还是数字型:id=1and1=1--+id=1and1=2--+如图,两次返回结果不同,因此这是一个数字型注入。然后依照流程爆出当前表列数和回显位,爆出当前数据库名字(这一步就省略了);接着,要利用information_sch......
  • uBlocklist屏蔽垃圾搜索结果
    近年来特别是Google的中文搜索结果体验越来越差,出现了越来越多「不知所谓」的网站,这些网站通过机器翻译、直接复制的方式「拼接」而成一个网站占据了大量的搜索结果,这类网站就是——「内容牧场」。什么是内容牧场内容农场(或内容工厂,英文名为contentfarm)是指生成大量文字性网......
  • c文件和cpp文件区别
    .c和.cpp文件的主要区别在于它们对应的编程语言不同,.c文件通常用于C语言,而.cpp文件用于C++语言。虽然C和C++有许多相似之处,但它们之间也有显著的差异:语言特性:.c文件使用的是C语言,C是一种过程式编程语言,注重过程和步骤。.cpp文件使用的是C++语言,C++是一种面向对象编程语言,支......
  • c++中::的用法
    kernel::Module 这种用法表明 Module 是位于 kernel 命名空间或命名模块中的一个类型或对象。在C++中,这样的用法用于访问特定命名空间下的类、结构体、函数或其他成员。以下是一些可能的情况,取决于上下文:命名空间(Namespace):如果 kernel 是一个命名空间(通常在C++中是这......