Web安全
1.实验内容
1.1Web前端HTML。能安装启停Apache,编写含表单的HTML网页。
1.2Web前端javascipt。能用JS验证表单并回显欢迎信息,测试XSS注入。
1.3Web后端数据库。能安装配置MySQL,完成建库建用户建表操作。
1.4Web后端数据库连接。能用PHP连接数据库,实现用户登录认证功能。
1.5基础攻击测试。能进行简单的SQL注入与XSS攻击测试。
1.6安全攻防平台。安装DVWA或WebGoat平台,完成三项主要攻击实践。
2.实验目的
通过搭建Web应用环境,实践前后端开发,并深入理解SQL注入、XSS等常见Web安全漏洞的原理与防护方法。
3.实验环境
安装Kali镜像的VMware虚拟机,具体配置如图1所示:

4.实验过程与分析
4.1 Web前端HTML
4.1.1 Apache Web服务器的安装与配置
Apache是一款开源的Web服务器软件,广泛用于托管网站、提供Web服务和应用程序。
使用命令systemctl start apache2可启动Kali虚拟机中自带的Apache服务,命令systemctl status apache2.service可确认Apache状态,命令systemctl stop apache2可关闭Apache服务。
另外,如果虚拟机上安装启用了防火墙,还需使用命令ufw allow 'Apache'允许HTTP的流量进出防火墙。

打开浏览器,输入localhost,可以看到Apache的欢迎页面,说明Apache Web服务器安装成功。

4.1.2 HTML表单功能实现
进入虚拟机的/var/www/html目录,创建html文件。用vi命令创建两个分别使用POST和GET方法提交表单信息的html文件。使用POST方法数据会在请求体中发送,不会在URL中显示,更加安全;而使用GET方法数据会在URL中显示,因此可以看到明文的用户名口令。图4-9为核心代码、表单显示情况以及URL的显示。






4.2 Web前端 JavaScript
4.2.2 JavaScript表单功能实现
静态的HTML本身无法实现复杂的验证逻辑,为实现“用户名与密码非空”及“密码长度不低于8位”的验证要求,此处使用JavaScript实现基本的验证逻辑。它能够在数据发送到服务器前,通过DOM API获取输入值并进行逻辑判断,从而提供即时反馈。
当用户点击登录按钮后,程序会检查用户的输入是否满足要求。如果用户名或口令为空,则在对应位置给出错误提示;若口令长度不满足,则弹出弹框给出错误信息;若所有条件均满足,则回显用户登录信息。该部分的js代码如图10所示,运行情况如图11-13所示:




4.2.2 注入攻击
(1)利用回显用户名注入HTML
由于程序未对用户输入进行安全检查或转义处理,直接将其作为HTML的一部分拼接输出,这会导致注入攻击的发生。
在用户名输入框中输入:<u>HTML injection succeed.</u>。如果其余字段满足验证逻辑,HTML injection succeed.会被回显到页面,并且以下划线的形式展示。如图14所示:

在用户名输入框中输入:<img src='x' onerror='document.body.innerHTML = "JavaScript injection succeed."'>,这段代码会尝试加载一个名为x的图片,由于这个图片不存在会触发加载错误,然后执行JavaScript代码,将整个网页的body内容替换为"JavaScript injection succeed."这段文字。如图15所示:

4.3 Web后端MySQL
使用命令systemctl start mysql启动kali虚拟机自带的MySQL,通过命令systemctl status mysql可查看服务的启用情况。如图16所示。

输入mysql可进入数据库,随后进行数据库创建,用户创建、授权,建表、插入查看数据等操作。具体代码如下,操作过程如图17所示:
CREATE DATABASE db20232409; #创建数据库USE user1; 进入数据库CREATE USER 'user1' IDENTIFIED BY 'user@111'; #创建用户GRANT ALL PRIVILEGES ON db20232409.* TO 'user1'; #授予用户所有权限FLUSH PRIVILEGES; #刷新权限ALTER USER 'user1' IDENTIFIED BY 'user@1110'; #修改用户密码CREATE TABLE tablefirst (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(100) NOT NULL); #创建表INSERT INTO tablefirst VALUES (1,'user1', 'user@111'),(2,'user2', 'user@222'); #插入数据SELECT * FROM tablefirst; #查看表中所有内容

4.4 使用PHP连接数据库
PHP是为一种编写后端的语言,用于处理前端提交的表单数据。该部分需要利用php编写代码,建立与MySQL数据库的连接,并执行用户认证。
该部分代码需要完成的内容包括:查询用户是否存在,校验密码是否匹配,最终根据结果返回登录成功或失败信息,并安全关闭数据库连接。
为确保表单数据能正确提交,后端处理程序的文件名须与表单的action属性一致,即命名为login.php。该部分代码如图18所示:

