刚从一道题发现的一些东西,PHP笔记,关于extract和null 空字符串

本文深入探讨PHP中extract()函数的使用及潜在安全风险,特别是当结合$_GET参数时如何触发意外的flag输出。同时,解析了PHP反序列化漏洞,通过实例演示如何利用特定payload进行攻击。

队友发给我的一道extract变量的最基础的题目,他发现了一些问题,当传入shiyan=&flag=0时出flag,当传入shiyan=0&flag=0时不出flag,传入shiyan=&flag=时,出flag

<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>

首先extract不光是覆盖原有变量,也是直接把数组中的键值做为变量名,数组键值作为变量数值。

在解释下$_GET[ ]过程

$a=$_GET['a']

?a=yunying

相等于创建了一个get数组,传入了一个数组键为a,键值为字符串‘yunying’

相当于

 

 

 

如果传入的是a[0]=1,数组键a变成了一个数组,然后数组a中的数组键为0,数组键值的值为1,然后把a赋值给$a,呢么$a就变成了一个数组键为0,键值为1的变量

 

所以对于$_GET[]的总结就是,其实可以把$a看成GET数组中的数组键a,如果?a=yunying,$a='yunying',如果?a[1]=1,则$a[1]=1

而且不管flag经过extract覆盖为多少,content都为空字符串,因为file_get_contents无法读取变量。

并且当get传入的形式是?shiyan=  时,形式与content一样

都是空字符串,所以相等。我在这里试了下后,发现null与空字符串时弱相等,并且与0也弱相等

 

总结如下,空字符串与null与0弱相等,并且extract是直接会赋值会直接再数组中操作,如果原来有这个变量,便会覆盖

 

 

PHP反序列化

https://www.freebuf.com/news/172507.html

今天看到的一篇文章中,可以对私有属性修改

<?php
class SoFun
{ 
    protected $file='index.php';
    function __destruct(){ 
      show_source(dirname (__FILE__)."\\".$this ->file);
      } 
    function __wakeup()
    { 
        $this-> file='index.php'; 
    }  
}
$file=$_GET['file']; 
echo unserialize($file);
?>

payload:    ?file=O:5:"SoFun":2:{S:7:"\00*\00file";s:8:"flag.txt";}

转载于:https://www.cnblogs.com/BOHB-yunying/p/10859219.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值