变量覆盖漏洞

文章讨论了PHP编程中变量覆盖的概念,特别是在使用extract()函数时可能出现的问题。通过示例代码解释了如何通过GET参数重写已定义的变量值,从而可能导致安全漏洞。当传入特定参数如gift=a&test=a时,可以改变变量content和gift的值,使得条件满足并输出flag,揭示了变量覆盖可能导致的逻辑错误和安全风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理

变量覆盖指的是可以用我们的传参值替换程序原有的变量值

常出现位置

经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,开启了全局变量注册等。

函数解析

经常引发变量覆盖漏洞的函数有:extract() parse_str()

extract()函数(作用:将数组中将变量导入到当前的符号表)

列题:

$test =******;

extract($_GET);

if(isset($gift)){ $content = trim($test);

if($gift == $content){echo 'flag is:'.$flag;} else{ echo error}}

分析源码我们可以知道,

1、文件将get方法传输进来的值通过extrace()函数处理。

2、通过两个if语句分别判断是否存在gift变量,和变量gift的值和变量content的值是否相等。变量content的值是通过读取变量test的值获取到的。如果两个变量相等输出flag。如果不相等,输出错误。

似乎逻辑上没啥问题,但是如果我们传参了test呢?

第一开始test在php中已经定义了,但是因为extrace()函数,我传参test时相当于重新给test赋值对不对?因为php执行语句是自上而下,那我传的参数完全可以覆盖掉之前所定义的

那么当我传参gift=a&test=a,相当于$gift=a;$test=a 那么这里是不是就直接输出flag了呢 (因为$content是由$test决定,$gift和$test都是我可以决定的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值