当前位置: 首页 > article >正文

寒假学web--day10

简介

一些高级的反序列化

phar反序列化

phar类似于java的jar包,将多个php文件合并为独立的压缩包,不用解压就能执行里面的php文件,支持web服务器和命令行

metadata

$phar->setmetadata($h);

metadata可以存放一个类实例,生成phar文件后,会把这个类实例以序列化字符串的形式存放至phar文件内

phar协议

phar://xxx.phar

当使用phar协议加载phar文件时,会自动反序列化这个类的的序列化字符串

生成phar包时,可以往metadata里面放对象,生成后,对象会自动序列化保存到ohar包中,使用phar协议读取phar包时,如果当前脚本识别了这个类,会自动调用这个类的魔术方法

可以触发phar反序列化的函数

include

file_exists

file_get_contents

file_put_contents

require

fileinode

filetime

filesize

is_dir

scandir

highlight_file   

通过phar协议包含phar文件,都可以触发phar反序列化

也可以在.user.ini文件里写auto_append_file=phar://xxx.phar

应用

要求:能够写phar包并上传,有可以利用的函数,并能控制协议头,使用phar协议解析,有可以利用的恶意类

首先利用脚本生成phar文件

如果有上传点,上传文件的前半部分可控,后缀有过滤,不能是php,phps,pthmml,ini但是没有禁止phar文件,我们找到大量使用的file_exits等文件读取函数,通过控制phar://头,来使用phar协议来解析phar包,就能自动进行反序列化

session反序列化

tips

php的session存放在文件中,默认位置是/tmp/sess_PHPSESSID

session可以是字符串,数字,也可以是对象,session里面存放对象时,会自动进行序列化,存放的是序列化后的字符串,session里面拿取对象时,会自动进行反序列化,执行对象的魔术方法

session序列化处理器

不同session序列化处理器的处理方式不同

php处理器

通过|分割类和key

u|O:4:"user":2:{s:8:"username";N;s:8:"password";N;}

u表示session的key,后面的表示类

php_serialize处理器

用数组存session的key和类

a:1:{s:1:"u";O:4:"user":2:{s:8:"username";N;s:8:"password";N;}}

应用

如果我们使用php_serialize处理器,并给username赋值

admin|O:4:"user":2:{s:8:"username";N;s:8:"password";N;}

此时session里存放的内容就会变成

a:1:{s:1:"u";O:4:"user":2:{s:8:"username";s:57:"admin|O:4:"user":2:{s:8:"username";N;s:8:"password";N;}";s:8:"password";N;}}

这是虽然没有逃逸出来,但是如果我们换成php处理器,并使用相同的cookie来访问,php从session文件里拿取这个对象时,就会认为|左边的时key,将右边的对象反序列化

这是存取的处理器不一致导致的漏洞

构造pop链并上传

我们分析类,得出读flag的payload

我们可以利用PHP的强制文件上传来上传我们构造的payload,我们可以上传文件上传的进度PHP_SESSION_UPLOAD_PROGRESS

需要写脚本,我们给PHP_SESSION_UPLOAD_PROGRESS上传进度值,123(任意数字),然后上传一个文件,filename为payload,内容随意

前面我们了解到强制上传的文件会存到临时的session文件里,由于开启了session,写进去后,当我们用相同的cookie再去访问时,服务器就会从我们刚刚的session文件里解析我们的payload,就会反序列化里面的内容,从而触发魔法函数


http://www.kler.cn/a/522804.html

相关文章:

  • STM32 LED呼吸灯
  • 【Elasticsearch 】悬挂索引(Dangling Indices)
  • Autogen_core 测试代码:test_cache_store.py
  • 使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统
  • ResNeSt: Split-Attention Networks 参考论文
  • 一文简单回顾Java中的String、StringBuilder、StringBuffer
  • 【UE插件】Sphinx关键词语音识别
  • 前部分知识复习02
  • 单元测试在复杂业务逻辑开发中的重要性与实践
  • 性能测试丨Nginx 性能数据监控
  • 【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning
  • Node.js日志记录新篇章:morgan中间件的使用与优势
  • Fort Firewall:全方位守护网络安全
  • 数据结构与算法之数组: LeetCode 380. O(1) 时间插入、删除和获取随机元素 (Ts版)
  • TS开发的类型索引目录
  • kubernetes 核心技术-调度器
  • 公式与函数的应用
  • 【前端SEO】使用Vue.js + Nuxt 框架构建服务端渲染 (SSR) 应用满足SEO需求
  • 基于 PyTorch 的深度学习模型开发实战
  • 搭建 docxify 静态博客教程
  • 13、Java JDBC 编程:连接数据库的桥梁
  • Java并发编程实战:深入探索线程池与Executor框架
  • WordPress Web Directory Free插件本地包含漏洞复现(附脚本)(CVE-2024-3673)
  • 更换keil工程芯片到103c8t6(HAL库版本)
  • 豆包MarsCode:字符串字符类型排序问题
  • JS宏进阶:控件与事件