之前学java时就了解过java序列化,即把java对象转变为字节流。序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
总之,序列化作用就是方便传输和存储,将不同环境下的数据转换为一种公共的大家都认识的数据格式。
先不深究序列化了,应该会涉及到操作系统,编译原理等知识。
先浅浅的,形象化的认识一下php中的序列化和反序列化吧。
先说结论:php序列化使得php中的所有数据类型都可以转换为一种特定的字符串,不必直接传输该数据,而是传递序列化后的该字符串,接收端根据该字符串,即可在其端还原出数据。这样,加快了速度,节省了空间。
、
php中的序列化函数为: serialize(),返回值为字符串。反序列化函数为unserialize(),接受字符串类型的参数。
(以数组为例:数组对象本身在内存中的时候也是比特流,假设长度为100比特,那么我们序列化为字符串后,假设比特长度减少为了10,这样存储和传输的时候只传这个10个比特即可,而不是传100个比特,因而节省了空间,加快了速度,有种数据压缩的味道在里边。)
<?php
$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut');// a,b,c是键,a['a'] = 'Apple'
//序列化数组
$s = serialize($a);
echo $s;
//输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";}
?>
下面解释下序列化后的字符串结构:
以上边为例子:a表示array,3表示数组长度,{}表示值,s表示字符串,1表示该串的长度.
Web35:
进去如下
查看源代码:
发现admin.css可以点进去,查看,发现了提示。
尝试:
传输变量5351,但值为空。
得到代码提示,可以看出是序列化相关题目。
很简单,就是利用phpCOOKIE传输一个字符串,该字符串可以利用反序列化函数还原为’ctf.bugku.com’。
所以构造payload为BUGKU=s:13:“ctf.bugku.com” ,(最后必须是双引号)。
另外“$key”就是该变量的值,’ $key’则是 $key。