首页 > 编程语言 >Buuctf web Php(网站备份+代码审计)

Buuctf web Php(网站备份+代码审计)

时间:2024-12-31 21:28:29浏览次数:3  
标签:web Buuctf 14 序列化 flag 100 Php php Name

网页提示他备份过网站,因此服务器中应该有网站文件的备份信息

我们使用/www.zip看能不能得到(或者使用dirsearch、御剑等工具扫描后台)

成功得到一份备份信息

我们可以审计一下代码,看看内容

Index.php:

总的来说,网页可以被传递一个变量select

然后用res变量接受反序列化的select

Flag.php:

里面是一个虚假的flag,但是我们可以猜测,真正的网站上flag.php中有真正的flag

既然有真正的flag那我们为什么不直接去/flag.php下拿他呢

输入后发现,返回的是一个空网页

我又想,他给我的flag.php是以php代码写的,在html中并不会显示

因此方法无效

Class.php:

写了一个类的脚本

主要作用为:

定义两个私有变量username和password

对象如果使用这两个参数,则会执行_construct这个魔术方法,修改当前的属性值

_wakeup函数表示反序列化成功后执行下面操作

_destruct函数表示在一个函数生命周期结束时自动执行以下操作

如果password不是100就会直接结束脚本

如果password是一百,并且username等于admin,那么会给flag

我们再看index.php

它可以让我们传递一个参数,并且提示我们这个参数要进行反序列

那么我们首先想到的就是对class进行序列化

然后得到一个序列,付给select,最后在进行反序列化,执行

最后即可得到flag

我们找到class类里对我们有用的部分,然后给Name类两个参数

a作为Name的类对象

$b赋值为$a的序列

然后查看序列化后的$a为:

O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

查阅网络资料可知:

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字

段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度

因此,我们真正传参时应该加上\0,这样应该会使它可见

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

而这又会带来另一个问题,\0会截断字符,导致字符后的内容无法被输出

因此我们要用%00来代替\0,他既有了\0的功能,又不会因为\0的特性而截断字符,因此,select应为:

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

但现在还有一个问题,就是反序列操作完成后会自动执行_wakeup这个代码,修改username值,导致在下面的if语句中被拦截,拿不到flag

因此我们需要修改序列的总属性量,改为比原有属性要大的数,这就会触发一个反序列漏洞,导致代码逻辑异常,自动略过_wakeup,有点像卡bug

这是最终的select:

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

我们通过?传参,即可获得flag

本人为大一新生,上述解答仅为个人理解,若有错误请多指教,非常感谢!

标签:web,Buuctf,14,序列化,flag,100,Php,php,Name
From: https://blog.csdn.net/2401_86312572/article/details/144855131

相关文章

  • Web 前端面试指南与高频考题解析
    Web前端面试指南与高频考题解析准备:简历编写和面试前准备一般来说,跳槽找工作要经历投递简历、准备面试、面试和谈offer四个阶段。其中面试题目会因你的等级和职位而异,从入门级到专家级,广度和深度都会有所增加。不过,不管什么级别和职位,面试题目一般都可以分类为理论知识、算法......
  • java和php语言实现堆排序算法代码示例
    堆排序(HeapSort)是一种基于堆数据结构的比较排序算法。堆是一棵完全二叉树,分为最大堆和最小堆。最大堆中父节点的值总是大于或等于其子节点的值,而最小堆则相反。堆排序通过构建堆,然后反复将堆顶元素与末尾元素交换,并调整剩余元素为堆,最终实现排序。堆排序也是常见的算法题目。Jav......
  • 【JAVA高级篇教学】第六篇:Springboot实现WebSocket
    在SpringBoot中对接WebSocket是一个常见的场景,通常用于实现实时通信。以下是一个完整的WebSocket集成步骤,包括服务端和客户端的实现。本期做个简单的测试用例。目录一、WebSocket简介 1.什么是WebSocket?2.WebSocket的特点3.WebSocket的工作原理二、添......
  • chrome播放webRTC的H265视频方法
    需求描述最近有需求实现浏览器直接播放摄像头视频鉴于Camera本身支持了rtsp流,本想web直接播放rtsp,但是还不行,搜了一下webRTC实现的效果和延迟会好一些。于是就使用了mediaMTX转了下rtsp的流,变为webRTC。随便写了个h5页面对视频进行播放,使用下面代码的话替换一下src地址即可点......
  • 推荐一个可以总结、翻译网页的网站:ReadWeb.ai
    直接访问网站readweb.ai,输入想要翻译或总结的网址(记住需要输入完整的URL,要加https://):https://CheckNumber.AI然后回车,稍等一会儿,翻译和总结的结果就出来了:https://readweb.ai/en/page/627d6130ec03988fd01316db91940a58另外,还可以选择各种语言对照版本的,我们试试选择“英中......
  • web前端期末大作业:旅游网页设计与实现——个人旅游博客(4页)HTML+CSS (2)
    ......
  • Java基于spring boot的小型超市商品管理系统python+nodejs+php-计算机毕业设计
    目录功能和技术介绍具体实现截图开发核心技术:开发环境开发步骤编译运行核心代码部分展示系统设计详细视频演示可行性论证软件测试源码获取功能和技术介绍该系统基于浏览器的方式进行访问,采用springboot集成快速开发框架,前端使用vue方式,基于es5的语法,开发工具Intelli......
  • java基于springboot+vue的视频点播系统数据与分析python+nodejs+php-计算机毕业设计
    目录功能和技术介绍具体实现截图开发核心技术:开发环境开发步骤编译运行核心代码部分展示系统设计详细视频演示可行性论证软件测试源码获取功能和技术介绍该系统基于浏览器的方式进行访问,采用springboot集成快速开发框架,前端使用vue方式,基于es5的语法,开发工具Intelli......
  • python+vue基于django/flask的智慧博物馆预约平台java+nodejs+php-计算机毕业设计
    目录技术栈和环境说明具体实现截图系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言开发,MySQL为后......
  • WebSocket协议:从入门到精通
    一、内容概览WebSocket的出现,使得浏览器具备了实时双向通信的能力。本文由浅入深,介绍了WebSocket如何建立连接、交换数据的细节,以及数据帧的格式。此外,还简要介绍了针对WebSocket的安全攻击,以及协议是如何抵御类似攻击的。二、什么是WebSocketHTML5开始提供的一种浏览器与服务......