CTFSHOW-WEB入门-PHP特性89-100

news/2025/2/6 12:08:42 标签: php, CTF, web安全, 学习
  1. 题目:web 89
    1. 题目:
    2. 解题思路:这道题目涉及了两个函数:preg_match()和intval()简要介绍一下两个函数
      1. preg_match()用于对字符串进行正则表达式的匹配,但是在传入字符串的时候确实会抛出一个 Warning 错误,但它不会导致整个 PHP 脚本终止。可以利用这个绕过第一个if语句
      2. intval()用于将字符串转化为整数,特殊情况:传入数组的话会判断里面有没有元素,有则返回1,没有返回0,可以利用这个绕过第二个if语句
    3. 于是payload为?num[]=a
    4. 知识点:preg_match() intval()传入数组特性
  2. 题目:web 90
    1. 题目:
    2. 解题思路:简要分析代码,get一个num参数,如果这个变量不是‘4476’,并且在经过intval()函数处理之后,结果等于4476就输出flag
      1. 这里的intval()函数,在处理字符串时,如果字符串以数字开头,则会先转化为数字,后面如果有其他非数字内容则会忽略,即:将第一个非数字(加减号除外)前的内容转换为数字: 例如:intval(‘dsa1’)=0 intval(‘12dfjkhjkdf111’)=12 因此payload为?num=4476djfj
      2. 可以使用不同的数字类型的数据,如浮点数 num=4476.0
      3. 另解:由于intval()函数可以有多个参数 intval( v a r , var, var,base) 这里的base表示进制,
        1. base可取:0 —八进制 0x —十六进制 0b --二进制 不填默认十进制
        2. 因此 num=010574或num=0x117c 也可以得到flag
      4. 前面添加+号,intval(‘+4476’) 会转换为4476
    3. 知识点:intval() 转换特性
  3. 题目:web 91
    1. 题目:
    2. 解题思路:代码的解释:get一个cmd参数,要通过第一个正则表达式成功,第二个失败,才会输出flag:分析一下两个表达式:
      1. 首先看看区别,第二个比第一个少了个m修饰,表示多行模式匹配,第二个单行匹配, 中间//之间的是要匹配的内容, ^表示匹配字符串开始, $表示字符串结尾, i表示不区分大小写,也就是php Php PHP这样的都可以匹配, 由于第一个有m,那就说明是匹配的是每一行的开头和结尾,有一行满足即可而不是字符串的开头和结尾 所以ccc%0aphp也可以得到flag
      2. 因此可以让他通过第一个,通过包含换行符,这里首先尝试了 PHP\nphp发现不行于是再利用换行符的url编码试试: PHP%0aphp:成功
    3. 知识点:preg_match()多行匹配
  4. 题目:web 92
    1. 题目:
    2. 解题思路:之前解释过intval(还有第二个参数base表示进制),这里0表示八进制,于是进行转换:num=010574得到flag:看了别人的解法了解到还可以利用intval()函数对于科学计数法的处理机制题:由于这里$num==4476这里的比较:
      1. 这里进行的是字符串与整数的比较:
        1. 在PHP中,字符串与整数比较时,字符串会尝试被转换为整数
        2. 如果 $num 字符串以数字开头,它会被转换为那个数字;否则,转换为0
        3. 因此,如果 $num 是 “4476”(或任何以4476开头的字符串),这个条件为假
        4. 但如果 $num 是像 “4476abc” 这样的值,它仍然会被视为不等于4476(因为转换停止在第一个非数字字符)
      2. intval(4476e2)的处理,这样会当作科学记数法处理,但是如果后面添加了进制,那么就会出现: 因此可以利用这一点 构造 num=4476e2 也可以得到结果
    3. 知识点:intval()函数特性
  5. 题目:web 93
    1. 题目:
    2. 解题思路:寓上一题类似,多加限制,不能输入字母,也就是不能使用二进制0b和十六进制0x但对之前的payload无影响:num=010574
    3. 知识点:intval()特性
  6. 题目:web 94
    1. 题目:
    2. 解题思路:分析题目 可以知道:这里判断num是否值和类型和4476相同,然后判断是否含有字母,并且判断0的位置,如果不含0或者0在开头第一个位置,均不可,最后再判断intval处理后是否等于4476,因此构造payload:num中要 有0,但是不能再第一位,于是可以 加个+ :num=+10574:也可利用浮点数绕过 num=4476.0:另解:通过空白符(换行符、制表符、空格等)也可以绕过第一个字符不为0,但是又包含0的限制
    3. 知识点:strpos()函数
