当前位置:   article > 正文

反序列化漏洞

反序列化漏洞

概念

序列化( serialization ):讲数据结构、对象等状态转化成可使用的格式(一般用于:缓存、网络发送、身份信息等),以备能够被还原为原始状态;
序列化 & 反序列化功能一般用作:存储、传输;
反序列化 (unserialization) :和上方相反

什么是类:

类是有相同属性和操作的一组对象的集合;
  1. <?php
  2. class student{
  3. var $a=c;
  4. echo $a;
  5. }
  6. ?>

什么是对象:

对象是一个信息获取信息处理描述组成的整体,是对现实世界的描述;
对象是类的实例:
  1. <?php
  2. class student{
  3. var $a=c;
  4. echo $a;
  5. }
  6. $z=new student();
  7. ?>
完整案例:
  1. <?php
  2. //创建类
  3. class student{
  4. public $name="zhangsan";
  5. public $age=8;
  6. public $sex="male";
  7. public $bul=flase;
  8. }
  9. //创建对象
  10. $Student=new student();
  11. //序列化对象
  12. $str=serialize($Student);
  13. //打印
  14. echo $str;
  15. ?>
  16. 输出结果:
  17. O:7:"student":3:{s:4:"name";s:8:"zhangsan";s:3:"age";i:8;s:3:"sex";s:4:"male";}
O 表示 object , 数字 7 表示 ‘student’ 的长度,数字 3 表示属性数量,大括号内 {
s 表示 ‘string’ 4 表示字符串长度, ‘name’ 表示名称 }
  1. <?php
  2. //创建类
  3. class student{
  4. public $name="zhangsan";
  5. public $age=8;
  6. public $sex="male";
  7. public $bur=false;
  8. public $gir=1.111;
  9. public $arr=array('a','b','c');
  10. private $name2="zhangsan";
  11. protected $name3="zhangsan";
  12. }
  13. //创建对象
  14. $Student=new student();
  15. var_dump($Student);
  16. echo "<br>";
  17. //序列化对象
  18. $str=serialize($Student);
  19. //打印
  20. var_dump($str);
  21. echo "<br>";
  22. //将序列化的字符串,反序列化
  23. $unstr=unserialize($str);
  24. //打印
  25. var_dump($unstr);
  26. ?>
  27. object(student)#1 (8) { ["name"]=> string(8) "zhangsan" ["age"]=> int(8)
  28. ["sex"]=> string(4) "male" ["bur"]=> bool(false) ["gir"]=> float(1.111) ["arr"]=>
  29. array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
  30. ["name2":"student":private]=> string(8) "zhangsan" ["name3":protected]=>
  31. string(8) "zhangsan" }
  32. string(230) "O:7:"student":8:
  33. {s:4:"name";s:8:"zhangsan";s:3:"age";i:8;s:3:"sex";s:4:"male";s:3:"bur";b:0;s:3:
  34. "gir";d:1.111;s:3:"arr";a:3:
  35. {i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";}s:14:"studentname2";s:8:"zhangsan";s:8:"*n
  36. ame3";s:8:"zhangsan";}"
  37. object(student)#2 (8) { ["name"]=> string(8) "zhangsan" ["age"]=> int(8)
  38. ["sex"]=> string(4) "male" ["bur"]=> bool(false) ["gir"]=> float(1.111) ["arr"]=>
  39. array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
  40. ["name2":"student":private]=> string(8) "zhangsan" ["name3":protected]=>
  41. string(8) "zhangsan" }
常见数据类型序列化后样式:
  1. bool-------->b:value 例:s:3:"bul";b:0;=========>$bul=false
  2. string------->s:count:value 例: s:4:"qwer";s:4:"qwer"; =========>$qwer=qwer
  3. int---------->i:value 例:s:2:"in";i:8; ========>$in=8
  4. Object------->O:<obj-name-length>:<obj-name>:属性数量; 例:O:3:"res":2:
  5. array-------->a:3:{i:0;i:1;i:1;i:2;i:2;i:34}============>array(1,2,34)
private 属性序列化后格式: %00 类型 %00 成员名;
protected 属性序列化后格式: %00*%00 成员名;
public 属性无特例 ;
php7.1+ 反序列化的类属性不敏感;

魔术函数:

php 中自定的功能、方法; php 中魔术方法以 '——', 两个下划线开头,魔术函数无需调用,只需要满足特定条件即可触发;
__wakeup () ,反序列化时被执行
__sleep () ,序列化时被执行
__construct (), 对象被创建时执行
__destruct (), 对象被销毁时执行
例:
  1. <?php
  2. class people{
  3. public function __sleep(){
  4. echo "sleep";
  5. }
  6. public function __wakeup(){
  7. echo "wakeup";
  8. }
  9. }
  10. $People=new people();
  11. $str=serialize($People);
  12. $unstr=unserialize($str);
  13. ?>

反序列化+魔术函数

  1. <?php
  2. class pussy{
  3. public $name='lihua';
  4. public function __wakeup(){
  5. eval($this->name);
  6. }
  7. }
  8. $a=$_GET['a'];
  9. unserialize($a);
  10. ?>
  11. 用户可操作参数传入序列化字符串,且被反序列化函数处理
  12. payload:
  13. O:5:"pussy":1:{s:4:"name";s:10:"phpinfo();";}

反序列化漏洞成因:

①有 unserialize&serialize
②魔法函数;
③用户控制输入;
php 反序列化常见于 ctf 代码审计中;
java 反序列化常见于组件、框架( weblogic shrio struct2 );
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/712446
推荐阅读
相关标签
  

闽ICP备14008679号