ctfshow ThinkPHP篇573

CTF之think_java反序列化完整案例 【代码】CTF之think_java反序列化完整案例。 阅读详情

web573

thinkphp 3.2.3sql注入漏洞
源代码

class IndexController extends Controller {
    public function index(){
    $a=M('xxx');  //表名
    $id=I('GET.id');
    $b=$a->find($id);
    var_dump($b);
    }
}

来调试一下看为什么普通的注入不行。本地sql表内数据如下。
在这里插入图片描述
传入?id=1'
首先在I函数里面有个过滤,调用think_filter函数
在这里插入图片描述
在这里插入图片描述
但是没什么影响,就算匹配到了最多加个空格。
跟进find函数,在find函数中_parseOptions对$options进行了处理,继续跟进
在这里插入图片描述

_parseType对$options进行了处理,跟进
在这里插入图片描述
可以看到如果我们的数据库中的id是int型会进入intval函数,会直接去掉其他字符达到过滤的效果,如果id的类型是char则会接着往下走。
在这里插入图片描述
执行完_parseType后回到find中的select
在这里插入图片描述
跟进buildSelectSql
在这里插入图片描述
跟进parseSql
在这里插入图片描述

我们知道我们的id的值在$options[‘where’]中,跟进parseWhere
在这里插入图片描述
最终是进到了parseValue
在这里插入图片描述
在parseValue中中我们看到了具体的转义函数
在这里插入图片描述
在这里插入图片描述
也就是通过addslashes()函数进行转义

addslashes() 函数会在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
NULL

那么假设我们传入的内容是数组呢?id[where]=1'
当我们传入的是数组时,不会进入下面的if中,所以$options['where']="1'",否则的话就是
$options['where']['id']="1'"

在这里插入图片描述
按照刚才的方式往下走到_parseOptions,如果我们的$options['where']是数组的话会进入_parseType,我们前面说到,现在的$options['where']="1'"是个字符串,也就不会进入这个if,所以当目标数据库中的id字段是int型时可以绕过intval过滤。
在这里插入图片描述
接着往后走,直接在parsewhere中进入if$whereStr = $where; 最终返回的内容是WHERE 1'在这里插入图片描述
在这里插入图片描述
最终执行的sql语句是select * from xxx where 1' limit 1 这样我们的单引号就保留了下来。
在这里插入图片描述
剩下的就很简单了。
payload:?id[where]=id=0 union select 1,flag4s,3,4 from flags
前面的跑表名和列名就不具体写了。

