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()函数
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>
相关推荐
BingoGo14 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack14 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
一次旅行4 天前
网络安全总结
安全·web安全
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习