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
也就是21474836479223372036854775807

也就是说我们上面传入?0=9223372036854775807以后,再执行$arr[]=1就会失败。

posted @ 2022-11-26 00:08  hithub  阅读(412)  评论(0编辑  收藏  举报