PHP使用数组整型溢出绕过赋值式“永真”判断以进入else子句

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

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值