登录网站查看运行情况,对于用户名口令均存在于数据库中的情况,可以返回欢迎信息+登录用户用户名;对于用户存在而口令错误的情况,能够正确提示口令错误;对于用户不存在的情况,能够正确给出提示信息。如图19-21所示:



4.5 基础攻击测试
4.5.1 SQL注入
由于程序未对用户输入进行任何安全过滤,直接将前端表单数据拼接至SQL语句中,这导致用户的恶意输入可能改变原语句的执行逻辑。
当攻击者已知用户名时,可在密码框注入' OR '1'='1。这使得后端拼接的SQL查询条件由验证特定密码,转变为AND pwd='' OR '1'='1'。由于'1'='1'恒成立,整个WHERE子句返回值恒为真,导致攻击者无需密码即可登录。

即使不知合法账号,攻击者亦可在用户名与密码栏中均输入' OR '1'='1这类永真条件,从而绕过整个身份验证逻辑,实现非法登录。

4.5.2 XSS攻击
XSS(跨站脚本)攻击是一种通过向网页中注入恶意脚本代码,从而在用户浏览器中执行的攻击。
在用户名输入框内注入<img src=x onerror=alert('XSS成功')>,并在密码框输入任意值提交。由于系统未对用户输入内容进行过滤或编码处理,该段代码被直接回显至页面中。当浏览器尝试加载不存在的图片x时,触发onerror事件,进而执行其中所包含的JavaScript代码,弹出警告框。

4.6使用WebGoat平台,并完成SQL注入、XSS、CSRF攻击
在主机上安装WebGoat靶场。安装完成后有WebGoat和WebWolf两个靶场可供选择。此处选择WebGoat靶场。安装过程可参考链接:https://blog.csdn.net/2302_82189125/article/details/135894689
4.6.1完成SQL注入攻击
该部分需要完成(A3)Injection→SQL Injection(intro)部分的9-13题。
(1)第九题
该部分需要通过SQL注入实现对表中所有数据的查询。
该部分给出的语句为:"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '____ + ____+ ____';
该部分为选择题,为了能够查出表中的所有数据,所以需要设置一个永真条件。同时,由于这是字符串的比较,还需要使得前面的单引号闭合,所以需要选择的三个数据是Smith';or;'1'='1。

(2)第十题
该部分需要通过SQL注入实现对表中所有数据的查询。
该部分给出的语句为:"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;
该部分为填空题,需要填写Login_Count和User_ID。为了能够查出表中的所有数据,所以需要在其中的一个空内设置一个永真条件。我选择在Login_Count中填入任意值,在User_ID后跟上数字型的永真条件。
因此我填写的数据是:
Login_Count:1
User_ID:1 or 1=1

(3)第十一题
该部分需要通过SQL注入实现对表中所有数据的查询。
该部分给出的语句为:"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";
该部分为填空题,需要填写name和auth_tan。为了能够查出表中的所有数据,所以需要在其中的一个空内设置一个永真条件。我选择在name中填入任意值,在auth_tan里闭合引号后再跟上字符型的永真条件。
因此我填写的数据是:
Employee Name:1
TAN:' or '1'='1

(4)第十二题
该部分需要通过SQL注入实现对表中特定数据的修改。
该部分给出的语句为:"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";
该部分为填空题,需要填写name和auth_tan。为了能够查出表中的特定数据的修改,所以需要在第一个空中需要确定修改记录的主键,第二个空中需要先配合第一个空唯一确定该记录,再跟上更新语句。
因此我填写的数据是:
Employee Name:Smith
TAN:3SL99A'; UPDATE employees SET SALARY = 100000 WHERE LAST_NAME = 'Smith

(5)第十三题
该部分需要通过SQL注入实现对表的删除。
通过预先输入一些数据,推测该部分给出的语句可能为:"SELECT * FROM access_log WHERE name = '____';
为了能够将表中数据全部删除,需要在先将内置的sql语句闭合,再在后面添上新的删除表的语句。因此我填写的数据是1'; drop table access_log; --
由于最后还有一个多余的',所以需要使用注释(--)使'失效,否则会引起错误。


4.6.2完成XSS攻击
该部分需要完成(A3)Injection→Cross Site Scripting部分的7、10、11题。
(1)第七题
该部分是反射型XSS攻击,需要通过XSS攻击显示弹框或在终端打印信息。
依次尝试在两个输入框中输入JavaScript注入信息<script>alert('xss attack succeed')</script>。发现仅在第一个框中输入时可以成功,可能是因为第一个框需要的是字符型参数,第二个框中需要的是数值型参数。