php">int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
参数说明
$haystack: 要搜索的字符串(母字符串)。
$needle: 需要查找的字符或字符串(子字符串)。
$offset: 可选参数。指定开始搜索的位置。如果为负数,则从字符串末尾开始。
返回值
返回 needle 在 haystack 中首次出现的位置(从 0 开始计数)。
如果未找到 needle,则返回 false
  1. 题目:web 95
    1. 题目:
    2. 解题思路:比上一个题目多了一个点号的过滤,就不能使用小数绕过,可以使用空白符或者+号进行绕过:使用空格:使用+号:
  2. 题目:web 96
    1. 题目:
    2. 解题思路:看起来flag在flag.php 内,现在就是要想办法查看flag.php 的内容,而这里直接是完全过滤了flag.php,由于是当前目录,可以使用./flag.php来代替表达
    3. 知识点:linux下当前目录的表示
  3. 题目:web 97
    1. 题目:
    2. 解题思路:分析代码,这里是一个MD5的强类型比较,可以使用fastcoll工具来获得符合要求的字符串:这里通过抓包上传,hackbar会出现问题:得到结果
    3. 知识点:强类型比较绕过
  4. 题目:web 98
    1. 题目:
    2. 解题思路:看到题目代码,还是有点小懵逼,后来认真看了一会,发现他是这样一个逻辑:包含文件flag.php,后面是一连串的四个三木运算符,XXX?语句1:语句2 意思是XXX条件如果成立,返回语句1的结果,否则返回语句2的结果。那么第一句的意思就是:判断全局变量 G E T 对应的数组是否为空,不为空的话,将 _GET 对应的数组是否为空,不为空的话,将 GET对应的数组是否为空,不为空的话,将_POST全局变量对应的数组的地址赋给 G E T , 也就是让两个数组指向同一个地址,如果为空的话,就返回 f l a g 这个字符串,但是不进行赋值操作,后两句同样的道理,只不过是判断有没有 g e t 到一个名 f l a g 的变量,并且值为 f l a g ,由于我们最终目标是获取 _GET,也就是让两个数组指向同一个地址,如果为空的话,就返回flag这个字符串,但是不进行赋值操作,后两句同样的道理,只不过是判断有没有get到一个名flag的变量,并且值为flag,由于我们最终目标是获取 GET,也就是让两个数组指向同一个地址,如果为空的话,就返回flag这个字符串,但是不进行赋值操作,后两句同样的道理,只不过是判断有没有get到一个名flag的变量,并且值为flag,由于我们最终目标是获取flag,于是,我们就得让 G E T 的全局数组里面有 H T T P F L A G 这个参数,并且等于 f l a g ,于是我们 g e t 一个 H T T P F L A G = f l a g ,既然 _GET的全局数组里面有HTTP_FLAG这个参数,并且等于flag,于是我们get一个HTTP_FLAG=flag,既然 GET的全局数组里面有HTTPFLAG这个参数,并且等于flag,于是我们get一个HTTPFLAG=flag,既然_GET数组不为空,那么就会执行KaTeX parse error: Expected 'EOF', got '&' at position 6: _GET=&̲_POST这个语句,也就是让两者执行同一块地址,于是我们也要post一个HTTP_FLAG,值为flag,得到结果:
    3. 知识点:超级全局数组
