无一幸免_FIXED

这题考察的是php数组下标整型溢出绕过,原理如下

<?php

$arr[] = 1;

$arr[] = 2;

$arr[] = 3;

var_dump($arr);
/*
输出:
array(3) {

  [0] =>

  int(1)

  [1] =>

  int(2)

  [2] =>

  int(3)

}
由此知,在php中,调用$arr[] = ? 是在进行追加赋值
*/
<?php

$arr[2147483647] = 1;

$arr[]=1;

var_dump($arr);
/*
Warning: Cannot add element to the array as the next element is already occupied in F:\JetBrains\PHP\nodejs\index.php on line 3



Call Stack:

    0.0002     122336   1. {main}() F:\JetBrains\PHP\nodejs\index.php:0



F:\JetBrains\PHP\nodejs\index.php:4:

array(1) {

  [2147483647] =>

  int(1)

}
这里我们能发现,当我们给下表的最后一位(2147483647)赋值过后,再进行赋值,会发生溢出而导致无法成功赋值
*/

这题就是利用这个原理,让 $arr[] = 1 无法成功赋值,而绕过 if ,但是有个小tip,在32位环境中,数组最大下表为 2147483647 在64位环境下,最大下表为 9223372036854775807 这题中应该当作64位环境处理

payload

http://259af961-9c3f-4876-99f0-01bd63df42fe.challenge.ctf.show/?0=9223372036854775807