ctfshow菜狗杯-无一幸免_FIXED(数组整型溢出绕过赋值式“永真”判断)
if (isset($_GET['0'])){
$arr[$_GET['0']]=1;
if ($arr[]=1){
die("nonono!");
}
else{
die($flag);
}
}
重点在$arr[]=1意思是在数组中追加一个数并且赋值为1,具体看下。
可以看到数组a中多了一个下标为5的数值为1的数据。
我们如果想要绕过if ($arr[]=1),就要让$arr[]=1赋值失败,下面说一下原理:
索引数组最大下标等于最大int数,对其追加会导致整型数溢出,进而引起追加失败
int范围查阅Manual可知:32位最大是231-1,64位是263-1
也就是2147483647与9223372036854775807
也就是说我们上面传入?0=9223372036854775807以后,再执行$arr[]=1就会失败。