php">1. $_GET
定义: 用于收集通过 URL 查询字符串传递的数据。通常在HTTP GET请求中使用。
使用场景: 当你在表单中指定了 method="get",或者在 URL 中直接传递查询参数时。
示例:
// URL: http://example.com/page.php?name=John&age=25
echo $_GET['name']; // 输出: John
echo $_GET['age'];  // 输出: 25
2. $_POST
定义: 用于收集通过 HTTP POST 方法发送的数据。一般在表单提交时使用。
使用场景: 当表单的数据通过 method="post" 发送时。
示例:
// 表单数据提交
// <form method="post"><input type="text" name="username"></form>
echo $_POST['username']; // 输出用户提交的用户名
3. $_REQUEST
定义: 包含 $_GET$_POST$_COOKIE 的内容,提供了一种访问不同请求类型数据的简便方法。
使用场景: 当不确定数据来自哪里时,可以使用 $_REQUEST。
示例:
echo $_REQUEST['name']; // 如果存在同名字段,从 GET, POST 和 COOKIE 中返回
4. $_COOKIE
定义: 用于访问 HTTP cookies 的数据。
使用场景: 当服务器或者客户端设置 cookies 时。
示例:
// 假设设置了 cookie: setcookie("user", "John");
echo $_COOKIE['user']; // 输出: John
5. $_SESSION
定义: 存储用户会话数据。必须在使用前开启会话(使用 session_start())。
使用场景: 当用户需要在多个页面之间保持状态时(如登录状态)。
示例:
session_start();
$_SESSION['username'] = 'John';
echo $_SESSION['username']; // 输出: John
6. $_SERVER
定义: 包含关于服务器环境的信息和客户端请求的信息。
使用场景: 用于获取服务器信息(如请求头、脚本路径、访问的URL等)。
示例:
echo $_SERVER['HTTP_USER_AGENT']; // 输出: 客户端的用户代理字符串
echo $_SERVER['REQUEST_METHOD'];    // 输出: GET 或 POST
7. $_FILES
定义: 用于通过 HTTP POST 方法上传的文件信息。
使用场景: 当表单中包含文件上传字段时。
示例:
// <input type="file" name="uploaded_file">
if ($_FILES['uploaded_file']['error'] == UPLOAD_ERR_OK) {
    echo $_FILES['uploaded_file']['name']; // 输出上传文件的名称
}
  1. 题目:web 99
    1. 题目:
    2. 解题思路:先分析代码,首先通过allow获取一个空数组,后来将其产生的随机数添加到数组中去,这段代码包含一个 <font style="color:rgb(251, 71, 135);">for</font> 循环,从 <font style="color:rgb(251, 71, 135);">36</font> 开始到 <font style="color:rgb(251, 71, 135);">0x36d</font>(即 877 的十六进制表示)。在每次循环中,使用 <font style="color:rgb(251, 71, 135);">rand(1, $i)</font> 生成一个在 <font style="color:rgb(251, 71, 135);">1</font><font style="color:rgb(251, 71, 135);">$i</font> 之间的随机整数,并将其推入 <font style="color:rgb(251, 71, 135);">$allow</font> 数组中。这个过程将填充 <font style="color:rgb(251, 71, 135);">$allow</font> 数组,以包含多个随机数。具体会填充多少个随机数取决于循环的执行次数(即 <font style="color:rgb(251, 71, 135);">0x36d - 36 = 841</font> 次)。
    3. 然后,检查 GET 请求中是否存在名为 <font style="color:rgb(251, 71, 135);">n</font> 的参数,并且该参数的值是否在 <font style="color:rgb(251, 71, 135);">$allow</font> 数组中。<font style="color:rgb(251, 71, 135);">isset($_GET['n'])</font> 确定 <font style="color:rgb(251, 71, 135);">'n'</font> 参数是否存在,<font style="color:rgb(251, 71, 135);">in_array($_GET['n'], $allow)</font> 确定这个参数的值是否在之前填充的 <font style="color:rgb(251, 71, 135);">$allow</font> 数组中。如果这两个条件成立:<font style="color:rgb(251, 71, 135);">file_put_contents($_GET['n'], $_POST['content']);</font><font style="color:rgb(251, 71, 135);">$_POST['content']</font> 的内容写入一个由 <font style="color:rgb(251, 71, 135);">n</font> 参数指定的文件。这里in_array()函数有一个漏洞,如果不设置第三个参数,那么,这里进行的就是弱类型比较,eg:<font style="color:rgba(0, 0, 0, 0.88);">1.php==1</font>显示为true,那么这里就可以讲一段PHP代码写入文件,文件名选择可以满足条件的1-877均可,这里选择出现频率高的,比如1,2这样的,这里选择2:并且写入php木马,访问让其执行发现flag的位置进行访问:得到flag
    4. 知识点:in_array()函数特性,不设置第三个参数时进行弱类型比较
  2. 题目:web 100
    1. 题目:
    2. 解题思路:我们知道,flag的信息在类ctfshow里面,于是,就想办法查看这个类的信息,刚好,有一个这个类的对象可以利用。这里主要是考查了_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">0=</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">isnumeric</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">(</font><font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v1) and is_numeric(</font><font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v2)andisnumeric(</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">2)</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">andisnumeric</font>_<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">(</font><font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(240, 231, 255);">v3);</font>这一句的执行顺序__ 首先先给v0变量赋值,相当于是v0只和v1有关,
php">在 PHP 中,赋值操作符 = 的优先级低于逻辑操作符 and。
这意味着在没有括号的情况下,表达式中的逻辑运算会先于赋值运算执行。
例子分析
考虑以下代码:
$v0 = true and false;
在这种情况下,表达式实际上等同于:
($v0 = true) and false;
这意味着 true 被赋值给 $v0,然后执行逻辑运算 and false,但 $v0 的值已经是 true 了。
因此,最终 $v0 的值为 true
    1. 于是只需要v1是数字,v2没有分号,v3含有分号,就可以执行eval函数,从而获取到相应信息,eval里面的参数可以通过命令拼接的方法进行执行:因此  v1=1&v2=var_dump($ctfshow)/*&v3=*/;![](https://cdn.nlark.com/yuque/0/2025/png/39210681/1738754522408-b52ff8e3-c653-4718-9aa5-49c727d40944.png)
3. 知识点:var_dump<font style="color:rgba(0, 0, 0, 0.88);background-color:rgb(242, 247, 255);">可以得到该对象的详细信息,包括对象的类型、属性、属性的值以及属性的可见性(public、protected、private)。 </font><font style="color:rgba(0, 0, 0, 0.88);">  </font>

http://www.niftyadmin.cn/n/5842985.html

相关文章

【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信

Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…

java求职学习day28

XML 1. XML基本介绍 1.1 概述 XML 即可扩展标记语言&#xff08; Extensible Markup Language &#xff09; (1)W3C 在 1998 年 2 月发布 1.0 版本&#xff0c; 2004 年 2 月又发布 1.1 版本&#xff0c;但因为 1.1 版本不能向下兼容 1.0 版本&#xff0c;所以1.1 没有人用。…

数据结构-堆和PriorityQueue

1.堆&#xff08;Heap&#xff09; 1.1堆的概念 堆是一种非常重要的数据结构&#xff0c;通常被实现为一种特殊的完全二叉树 如果有一个关键码的集合K{k0,k1,k2,...,kn-1}&#xff0c;把它所有的元素按照完全二叉树的顺序存储在一个一维数组中&#xff0c;如果满足ki<k2i…

为AI聊天工具添加一个知识系统 之87 详细设计之28 Derivation 统一建模元模型 之1

文本要点 要点 Derivation 统一建模元模型 Derivation 统一建模元模型&#xff1a;意识原型的祖传代码&#xff0c;即支撑 程序框架的 符号学中的 自然和逻辑树。 这棵树的雏形中描述了三种建模工件&#xff1a;语用钩子&#xff0c;语法糖和语义胶水。 三种工件对应的三“…

Day36-【13003】短文,数组的行主序方式,矩阵的压缩存储,对称、三角、稀疏矩阵和三元组线性表,广义表求长度、深度、表头、表尾等

文章目录 本次课程内容第四章 数组、广义表和串第一节 数组及广义表数组的基本操作数组的顺序存储方式-借用矩阵行列式概念二维数组C语言对应的函数-通常行主序方式 矩阵的压缩存储对称矩阵和三角矩阵压缩存储后&#xff0c;采用不同的映射函数稀疏矩阵-可以构成三元组线性表三…

说一下JVM管理的常见参数

Java虚拟机&#xff08;JVM&#xff09;有许多常见参数&#xff0c;用于控制其行为和性能。以下是一些常见的JVM参数及其说明&#xff1a; 1. 内存管理参数 -Xms<size> START 设置初始堆内存大小。例如&#xff0c;-Xms512m表示初始堆大小为512MB。 -Xmx<size>…

机器学习--python基础库之Matplotlib (1) 超级详细!!!

机器学习--python基础库Matplotlib 机器学习--python基础库Matplotlib0 介绍1 实现基础绘图-某城市温度变化图1.1绘制基本图像1.2实现一些其他功能 2 再一个坐标系中绘制多个图像3 多个坐标系显示-plt.subplots(面向对象的画图方法)4 折线图的应用场景 机器学习–python基础库M…

基于单片机的智能家居设计(论文+源码)

2.1需求分析 本次基于STM32的蓝牙智能家居&#xff0c;在功能上如下&#xff1a; 1.可以实现家居环境温湿度&#xff0c;烟雾浓度的检测。 2.可以将检测到的温湿度&#xff0c;烟雾浓度等信息通过蓝色传输到手机APP&#xff1b; 3.用户可以打开或者关闭风扇&#xff0c;以便…