Exp 8 Web综合
20184312孙静
一、基础问题回答
1.什么是表单
表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域、下拉列表、单选框、复选框等等)输入信息的元素,表单在网页中主要负责数据采集功能,一个表单有三个基本组成部分:表单标签、表单域、表单按钮。
2.浏览器可以解析运行什么语言
支持HTML(超文本标记语言)、XML(可扩展标记语言)以及Python、PHP、JavaScript、ASP等众多脚本语言。
3.WebServer支持哪些动态语言
JavaScript、ASP、PHP、Ruby等脚本语言,ASP基于IIS WEB SERVER,是微软的服务器端脚本技术,PHP基于APACHE WEB SERVER,与ASP有几分类似,都是一种在服务器端执行的嵌入HTML文档的脚本语言。
4.防范注入攻击的方法有哪些
一是可以替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义;
二是限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
三是检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
四是将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。
二、实验过程记录
(一)Web前端HTML
1. 安装、配置、停止Apache2
(1)安装
sudo apt-get install apache2//命令进行安装 service apache2 start //启动
service apache2 stop //关闭
(2)重要目录、文件
/etc/apache2/apache2.conf //存储了apache2的配置 /var/www/html //存储网页 /var/log/apache2/error.log //存储报错信息
(3)apache2侦听端口
使用命令
netstat -aptn
查看端口信息,如果80端口被Apache2监听,则启动成功。
从图中可以看出,80端口已经被apache2监听。
如果80端口被其它应用占用,可以使用 netstat -tupln | grep 80 查看占用80端口的应用PID, 然后 kill processID(进程ID) 关闭此进程,再次开启Apache即可;也可以通过修改ports.conf的方法,把Apache的默认端口从80改为其他的未被占用的端口。
(4)测试
测试1:
浏览器打开 127.0.0.1,如下图所示,可正常打开Apache介绍网页
测试2:
在终端输入命令
vi /var/www/html/test4312.txt
进入编辑器,输入20184312sunjing
浏览器打开 127.0.0.1/test4312.txt 可看到输入的内容
2. 编写一个含有表单的HTML,理解HTML,理解表单,理解GET与POST方法
HTML表单教程请查看https://www.w3school.com.cn/html/html_forms.asp
w3school支持运行编写好的html代码,可以在网站上调试好后再新建html。
method 属性:
<form> 标签的 method 属性中指明表单处理服务器要用方法来处理数据,可以使用POST或者GET方法。
如果采用 POST 方法,浏览器将会按照下面两步来发送数据。首先,浏览器将与 action 属性中指定的表单处理服务器建立联系,一旦建立连接之后,浏览器就会按分段传输的方法将数据发送给服务器。
另一种情况是采用 GET 方法,这时浏览器会与表单处理服务器建立连接,然后直接在一个传输步骤中发送所有的表单数据:浏览器会将数据直接附在表单的 action URL 之后。这两者之间用问号进行分隔。
(1)POST方法
我的代码如下:
<html> <body> <h1>用户登录</h1> <form action="/demo/html/action_page.php" target="_blank" method="POST"> <label for="fname">账号:</label><br> <input type="text" id="username" name="username" ><br> <label for="lname">密码:</label><br> <input type="password" id="password" name="password"><br><br> <input type="submit" value="登录"> </form> </body> </html>
效果如下所示:
在终端命令行输入
vi /var/www/html/submit_4312.html
进入编辑模式后,将代码进行复制,保存退出编辑页面。
在浏览器端打开对应的 http://127.0.0.1/submit_4312.html,如下所示
除了文字乱码以外,其余均和预期的一样。
乱码解决方法:
在代码<body>标签下添加一行关于编码的内容,“<meta charset="utf-8">”
再次进入 http://127.0.0.1/submit_4312.html,如下所示,字符可以正常显示。
点击登录,查看效果
可看到浏览器栏中为http://127.0.0.1/demo/html/action_page.php,因为当前采用的传送方法是POST ,会将输入信息传送给action_page.php。
(2)GET方法
将method设置为GET,按照上述步骤再次进行查看
可看到浏览器栏中显示了刚刚输入的账号20184312,密码sunjing。
采用GET方式,则会将输入的信息(这里是账号及密码)显示到表单的 action URL 之后。
(二)Web前端javascipt
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果,通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
前段JavaScript脚本语言可以访问https://www.w3school.com.cn/js/js_validation.asp网站进行简单学习
1. 在(1)的基础上,编写JavaScript验证用户名、密码的规则,在用户点击登陆按钮后回显“欢迎+输入的用户名”。
代码如下:
验证用户名密码的规则是二者不为空,二者有一为空则弹出“账号密码不能为空”的对话框。
在点击登录并且账号密码符合规则将弹出“欢迎+用户名”的对话框。
<html> <head> <script> function validateForm() { var x = Form.username.value; var y = Form.password.value; if ((x == "")||(y == "")) { alert("账号密码不能为空"); return false; }else alert("欢迎"+x); } </script> </head> <body>
<meta charset="utf-8"> <h1>用户登录</h1> <form name="Form"action="/demo/html/action_page.php"onsubmit="return validateForm()" target="_blank" method="POST"> <label for="fname">账号:</label><br> <input type="text" id="username" name="username" ><br> <label for="lname">密码:</label><br> <input type="password" id="password" name="password"><br><br> <input type="submit" value="登录"> </form> </body> </html>
onsubmit="return validateForm()"表示一旦点击提交将会触发validateForm函数。
alert():用来简单而明了地将alert()括号内的文本信息显示在对话框中,要显示的信息放置在括号内,该对话框上包含一个“确认”按钮,用户阅读完所显示的信息后,只需单击该按钮就可以关闭对话框。
validateForm中x 为输入表单的 username的值,y为password的值,对x和y的值进行判断,若有一个为空则alert("账号密码不能为空"),若二者均不为空则alert("欢迎"+x),变量x存放用户输入的账号值。
在终端命令行输入
vi /var/www/html/javascript_4312.html
新建一个html文件,进入编辑页面后将代码进行复制粘贴,在浏览器端进入http://127.0.0.1/javascript_4312.html,效果如下:
对编写的规则进行测试,分别不输入账号密码、只输入账号、只输入密码,效果如下,都会弹出“账号密码不能为空”的对话框。
接下来输入正确的账号密码进行测试,我输入的账号为sunjing,密码为20184312,点击登录后效果如下所示,会弹出一个“欢迎sunjing”的对话框。
为了和数据库中的属性对应,新增加了用户名,实现原理与上面的代码类似。
2. 理解DOM
DOM(document object model)文档对象模型,是一项W3C 标准,是针对HTML和XML的一个API(应用程序接口)。它将web页面和JavaScript连接起来,允许程序和脚本动态地访问、更新文档的内容、结构和样式。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。它会将web页面和脚本或程序语言连接起来。当网页被加载时,浏览器会创建页面的文档对象模型DOM(Document Object Model)。简单来说,DOM就好像是一个PPT的模板。
比如下面这部分html代码,script中对p1这个标题的属性进行定义,定义了字体颜色、样式、大小,这里p1的内容是“用户登录”。
<p id="p1">用户登录</p> <script> document.getElementById("p1").style.color = "green"; document.getElementById("p1").style.fontFamily = "Arial"; document.getElementById("p1").style.fontSize = "larger"; </script>
显示效果如下所示:
在这里dom相当于一个格式模板,有了模板我们只需要定义好模板对应的内容即可。
3. 尝试注入攻击,利用回显用户名注入HTML及JavaScript。
在输入框中输入<img src="4312.png">,点击登录后应该会有图片显示出来,但是不知道为什么,我的无法显示,经过检查应该是代码的问题,但是由于本人能力有限,实在检查不出来,所以借用班上一位同学的代码,进行修改,如下所示。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <style type="text/css"> .divForm{ position: absolute;/*绝对定位*/ width: 300px; height: 200px; text-align: center;/*(让div中的内容居中)*/ top: 50%; left: 50%; margin-top: -200px; margin-left: -150px; } </style> <body> <div class="divForm"> <h1 align="center">登陆界面</h1> <form name="form1" onsubmit="return checkForm();" method="post" action="index.php"> <table border = "0"> <tr> <td>用户名:</td> <td><input type="text" name="username" value="" /></td> </tr> <tr> <td>账号:</td> <td><input type="text" name="userid" value="" /></td> </tr> <tr> <td>密  码:</td> <td><input type="password" name="userpwd" value="" /></td> </tr> <tr> <td></td> <td><input type="submit" value="提交" /> <input type="reset" value="重填" /></td> </tr> </table> </form> </div> </body> </html> <script type="text/javascript"> function checkForm(){ if (form1.username.value == null || form1.username.value==""){ alert("请输入用户名"); return false; } if (form1.userid.value == null || form1.userid.value==""){ alert("请输入账号"); return false; } if (form1.userpwd.value == null || form1.userpwd.value==""){ alert("请输入密码"); return false; } return true; } </script>
php页面的话,可以随便编写一个,只要保证表单中的action与编写的php页面名称一致即可。
在输入框输入后
<script>alert("20184312sunjing")</script>
会显示出一个弹框,如下所示:
(三)Web后端——MySQL基础:正常安装、启动MySQL,建库、创建用户、修改密码、建表
在linux上执行关于安装mysql的命令后,均显示没有安装包,应该是当前版本的kali不支持mysql了,如下图所示。
在网上查找相关教程,发现MariaDB是MySQL源代码的一个分支,所以可以安装mariadb试试。
(1)执行下列命令
apt-get install mariadb-client apt-get install mariadb-server
(2)配置文件
在终端输入下列命令
vi /etc/mysql/my.cnf
进入编辑页面后,将以下内容复制到文件中
[client-server] #default-character-set=utf8 port = 3306 socket = /tmp/mysql.sock [mysql] default-character-set=utf8
保存退出
(3)启动mysql
在命令行终端输入
service mysql start
这一步如果报错,根据提示用journalctl -xe查看报错信息,重点查看报[error]的部分,可能是配置文件出错可能是某个文件夹没有权限可能是磁盘满了可能是端口被占用可能是其他奇奇怪怪的问题,总之要仔细查看报错内容,然后对症下药。
(4)登录mysql
在命令行中输入下面的指令,进行登录,password为空
mysql -u root -p
MariaDB > 后面就可以输入mqsql指令了
(5)查看数据库基本信息
show databases;
注意后面有“;”
(6)修改密码
如下所示,输入指令:
mysql> use mysql; //这里的mysql是上一步中查询到的数据库名称 mysql> select user, password, host from user;//mysql库中的user表中存储着用户名、密码与权限 mysql>UPDATE user SET password=20184312 WHERE user='root'; //20184312是我设置的密码 mysql>flush privileges; mysql>quit; //退出数据
修改完成后再输入登录指令测试密码修改是否成功
mysql -u root -p
(7)创建用户
创建新用户,用户名为sunjing,localhost表示此用户为本地用户,密码是20184312:
create user 'sunjing'@'localhost' identified by '20184312';
授予新用户root用户的所有权限:
grant all privileges on root.* to 'sunjing'@'localhost' identified by '20184312'; flush privileges;
测试新用户:
mysql -u sunjing -p
可以正常登录。
(8)建库建表
新建名称为“sunjing_test”的库,注意单引号的格式,否则会报错。
CREATE SCHEMA `sunjing_test`;
详细数据库教程网上有很多,大家可以自行学习一下,下面是一些常用命令:
create database `nbuna`;//创建数据库,引号内容为数据库名称 drop database `nbuna`;//删除数据库 show databases;//查看数据库 use mysql;//选择数据库
drop table users;//删除表 select * from users;//查询users表中的所有元组 alter table users drop column enabled;//删除users表中的enabled属性列; insert into users (ename,hiredate,sal,deptno) values ('jack','2000-01-01','2000',1);//在users表中新增记录,指定字段 insert into users values ('lisa','2010-01-01','8000',2);//在users表中新增记录,可以不指定字段,但要一一对应 delete from users where userid='20184312';//从users表中删除userid为20184312的记录
在sunjing_test数据库中新建名为users的表,表中包含userid、username、password、enabled四项属性。
CREATE TABLE `sunjing_test`.`users` (`userid` INT NOT NULL COMMENT '',`username` VARCHAR(45) NULL COMMENT '', `password` VARCHAR(256) NULL COMMENT '', PRIMARY KEY (`userid`) COMMENT '');
在users表中插入一条记录
insert into users (userid,username,password) values ('20184312','sunjing','20184312');
查看记录:
select * from users;
(四)Web后端——编写PHP网页,连接数据库,进行用户认证
1. PHP安装
使用命令
sudo apt-get install php
命令进行安装,PHP安装完即可正常使用,不需要修改配置。
2. PHP简单编程
(1)测试PHP能否正常工作
输入指令
vi /var/www/html/test.php
内容为
<?php include($_GET["a"]); ?>
大概意思是将“a”的内容取出来显示在页面上
保存退出后在浏览器打开 http://127.0.0.1/test.php?a=/var/www/html/test4312.txt ,这里我将a设置成了/var/www/html/test4312.txt文件,所以页面显示出来是文件的内容,如下所示。
(2)尝试获取表单数据
代码如下:
<!DOCTYPE html> <html> <body> <?php echo "我的第一段 PHP 脚本!"; $uid=($_GET["userid"]); $uname=($_GET["username"]); $pwd=($_GET["password"]); echo $uid; echo $uname; echo $pwd; ?> </body> </html>
代码中的参数userid、username、password是从html表单输入的内容,输入后会传递给php。这里直接在地址栏后添加上?userid=20184312&username=sunjing&password=20184312,测试能否正常回显。
3.安装PHP-MYSQL开发库,连接数据库,进行用户认证
执行下列两条指令
apt-get install php7.4-mysql
apt-get install php7.4-mysqli
安装完成后可以通以下指令确认mysql mysqli的安装结果。
locate mysql.so
locate mysqli.so
此时需要将之前写的html前端页面和mysql数据库连接起来,二者之间的“桥”就是php代码。
访问html页面前记得打开apache2服务。
html前端代码如下:
!注意:
(1)表单中的action="XXXX.php",XXXX.php应该为你所编写的php文件的文件名
(2)method="POST"/"GET",method的选择要与php代码中的接收方式一致。
php代码如下:
内容的3-5行表示将html传送的数据存放到uid、uname、pwd三个变量中;
9行中$query_str变存放的是数据库查询命令语句,在数据库中查询输入的账号、用户名、密码;
13行是关于登录数据库的操作,括号中的4个参数含义分别为 本机地址、用户名、密码、需要进行操作的数据库的名称;
16到20行含义是,若数据库登录失败则将错误信息打印出来,登录成功输出“connection ok!”;
22到31行则是对html输入的账号、用户名、密码校验结果进行处理,若匹配成功则输出“Wellcome login+用户名”,否则输出“login failed!!!!”。
1 <?php 2 3 $uid=($_POST["userid"]); 4 $uname=($_POST["username"]); 5 $pwd=($_POST["password"]); 6 7 /* echo $uname; */ 8 9 $query_str="SELECT * FROM users where userid='{$uid}' and username='{$uname}' and password='{$pwd}';"; 10 11 /* echo "<br> {$query_str} <br>";*/ 12 13 $mysqli = new mysqli("127.0.0.1", "root", "20184312", "sunjing_test"); 14 15 /* check connection */ 16 if ($mysqli->connect_errno) { 17 printf("Connect failed: %s\n", $mysqli->connect_error); 18 exit(); 19 } 20 echo "connection ok!"; 21 /* Select queries return a resultset */ 22 if ($result = $mysqli->query($query_str)) { 23 if ($result->num_rows > 0 ){ 24 echo "<br> Wellcome login Mr/Mrs:{$uname} <br> "; 25 } else { 26 echo "<br> login failed!!!! <br> " ; 27 } 28 29 /* free result set */ 30 $result->close(); 31 } 32 $mysqli->close(); 33 ?>
以下是结果截图:
在html页面输入账号信息
账号、用户名、密码匹配成功的返回界面如下所示,先显示数据库连接成功,再显示欢迎sunjing
输入时使用错误密码,返回界面如下,会显示login fail!!!登录失败
(五)SQL注入和XSS攻击测试
1. SQL注入
SQL注入攻击:可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
其实相当于填空,
serch * from users where userid='XXX' and pwd='XXX';
XXX部分就是你输入的账号密码,可以在输入的字符串中通过构造单引号闭号进行攻击。
常见的有下列几种:
(1)' or 1=1#
在登录界面用户名处输入' or 1=1#
,其他部分随意,填充到数据库查询语句中,如下:
select * from users where username='' or 1=1#' and pwd='XXX';
#是注释符,将其后面的内容给注释掉,所以只剩下前面的1=1,这是一个恒成立的式子,因此可以成功的登录。
在之前编写的网页上进行测试,如下:
账号中输入
' or 1=1#
用户名密码随意。
可以看到登录成功
(2)admin';#
在账户名中输入admin';# ,其他随意输入,放在sql语句中则为:
select * from users where username='admin';#'and pwd='XXX';
#后的部分被识别为注释,相当于执行一个仅查询用户名的操作,不需要匹配密码,admin换成任何一个你知道数据库中存在的账号即可。
在之前编写的网页中进行测试,在账号处输入20184312';# 用户名、密码随意
结果如下所示,显示登录成功。
2.XSS攻击
概念:
XSS表示Cross Site Scripting(跨站脚本攻击),通过插入恶意脚本,实现对用户游览器的控制。
具体来说假如用户提交的数据含有js代码,不做任何处理就保存到了数据库,读出来的时候这段js代码就变成了可执行的代码。一般用户提交的数据永远被认为是不安全的,在保存之前要做对应的处理。
xss攻击也可以分成三类:
反射型:经过后端,不经过数据库
存储型:经过后端,经过数据库
DOM:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。
用户名输入框中输入
读取/var/www/html目录下的图片:
用户名输入
<img src="4312.png" />
如果不能显示的话,可以尝试更改一下图片权限:chmod 777 /var/www/html/4312.png
输入<img src="4312.png">
4312.png为html目录下的一张图片,输入后点击登录,如下所示,可以看到图片。
(六)webgoat的使用,完成SQL注入、XSS、CSRF攻击各一例
1.webgoa的安装
windows和linux上均可搭建,但是由于WebGoat 8使用jdk 1.8编译,所以主机上需要配置好jdk环境。
这里我选择在windows上搭建,在cmd中输入java -version检查jdk版本,如下所示,在1.8以上即可。
下载地址: https://github.com/WebGoat/WebGoat/releases 下载下来的就是一个jar包。(但是我没有在这个地址里面找到jar的包)
我在别的网站下载到了 webgoat-server-8.0.0.M21.jar,下载完成后,在cmd中转到文件所在的目录,输入命令
java -jar webgoat-server-8.0.0.M14.jar
在实验过程中不要关闭命令行界面。
在浏览器端进入http://127.0.0.1:8080/WebGoat/login.mvc
界面如下所示:
注册一个账号,然后登录,网页如下:
左侧是菜单右侧是对应的内容,我们点开sql注入漏洞界面如下:
2. SQL注入攻击
(1)String SQL Injection
题目:
The query in the code builds a dynamic query as seen in the previous example. The query in the code builds a dynamic query by concatenating strings making it susceptible to String SQL injection:
"select * from users where name = ‘" + userName + "'";
Using the form below try to retrieve all the users from the users table. You shouldn’t need to know any specific user name to get the complete list, however you can use 'Smith' to see the data for one user.
由题可知,查询SQL语句为:"select * from users where name = ‘" + userName + "'";
尝试一下单引号闭合加分号,然后后面加查询语句
';select * from user;--
失败了,提示没有权限,所以应该设计一种恒等式,使得查询的对象变成整个users表,需要注意的是构造注入的是字符串,我的构造如下:
' or 1=1;--
成功啦,显示出了表中所有的记录。
(2)Numeric SQL Injection
题目:
The query in the code builds a dynamic query as seen in the previous example. The query in the code builds a dynamic query by concatenating a number making it susceptible to Numeric SQL injection:
"select * from users where USERID = " + userID;
Using the form below try to retrieve all the users from the users table. You shouldn’t need to know any specific user name to get the complete list, however you can use '101' to see the data for one user.
这里需要使用数字来构成注入,题干中提示,我们可以使用'101' to see the data for one user,所以我的构造如下:
101 or 1=1
成功了!
(3)题目三
题目:
第一问应该是要查询到所有用户的记录,先试试恒等式
' or 1=1;--
结果如下,感觉不是上面所建的表,里面没有Dave,而且也表项对不上。
再试试后面加一条查询语句的方法:
' ;select * from user_system_data;--
结果如下,这次有Dave了,而且表项也符合,同时可以看到Dave的密码,把这个密码输入第二问的框框。
完成任务!
3.XSS攻击
(1)Reflected XSS Attacks
题目:
当我们输入错误用户信息后,服务器校验输入有误,返回错误页面并将错误内容展示给我们看,这时如果我们将带有攻击性的URL作为输入源,就会弹出对话框。
这里将
<script>alert('my javascript here')</script>
作为card number的输入,然后提交,会弹出对话框,显示my javascript here,如下所示:
4.CSRF攻击
题目展示:
方法1:
构造一个攻击链接,当用户处于登录状态时点击了攻击链接,该链接会发起针对用户正在访问(已访问)站点(被攻击站点)的命令/请求。
参考了https://www.jianshu.com/p/419213416092 的方法。
点击题目中的查询按钮,然后复制新页面的地址:http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag?csrf=false&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2(后面的那串数字复制下来就是这样,应该是经过编码了,直接使用即可)
在kali上/var/www/html下新建了一个html文件,代码如下
<!DOCTYPE html> <html> <head> <title>csrf</title> <meta charset="utf-8"/> </head> <body> <img src="http://127.0.0.1:8080/WebGoat/csrf/basic-get-flag?csrf=false&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2" style="diaplay: none;"/> </body> </html>
在脚本中使用img自动发起针对攻击站点就是我们上面复制地址的请求
因为我的webgoat安装在windows上,所以在浏览器端输入kali的ip/攻击链接的文件名,即http://192.168.43.91/test_516.html 进行访问。打开浏览器(我的是火狐浏览器)的web开发工具,如下所示:
双击蓝色的部分的链接,则会弹出下面的页面,这里面的flag不再是null了,将这个flag填到题目的框框里就OK啦。
完成!
方法2:
看到一个学长的方法,把点击提交查询后弹出的页面的网址的csrf=false改成csrf=true,然后刷新页面就能显示flag,但是不知道这个方法的原理是什么,搞不明白。
三、实验总结与体会
感觉这次实验与之前相比的话,难度不大,只是内容比较多一点。在摸索和自学的过程中,感觉编写网页还是挺有意思的,也加深了对于web的了解。这次实验用时比较久,任务量很大,需要了解的只是也很多,课下要学习表单网页代码,数据库的建立,并且与网页的联系,实验过程中遇到了很多麻烦,经历了众多坎坷之后终于做出了web的入侵,很多东西还是挺有意思的,像SQL注入、XSS攻击等。经过这次实验更加明确了今后的学习目标,注重实战操作,当然要先学好基础知识,希望在网络对抗知识的学习中能更有体会的同时,下一次实验能够更加顺利。