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
,会继续执行后面的case
1 csae2 语句。
为什么要传 flag呢?
require_once
会将指定的文件包含到当前文件中,从而使得该文件中的代码能够在当前文件中使用。
require_once()也就是一个文件包含函数 与include类似(这里也就是一个文件包含漏洞)
include
和require
区别主要是,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