CTFShow菜狗杯部分WP
TapTapTap
打开题目,是一个小游戏,通关就可以直接获得Flag
没能通关
那直接Ctrl + U查看源代码,然后查看这个js/habibiScript.jsJS文件
发现这里可疑
在Console控制台运行,它说flag在/secret_path_you_do_not_know/secretfile.txt里面
在URL中直接访问拿到Flag
无一幸免
这个题目涉及到了 PHP 中的数组漏洞,主要关注的是 PHP 对数组的处理方式。让我为你解释一下解题思路:
-
页面结构: 代码开始时通过
include "flag.php";
包含了flag.php
文件的内容,然后使用highlight_file(__FILE__);
将代码本身的源代码高亮显示在页面上。 -
用户输入处理: 代码中检查是否存在名为
0
的 GET 参数,如果存在,会执行一系列操作。 -
数组漏洞利用: 在代码中,首先使用
$arr[$_GET['0']]
这样的方式将值赋给数组,然后在下一行使用$arr[]=1
给数组追加一个值。在 PHP 中,如果使用空数组下标,PHP 会将下一个索引的值自动递增。所以$arr[$_GET['0']]
事实上是在将值赋给了下一个索引,而不是0
这个索引。 -
条件判断: 接着代码中使用
if ($arr[]=1)
,这里又一次给数组追加了一个值并判断追加操作的结果。由于上一步已经将值赋给了下一个索引,这里实际上是判断一个已经存在的索引是否为真。
解题思路:
要解决这个题目,你需要利用 PHP 的数组漏洞,构造一个方式来触发判断中的条件。具体来说,你需要:
-
使用
?0=
作为 GET 参数,以便触发数组赋值操作。 -
由于之前的操作已经将值赋给了索引
1
,所以接下来你需要将索引1
的值设置为一个非零值,从而满足条件。
http://example.com/index.php?0=&1=1
这个请求将会在数组中给索引 1
赋值为 1
,然后由于条件判断为真,输出 flag
。
请注意,这个题目涉及了特定的 PHP 行为,实际应用中,不应依赖这种行为来处理逻辑。在代码编写中,应该遵循严格的验证和过滤规则,避免出现漏洞。