小蓝鲨的冒险

image-20250330101955635

get传参b=a[0]=QLTHNDT

md5弱比较 这里是0e绕过 QNKCDZO与QLTHNDT经过md5编码后都是0e开头

因为PHP 试图解析它们为数值,发现它们符合 0eX(科学计数法),都被解释为 0 * 10^X = 0

结果是 0 == 0,所以 返回 true

然后post num

num=2024 不能有字母 intval($num,0)=2024

小数点绕过即可

post传参num=2024.1

intval() 转换小数类型时,只返回个位数,不遵循四舍五入的原则。

接下来是一个switch循环

get传参 which=flag

在 PHP 中,switch 语句的比较是通过 严格比较(==) 来进行的。当你传递一个非数字字符串(例如 "flag")时,PHP 会尝试将其转换为数字。这个转换过程有些特殊,通常会把任何非数字字符串转换为 0

也就是

  • PHP 会自动尝试将 "flag" 转换为数字。在 PHP 中,任何非数字字符串(例如 "flag")都会被转换为数字 0
  • 因此,switch("flag") 会变成 switch(0),然后与 case 0 进行匹配。
  • 结果会进入 case 0 分支,并执行 print('QAQ');,然后因为没有 break,会继续执行后面的 case1 csae2 语句。

为什么要传 flag呢?

require_once 会将指定的文件包含到当前文件中,从而使得该文件中的代码能够在当前文件中使用。

require_once()也就是一个文件包含函数 与include类似(这里也就是一个文件包含漏洞)

includerequire区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

include_once()require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

而传flag的原因就是

该目录下有flag.php这个文件 可以使用require_once进行文件包含 而不报错 从而执行echo flag这条命令

为什么只有flag.php才能输出flag 而index.php等其他文件不能呢

因为$flag 这个变量只在flag.php文件下存在 只有将flag.php包含 才能正确输出来$flag变量的内容

所以这里的payload为

get : ?b=a[0]=QLTHNDT&which=flag

post: num=2024.1

image-20250330104552398