练习 17 Web [极客大挑战 2019]PHP

常见的网站源码备份文件名和后缀,反序列化攻击 unserialize():wakeup绕过,private类以及属性序列化后的%00修改

开靶机
提到”备份“
那看看有没有backup.php啥的

在这里插入图片描述

如果网站存在备份文件,常见的备份文件后缀名有:“.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf” 尝试在URL后面,依次输入常见的文件备份扩展名。

常见的网站源码备份文件后缀:
tar.gz,zip,rar,tar

常见的网站源码备份文件名:
web,website,backup,back,www,wwwroot,temp

找到 www.zip,里面一堆文件
在这里插入图片描述
其中class提到会收到username和password
符合username=admin,password=100
就调用flag输出

<?php
include 'flag.php';error_reporting(0);class Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}function __wakeup(){$this->username = 'guest';}function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();}}
}
?>

另一个index.php中间也藏了一段和前端看到不一样的代码:
GET传参,参数是select
有个函数unserialize(),没见过
搜索
UNSERIALIZE——反序列化漏洞
PHP反序列化-__wakeup()方法漏洞(CVE-2016-7124)
极客大挑战 2019 PHP 1
BUUCTF__[极客大挑战 2019]PHP_题解
想起来了。。。

unserialize(): 从已存储的表示中创建 PHP 的值列化后的字符串。
若被反序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup()成员函数(如果存在的话)

常见的魔术方法:

__construct():当对象创建(new)时会自动调用。但在unserialize()时是不会自动调用的。(构造函数)
__destruct():当对象被销毁时会自动调用。(析构函数)
__wakeup() :如前所提,unserialize()时会自动调用。
__tostring():只要调用了echo 来打印对象体,就回自动调用__tostring()

根据以上内容,重新梳理class.php
首先username,password会在对象被new出来自动生成
public function __construct($username,$password)

