intval()
- 这段代码先GET传入一个num
- isset函数确认非空
- 然后赋值给num变量
- 由preg_match来做正则匹配,如果检测到字符0-9,程序死亡
- 如果intval($num)的值为true,则回显flag
仔细看这些要求,只有给num传入一个非空的array,才可以返回1
payload:默认只给数组下标为0的地方赋值
?num[]=w
?num[]=
新的一道题:
这里简单分析,需要$num==="4476"
为false,又需要intval($num,0)===4476
为true
那就需要intval的第二个参数来决定进制了
payload:
?num=0x117c ?num=01054 ?num=4476.1 ?num=4476w
弱类型
官方文档
PHP是个弱类型语言,不需要赋给初始类型
==
是弱类型校验,只校验值不校验类型
先将字符串类型转化成相同,再比较
===
是强类型校验,既校验值也校验类型
先判断两种字符串的类型是否相等,再比较
<、>、<=、>=都存在和==相同的弱类型,原理相同!!!
这段代码与上一段不同,变成了两个等号,上一关的方法只有?num=4476.1
还可以用,其他都不行了
md5()
PHP md5() 函数 菜鸟教程
PHP处理0e开头md5时hash字符串漏洞
当字符串与数字使用==进行比较时,会将字符串类型转换成数字型再进行比较(如果两边都是字符串,则双方都转换为数字型),只比较转换后的数值的大小
- 当字符串的开始部分不存在数值时会把该字符串转换成数值0
- 当字符串的开始部分有合法数值时,会把该字符串转换成该合法数值(取从最开始后面连续的数值,可以见下面的例子)
- 当字符串中存在合法数值但合法数值不在开始部分,那么字符串仍然会转换成数值0
- 当字符串中包含e或E时,系统会将其识别为科学记数法(0^n均为0)(0e123456=0E789=0)
1,2,3点总结:字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
观察代码,需要a!=b,又需要md5(a)=md5(b)
那就可以使用处理数组返回null的特性了
payload:a[]=1&b[]=2
还有就是0e开头科学计数法的特殊姿势
payload:a=QLTHNDT&b=EEIZDOI
最后就是对应的强类型关卡,先比较类型的话,就只能用数组了
payload:a[]=1&b[]=2
is_numeric()
PHP is_numeric() 函数
payload,代码,如图
parse_str()
PHP parse_str() 函数 菜鸟教程
payload,代码,如图
$$变量覆盖
两个$$
是 可变变量,就是一个变量的变量名可以动态的设置和使用
<?php
$a="hello";
$hello="world";
echo $a." ".$$a;
?>
以上输出 hello world
payload,代码,如图
最后了解一个函数
PHP var_dump() 函数 菜鸟教程