PHP使用数组整型溢出绕过赋值式“永真”判断以进入else子句
遇到一个CTF题比较有意思,可以看到if判断语句中有个赋值式永真判断。
字面上看会永远执行if语句,怎么样才能使”永真失效“?
<?php
include "flag.php";
highlight_file(__FILE__);
if (isset($_GET['0'])){
$arr[$_GET['0']]=1;
if ($arr[]=1){
die("nonono!");
}
else{
die($flag);
}
}
?>
先简单分析一下$arr[]=1这句代码,意思是往$arr数组中追加一个数
可以看到执行$arr[]=1之后,数组的最后多出来一个1。
什么是使用数组整型溢出绕过赋值式“永真”判断?
原理:
索引数组最大下标等于最大int数,对其追加会导致整型数溢出,进而引起追加失败
int范围查阅Manual可知:32位最大是231-1,64位是263-1
也就是2147483647与9223372036854775807
我们接着看,在达到数组的最大下标后,再往后面追加,是追加失败的。
我们便可以利用这一点绕过if进入else子句
Payload:
?0=9223372036854775807