(2)第十题
该部分是基于DOM的XSS攻击,需要先找到在生产过程中留在应用程序中的测试代码的路径。
依次尝试在两个输入框中输入JavaScript注入信息<script>alert('xss attack succeed')</script>。发现仅在第一个框中输入时可以成功,可能是因为第一个框需要的是字符型参数,第二个框中需要的是数值型参数。
题干中举了例子并给出了提示,这些信息一般会存在路由信息中,并给出了格式提示。同时建议答题者从js代码中找到答案。
右键点击检查,查找源代码。遍历查找所有以.js结尾的文件,全局搜索route,发现在GoatRouter.js文件中出现了路由信息。其中有记录:
Lesson/:name':'lessonRoute',
'test/:param':'testRoute',
与题干中给出的例子高度一致,合理推断其答案为:start.mvc#test/,正确。

(3)第十一题
该部分是基于DOM的XSS攻击,需要从route中反射参数webgoat.customjs.phoneHome(),给出控制台显示一个响应的随机数。
该部分需要使用到上一题中找到的测试路径,同时需要构造JavaScript注入使得webgoat.customjs.phoneHome()被执行。
我这里采用了尝试加载图像元素的onerror事件处理器来执行JavaScript代码的方式。在URL中输入http://127.0.0.1:8080/WebGoat/start.mvc#test/<img src=x onerror="webgoat.customjs.phoneHome()">,最终在控制台中得到了响应的随机数-832749012,完成题目。

4.6.3完成CSRF攻击
该部分需要完成(A10)Server-side Request Forgery部分的3、4、7、8题。由于该部分内容掌握欠佳,尝试良久未能完成3、4、7题的作答,此处仅分析较为简单的第8题。
这道题模拟了登录CSRF攻击。由用户扮演攻击者,需创建一个恶意账号(csrf-用户名),在保持原账号登录的情况下登录新的恶意账号,最后回到原账号点击按钮。
这时原账号的浏览器会接收到攻击者账号的Session Cookie,覆盖掉原账号原来的登录状态。之后原账号在WebGoat上的所有操作,都会在攻击账号下进行,攻击账号拥有者就能看到原账号拥有者的行为。


5.问题及解决
问题一:
在进行XSS攻击测试时,我发现当在用户名输入框中输入<script>alert("XSS攻击成功!");</script>注入语句后,既没有出现预期的弹框提示,也没有正常回显用户名内容,页面只显示了欢迎部分信息。
解决一:
通过查阅相关资料,我了解到这种现象是由于浏览器的安全机制导致的。通过innerHTML属性插入的<script>标签不会被浏览器执行,这是现代浏览器为防止XSS攻击而设计的重要安全特性。
为了绕过这一限制,我尝试使用<img src=x onerror=alert("XSS攻击成功!")>注入语句。这条语句利用了图像元素的onerror事件处理器来执行JavaScript代码。当图像加载失败时,会自动触发onerror事件中定义的JavaScript代码,从而成功实现了XSS攻击。
问题二:
在PHP连接数据库过程中,我发现无论输入正确或错误的用户名和密码,系统都只能实现页面跳转,但没有任何对应的验证提示信息。
解决二:
仔细检查PHP代码后,我发现出现问题的原因是前后端字段没对齐。前端登录表单中使用的字段名是username和password,而后端PHP代码中却试图获取name和pwd这两个字段。它导致后端无法正确接收到前端提交的数据,从而无法进行有效的数据库查询和验证。当修改前后端字段对齐后,该问题得以解决。
6.心得体会
本次实验我学习了Web安全相关的内容,学习的内容有:前端与后端场景下的SQL注入与XSS注入,WebGoat平台上基础的SQL注入、XSS攻击和CSRF攻击方法实践。通过这一系列动手操作,我对Web攻击的基本逻辑有了一定的认识。
实验过程非常不顺利,尤其是在XSS与CSRF攻击环节我遇到了较大挑战。在尝试XSS攻击时,最初简单地插入alert语句并未奏效,可能是到现代浏览器与前端框架已具备一定的默认防护机制。经过多方查阅资料,我最终通过利用<img>标签的onerror事件执行JavaScript代码,才成功触发了XSS漏洞。
CSRF攻击的实践则更加曲折。由于BurpSuite在安装与启动过程中屡次失败,甚至出现网络流量被拦截但工具内无任何显示的异常状况,导致我无法完成平台中超过半数的相关题目,更为严重的是在一段时间内我根本无法使用搜索引擎正常上网。这不仅归咎于现代安装软件的更新迭代速度之快,也反映出我在安装软件与环境依赖方面的欠缺不足。
总而言之,本次实验让我在已有Web开发知识的基础上,初步尝试了网络攻击的基本手法。亲身体验之后,我深感这些攻击在实际应用中的实施难度远超理论认知,也深刻体会到了钻研网络攻防同学们的艰辛与不易。尽管八次实验告一段落,我深知我现在学习的只是网络攻击与防御技术的冰山一角,若要继续深耕,任重而道远。
参考资料
如何搭建 WebGoat 靶场保姆级教程(附链接)
BurpSuite超详细安装教程-功能概述-配置-使用教程---(附下载链接)