WEB渗透—PHP反序列化(二)

Web渗透—PHP反序列化        课程学习分享(课程非本人制作,仅提供学习分享)


靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场

课程地址:PHP反序列化漏洞学习_哔哩哔_bilibili


三、序列化基础知识

1.序列化的作用

序列化(Serialization)是将对象的状态信息(属性)转换可以存储或传输的形式的过程。

对象 —(序列化)—> 字符串

将对象或数组转化为可以存储/传输的字符串

2.序列化之后的表达方式/格式

所有格式第一位都是数据类型的英文字母简写(字符串中 s: 后跟的是字符串的长度)。



输出结果:
N;                            -> 空字符
i:666;                        -> 整形
d:66.6;                       -> 浮点型
b:1;                          -> Boolean型
b:0;
s:6:"benben";                 -> 字符串

数组的序列化



输出结果:
benben
a:3:{i:0;s:6:"benben";i:1;s:8:"dazhuang";i:2;s:6:"laoliu";}

array:3 参数数量:{i:0 编号;s:6:"benben";i:1;s:8:"dazhuang";i:2;s:6:"laoliu";}

3.对象序列化的详细讲解

不能序列话 '类' ,可以序列化 '对象'

pub;
    }
}
$a = new test();
echo serialize($a);         //只序列化成员变量,不序列化成员函数
?>

输出结果:
O:4:"test":1:{s:3:"pub";s:6:"benben";}

Oobject:4类名长度:"test"类名:1变量数量:{s:3变量名字长度:"pub"变量名字;s:6值的长度:"benben"变量值;}

私有修饰符

private私有属性序列化是在变量前加%00类名%00

pub;
    }
}
$a = new test();
echo serialize($a);         //echo urlencode(serialize($a));(可使用url编码来反序列化)
?>                          //00隔开,’pub’是’test’的私有属性

输出结果:
O:4:"test":1:{s:9:"testpub";s:6:"benben";}

O:4:"test":1:{s:9变量名字长度:"testpub"%00类名%00变量名(%00占一位);s:6:"benben";}

保护修饰符

protedted受保护属性序列化时在变量名前加%00*%00

pub;
    }
}
$a = new test();
echo serialize($a);         //echo urlencode(serialize($a))(可使用url编码来对反序列化编码)
?>

输出结果:
O:4:"test":1:{s:6:"*pub";s:6:"benben";}

O:4:"test":1:{s:6变量名字长度:"*pub"%00*%00变量名(%00和*都只占一位);s:6:"benben";}

成员属性调用对象(在对象里调用对象)

pub;
    }
}
class test2{
    var $ben;
    function __construct(){
    $this->ben=new test();
    }
}
$a = new test2();
echo serialize($a);
?>

输出结果:
O:5:"test2":1:{s:3:"ben";O:4:"test":1:{s:3:"pub";s:6:"benben";}}
pub;
    }
}
class test2{
    var $ben;
}
$b = new test();
$a = new test2();
$a->ben = $b;
echo serialize($a);
?>

输出结果:
O:5:"test2":1:{s:3:"ben";O:4:"test":1:{s:3:"pub";s:6:"benben";}}

实例化后的对象 $a 的成员变量 'ben' 调用实例化后的对象 $b


四、反序列化的特性

1)反序列化之后的内容为一个对象;

2)反序列化生成的对象里的值,由反序列化里的值提供;与原有类预定义的值无关;

3)反序列化不触发类的成员方法;需要调用方法后才能触发;

反序列化的作用

将序列化后的参数还原成实例化的对象。

对象  —(序列化)—>  字符串

对象  <—(反序列化)—  字符串

实例演示

a;
    }
}
$d = new test();                        //将test类实例化为对象$d
$d = serialize($d);                     //将$d序列化为字符串,并重新赋值给$d
echo $d."\n";                           //输出$d(已经进行了序列化)
echo urlencode($d)."\n";                //输出进行url编码后的$d
$a = urlencode($d);                     //将url编码后的$d赋值给$a
$b = unserialize(urldecode($a));        //将url解码并反序列化后的$a赋值给$b
var_dump($b);                           //查看$b内的值
?>

输出结果:
O:4:"test":3:{s:1:"a";s:6:"benben";s:4:" * b";i:666;s:7:" test c";b:0;}
O%3A4%3A%22test%22%3A3%3A%7Bs%3A1%3A%22a%22%3Bs%3A6%3A%22benben%22%3Bs%3A4%3A%22%00%2A%00b%22%3Bi%3A666%3Bs%3A7%3A%22%00test%00c%22%3Bb%3A0%3B%7D
object(test)#1 (3) {
  ["a"]=>
  string(6) "benben"
  ["b":protected]=>
  int(666)
  ["c":"test":private]=>
  bool(false)
}

你可能感兴趣的:(PHP反序列化,前端,web安全,php)