其次__wakeup方法会导致username变成’guest‘:function __wakeup(){$this->username = 'guest';
而我们已知输出flag的必要条件是username=’admin‘
所以需要绕过__wakeup方法。

当成员属性数目大于实际数目时可绕过wakeup方法

本题中成员属性数目为2(username,password),所以稍后在序列化字符串中需要修改为3或者更大的数字;

最后,__destruct()方法的触发是销毁时自动调用

根据以上内容,梳理index.php中的这段代码
首先new了一个对象select,这个select我们可以控制传入值
然后new了一个对象res,被赋值为反序列化执行后的

    <?phpinclude 'class.php';$select = $_GET['select'];$res=unserialize(@$select);?>

根据以上内容,得出序列化代码

<?php
class Name{private $username = 'admin';private $password = '100';}$select = new Name();$res=serialize(@$select);   echo $res
?>
O:4:"Name":2:
{s:14:"口Name口username";s:5:"admin";s:14:"口Name口password";s:3:"100";}

这串字符的含义:
变量类型;类名长度;类名;属性变量
{属性类型;属性名长度;属性名;属性值类型;属性值长度;属性值内容}
o 表示object对象
4 表示对象名称有4个字符
Name 对象名称
2 表示只有一个值
s 表示 string 字符串
14 表示test 字符串长度

之前在class中看到Name类是private修饰的:需要注意序列化后的变化,例如’口‘这个在类名和属性名前面的无效符号就必须手动替换为%00,否则它在你输入后会消失;public修饰的话则不需要做任何改动

各访问修饰符序列化后的区别:
public:属性被序列化的时候属性名还是原来的属性名,没有任何改变
protected:属性被序列化的时候属性名会变成%00*%00属性名,长度跟随属性名长度而改变
private:属性被序列化的时候属性名会变成%00类名%00属性名,长度跟随属性名长度而改变

然后记得将属性成员数量Name修改为3
修改好后如下:

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

在这里插入图片描述

flag{eba27cdf-1371-469e-9a02-0231d2db8018}

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

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

相关文章

开源代码分享(17)-基于足球队训练算法(Football Team Training Algorithm,FTTA)的组合风速预测

参考文献&#xff1a; [1]Tian Z, Gai M. Football team training algorithm: A novel sport-inspired meta-heuristic optimization algorithm for global optimization[J]. Expert Systems with Applications, 2024, 245: 123088. 1.算法基本原理 足球队训练算法&#xff0…

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过&#xff0c;burp修改content-type绕过&#xff0c;常见的文件上传存放目录名 题目就叫upload&#xff0c;打开靶机 直接上传一个图片格式的一句话木马&#xff0c;返回如下&#xff1a; 提交练习5和9中的两种可以执行图片格式php代码的文件&#xff0c;修改con…

前端三剑客 —— CSS (第四节)

目录 内容回顾&#xff1a; 1.常见样式 2.特殊样式 特殊样式 过滤效果 动画效果 动画案例&#xff1a; 渐变效果 其他效果&#xff1a; 多列效果 字体图标&#xff08;icon&#xff09; 内容回顾&#xff1a; 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的…

蓝桥杯-冶炼金属(二分求最大最小)

P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二分做法&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int N 1e410; int n,a,b; int v[N],cnt[N]; int check(int x){for(int i1;i<n;i…

JS详解-设计模式

工厂模式&#xff1a; 单例模式&#xff1a; // 1、定义一个类class SingleTon{// 2、添加私有静态属性static #instance// 3、添加静态方法static getInstance(){// 4、判断实例是否存在if(!this.#instance){// 5、实例不存在&#xff0c;创建实例this.#instance new Single…

[AIGC] SpringMVC, Filter, Interceptor之间关系详解

在Web应用开发过程中&#xff0c;我们经常需要处理各样的HTTP请求和响应。在Spring框架中&#xff0c;我们主要借助SpringMVC、Filter和Interceptor来处理这些任务。那么&#xff0c;这三者之间有什么关系&#xff0c;又分别扮演着什么角色呢&#xff1f;本文将带你一探究竟。 …

VS Code 配置 cmake

CMake 用法参考 CMake学习 cmake使用详细教程&#xff08;日常使用这一篇就足够了&#xff09;_cmake教程-CSDN博客 手动添加 CMake 编译器的搜索路径 如果没有设置上面的路径&#xff0c;有些编译器是找不到的 指定cmake 生成文件的路径 生成makefile 等文件的路径 可以指…

Linux网卡IP地址配置错误的影响

在Linux系统中&#xff0c;网络配置是保持系统顺畅运行的关键一环。正确配置网卡的IP地址对于确保网络通信的准确性和效率至关重要。然而&#xff0c;如果在这个过程中发生错误&#xff0c;可能会带来一系列问题。让我们一起探讨一下&#xff0c;如果Linux网卡的IP地址配置错误…

网络基础(1)

以下是网络部分整体的学习路线&#xff1a; 网络的发展历程 因为人与人之间是需要合作去完成一些任务的&#xff0c;这也就意味着计算器之间也是需要互相"沟通"的。因为计算机也是人所使用的工具&#xff0c;人都需要互相协作&#xff0c;也就注定了计算机也是需要互…

Toyota Programming Contest 2024#4(AtCoder Beginner Contest 348)(A~D)

A - Penalty Kick i,1~N。如果 i 是 3 的倍数输出x&#xff0c;否则输出o #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);--(i)) #define debug(a) cout<<#…

你离涨薪只差一步,深入Linux内核架构与底层原理,让你薪资疯长

第一章linux总览 第二章Linux内核架构 第三章内核数据结构 第四章Linux系统的启动 第五章进程(重点) 第六章内存管理(重点) 第七章安全 第八章网络(重点) 自我介绍一下&#xff0c;小编13年上海交大毕业&#xff0c;曾经在小公司待过&#xff0c;也去过华为、OPPO等大厂&…

【每日刷题】Day3

【每日刷题】Day3 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 2. 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 3. 118. 杨辉三…