CTF——Thinkphp5远程命令执行漏洞利用 [BJDCTF 2nd]old-hack(5.0.23) 进入之后: 打开页面,页面提示powered by Thinkphp。说明可能和thinkphp框架有关。也确实如此,这里用到了thinkphp5的远程命令执行漏洞。 Thinkphp5远程命令执行漏洞 漏洞描述:由于thinkphp对框架中的核心Requests类的method方法提供了表单请求伪造,该功能利用 $_POST['_meth... 阅读详情

相关推荐

【CATIA的二次开发38】对象Selection交互选择部分方法介绍01

在CATIA V5的VBA开发中,Selection对象是用户交互的核心组件,用于管理用户在图形区域或特征树中的选择操作。Selection 对象是 CATIA VBA 中的中央交互枢纽,充当用户界面与程序逻辑之间的桥梁。它代表当前在图形区域或特征树中被选中的元素集合,是自动化操作的基础。

学习共勉:不积跬步,无以至千里; 不积小流,无以成江海。 1340

ctfshow thinkphp专题

前言 跟进一步增强php的代码审计能力,了解tp框架 从最基础的开始学习,目的不是为了一把梭,而是要明白它的原理和设计思路,为我们以后自主调试挖洞打下基础 web569——路由 本题使用的版本为3.2.3 ThinkPHP3.2.3完全开发手册-架构-URL模式 入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作: http://serverName/index.php/模块/控制器/操作 这是3.2版本的标准URL格式。 payload

qq_50589021的博客 1108

基于springboot生鲜食品订购系统的设计与实现

近年来互联网络的迅猛发展和电子终端设备的普及,赋予了各行业充足的发展空间。微信小程序的O2O生鲜食品订购相比于传统信息技术,时效性是它最大的特色,已经在电子娱乐、经济等中发挥着举足轻重的作用。短时间内迅速扩大了线上管理系统的规模。尽管O2O生鲜食品订购已经有了很大程度的发展,但在微信小程序的O2O生鲜食品订购领域上却少有建设。

1024

ctfshow- thinkphp专题笔记一

web569 @[TOC]web569

Yasso的博客 1160

[模型部署]-[LLM]昇腾部署Qwen3-Coder-30B-A3B-Instruct

摘要:本文介绍了在Ascend NPU上部署Qwen3-Coder-30B-A3B-Instruct大模型的实践过程。通过vLLM-Ascend框架,详细说明了环境准备(CANN 8.1、PyTorch-NPU 2.5.1等)、模型下载、容器启动及服务部署步骤,包括vLLM服务的启动参数配置和接口测试方法。测试结果显示在当前2卡910B3配置下性能表现仅为8token/s(1并发),并指出流式调用时存在无法输出usage信息的问题。该方案为Ascend平台私有化部署大模型推理服务提供了参考实现。

1671

嵌入式人工智能(18-基于树莓派4B的继电器JQC-3FF-S-Z)

本次实验的输出端控制不会接强电,就用LED灯来模拟即可,由于我那个流水灯模块是低电平点亮,所以接线稍有不同,同学们注意。只有继电器吸合,输出端的NO与COM就导通,给LED低电平然后就亮,否则继电器断开,NO与COM不导通,LED不亮。原理都一样,控制电流的接通与断开,这个模块看起来还简单点,毕竟还有2个指示灯,下端IN如接上电源红灯亮,继电器动作有电流通过绿灯亮。在实际应用中,可以通过编程控制继电器的通断状态,例如在Python编程中设置继电器模块的通断时间,从而实现自动化控制。

u010152658的博客 2531

【Web】Ctfshow Thinkphp3.2.3代码审计(3)

(这里我认为数据库id字段类型为varchar,这样数组条件判断进_parseType()就不会受到数字型或布尔型强制类型转化干扰)发现会进到is_string的判断里,让$options['where']=array("_string"=>"1")之后传入到find(),和web573一样也是以数组形式传参,只不过传入的参数也是数组,我们跟一下代码。键'_string'的首字符为'_',跟进parseThinkWhere()这题与web573的区别在于进find()前先进了where()处理。

uuzeray的博客 542

ESP32-S3射频测试与全球认证全栈实践指南

功率谱密度(PSD)和发射功率等级是无线通信设备射频合规的核心基础概念,其物理层原理直接决定自适应测试、阻塞容限及多国认证的通过路径。PSD ≥10 dBm/MHz触发强制性自适应测试,需验证LBT机制与跳频鲁棒性;而16级可编程发射功率等级(-24 dBm至+20 dBm)则为功耗、覆盖与法规平衡提供工程调控维度。该能力广泛应用于低功耗蓝牙IoT终端、智能家居网关及工业无线传感器等场景,尤其在ESP32-S3平台中,需结合eFuse校准、Sigma工具链与QuickTrack认证策略实现从实验室调试到量产

weixin_34945060的博客 287

CTFSHOW ThinkPHP

在ThinkPHP中,Pathinfo 是一种用于解析 URL 的模式,它允许通过路径参数来指定模块、控制器和方法。根据题目描述,flag 存在于 Admin 模块的 Login 控制器的 ctfshowLogin 方法中,因此需要通过 URL 访问该方法。在 ThinkPHP 的 Pathinfo 模式下,URL 的结构通常为:/index.php/模块/控制器/方法。

2301_80038080的博客 532

Unity 升级引擎版本后构建报错:script class layout is incompatible between the editor and the player

Unity升级引擎版本后,项目报错:script class layout is incompatible between the editor and the player。

学习与分享 593

如何实现在Go语言中替换程序自身

总结起来,我们可以通过将新的程序二进制文件写入磁盘,并在运行时启动这个新的程序来实现在Go语言中替换程序自身。在Go语言中,有时候我们需要在程序运行时替换程序自身,例如更新程序版本或者进行热重启。本文将介绍一种正确的方式来实现在Go语言中替换程序自身的方法,并提供相应的源代码示例。此外,替换程序自身可能会导致正在运行的程序产生意外行为或终止,请谨慎使用,并确保在合适的时机进行替换操作。实现替换程序自身的关键是将新的程序二进制文件写入到磁盘,并在运行时启动这个新的程序。函数启动新的可执行文件,并在后台运行。

HoUnix的博客 288

ctfshow-thinkphp篇

基础知识 关于thinkphp需要知道的基本知识 https://www.kancloud.cn/manual/thinkphp/1696 demo1 修改 D:\phpStudy\PHPTutorial\WWW\thinkphp-3.2\thinkphp-3.2\Application\Home\Controller\IndexController.class.php <?php namespace Home\Controller; use Think\Controller; class Inde

giaogiao123的博客 1235

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CTFshow——thinkphp专题

570——闭包路由 关注这段代码:这是闭包路由的用法,官方:手册闭包支持 我们用phpinfo()函数测试一下:是可以的 /index.php/ctfshow/phpinfo/1 注意因为eval是一个语言结构而不是函数,所以这里是不能被call_user_func调用的,而assert是一个函数。因此我想到了assert(system("ls"));,但在尝试ls /时却不行了,很迷。 然后我想着参数转移一下。然后下意识构造出这样: /index.php/ctfshow/assert/$_POST[1

D.MIND 的博客 2078

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ctfshow ThinkPHP篇—3.2.3(569-578)

文章目录web569相关内容题解web570web571web572web573web574web575web576web577web578 web569 相关内容 参考thinkphp手册 为了访问下图中的index方法并输出hello 123我们可以通过下面四种模式。 PATHINFO模式 http://localhost/index.php/Home/Index/index/name/123/ 普通模式 http://localhost/index.php?m=Home&c=Index&a

羽的博客 2883

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ctfshow thinkPHP专题

569-Thinkphp3.23的url访问规则 https://www.kancloud.cn/manual/thinkphp/1697 URL模式 入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作: http://serverName/index.php/模块/控制器/操作 这是3.2版本的标准URL格式。 可以通过设置模块绑定或者域名部署等方式简化URL地址中的模块及控制器名称。 所以 访问 url/index.php/Admin

qq_45655564的博客 458

ctfshow thinkphp 3.2.3

web569 相关内容 参考thinkphp手册 路由方式 http://serverName/index.php/模块/控制器/操作 此外就是默认是不区分大小写的,由'URL_CASE_INSENSITIVE' => true,这个配置决定。 URL模式的话,默认是PATHINFO模式,即本题考察的模式。 直接访问即可: /index.php/admin/login/ctfshowlogin web 570 根据题目提示 就直接看官方文档 路由一块 看到了闭包函数 .

blowed的博客 399

【Web】Ctfshow Thinkphp3.2.3代码审计(2)

这段代码的作用是根据数据库字段类型的定义,对数据进行相应的类型转换,以确保数据的类型与数据库字段类型匹配,从而提高数据的准确性和一致性。比如数据库中的id是int型会进入intval函数,你输入1' union select * # 转换后就成了1。因为$options['where']是一个数组,所以会从if进入_parseType。其实很明显就是让$options['where']不为数组就可以了。所以要用一些路子,不进入到下面的if判断里。因为1是number,所以会让。这是我们不愿意看到的。

uuzeray的博客 746

【Web】Ctfshow Thinkphp3.2.3代码审计(4)

这里是从cookie里读user键对应的值进行反序列化,并将实例化对象与传入的id比较,如果id属性与传入的id相等,则show方法调用底层的eval执行实例化对象的username属性。因此,确保在进行反序列化之前,你需要确保序列化的类定义存在,并且能够被自动加载或手动引入。这里令$name=_content,$from=写的马即可让$_content非空,从而eval()执行php代码。这次where()里直接传了一个数组,省得走if将字符串的值再改为_string的数组了。

uuzeray的博客 1628

ctf攻防世界 WEB题:php_rce

ThinkPHP是一个基于PHP语言的开源Web应用框架,它提供了一系列的工具和组件,可以帮助开发人员更快速、更高效地构建Web应用程序。ThinkPHP框架具有简单易用、高效稳定、安全可靠等特点,被广泛应用于各种Web应用程序的开发中。对于thinkphp框架Github上有一个专用的漏洞验证工具:https://github.com/zangcc/Aazhen-v3.1。进入靶场后会看到以下内容,非常直观的说明了自己是thinkphp框架。此工具已经给一个可用的url案例,我们只需要更改就可以了。

qq_30889301的博客 1239

【Web】Ctfshow Thinkphp5 非强制路由RCE漏洞

前面审了一些tp3的sql注入,终于到tp5了,要说tp5那最经典的还得是rce下面介绍非强制路由RCE漏洞。

uuzeray的博客 1519

ctfshow ThinkPHP专题 1

PATHINFO模式是系统的默认URL模式,提供了最好的SEO支持,系统内部已经做了环境的兼容处理,所以能够支持大多数的主机环境。REWRITE模式是在PATHINFO模式的基础上添加了重写规则的支持,可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则。m参数表示模块,c参数表示控制器,a参数表示操作(当然这些参数都是可以配置的),后面的表示其他GET参数。,ThinkPHP支持的URL模式有四种普通模式、PATHINFO、REWRITE和兼容模式。...

qq_61768489的博客 991

【Web】CTFSHOW-ThinkPHP5-6反序列化刷题记录(全)

纯记录exp,链子不作赘述。

uuzeray的博客 1227

web flow

http://www.vertexlogic.com/processOnline/process/processOnline.html http://flowchart.com/ViewDemo http://www.gliffy.com/ http://www.edrawsoft.com/drawing-online.php // need to check ...

lgj573 175
上一篇: ctfshow baby杯web
下一篇: ctfshow ThinkPHP篇575
yu22x
博客等级 码龄7年 3739粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu22x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值