当前位置: 首页 > article >正文

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

  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()函数
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. 知识点:超级全局数组
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 中,赋值操作符 = 的优先级低于逻辑操作符 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.kler.cn/a/534108.html

相关文章:

  • pytorch实现门控循环单元 (GRU)
  • 【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)
  • 最大矩阵的和
  • 如何在Window计算机本地部署DeepSeek-r1模型
  • 蓝桥杯例题七
  • C++游戏开发实战:从引擎架构到物理碰撞
  • 基于SpringBoot+MySQL的图书借阅管理系统源代码+数据库
  • 稳定Android Studio2021.1.2.16的安装
  • flutter 专题四十四 关于MacOs Catalina “无法打开***,因为无法验证开发者...”的解决方案
  • C语言:把两个16位的数据合成32位浮点型数据
  • 基于 docker 的mysql 5.7 主备集群搭建
  • 【PDF多区域识别】如何批量PDF指定多个区域识别改名,基于Windows自带的UWP的文字识别实现方案
  • 第五十八节 k8s1.30.x 安装Redis集群
  • Redis --- 使用Feed流实现社交平台的新闻流
  • 【C++】STL——list底层实现
  • Java基础进阶
  • vue 学习笔记 - 2、简单的一个例子
  • vscode修改自定义模板
  • DeepSeek图解,10页小册子,PDF开放下载!
  • STM32-启动文件
  • Java进阶文件输入输出实操(图片拷贝)
  • 安装mindspore_rl踩坑
  • 【深度学习】Java DL4J基于 RNN 构建智能停车管理模型
  • 华为OD最新机试真题-狼羊过河-Java-OD统一考试(E卷)
  • 大语言模型极速部署:Ollama 、 One-API、OpenWebUi 完美搭建教程
  • 大语言模型的「幻觉」(Hallucination)是指模型在生成内容时