WEB安全之XSS漏洞

跨站脚本攻击(Cross
Site Scripting)。这是一种将恶意Javascript代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。自1996年诞生以来,如今已经历十多年的演化。由于和另一种网页技术-层叠样式表(Cascading Style Sheets,CSS)的缩写一样,为了防止混淆,故把原本的CSS简称为XSS。在各种WEB应用安全漏洞中,XSS跨站脚本攻击漏洞一直被OWASP(Open Web Application Security Project)组织评为十大应用安全之一。

流程

WEB安全之XSS漏洞_第1张图片

以博客留言板为例:

用户一般都是按照正常的语言文字在留言板进行留言。假如有一个攻击者,别有用心,反其道而行之,留言不再是一段正常的文字,而是输入了一串JavaScript脚本,如

<script>alert("your are so fool")</script>

此时网页的结构则变成如下形式:

<html>
  <title>XSS TESTtitle>
  <body>
		五楼:<script>alert("your are so fool")script>
  body>
html>

一旦用户浏览留言板,此段JavaScript脚本变会被浏览器解析,返回给用户,造成XSS漏洞。这就是最简单形式的XSS漏洞。

常见的恶意脚本形式

针对XSS漏洞,一般比较常见的脚本形式如下:

1、利用XSS弹警告窗:


2、获取cookie形式:


3、嵌入其他网站:


4、XSS输入也可能是HTML代码段,如使网页不停刷新:


危害

①网络钓鱼,包括盗取各类用户账号。

②窃取用户cookie资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作。

③劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账,强制发表日志,发送电子邮件等。

④强制弹出广告页面,刷流量等。

⑤网页挂马。

⑥进行恶意操作,例如任意篡改页面信息,删除文章等。

⑦进行大量的客户端攻击,如DDOS攻击。

⑧获取客户端信息,例如用户的浏览历史,真实ip,开放端口等。

⑨控制受害者机器向其他网站发起攻击。

⑩结合其他漏洞进一步扩大攻击。

分类

xss根据攻击类型可分为如下三种形式:

1、反射型XSS

2、存储型XSS

3、DOM-based XSS

下面就具体的类型进行讲解。

反射型XSS

​ 反射型XSS也被称为非持久性XSS,是现在最容易出现的一种XSS漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS代码的数据发送到浏览器,浏览器解析这段带有XSS代码的数据后,最终造成XSS漏洞。

WEB安全之XSS漏洞_第2张图片

​ 反射型XSS其基本思想就是依靠站点服务端返回脚本,在客户端触发执行从而发起Web攻击。例如,在搜索框中输入如下脚本:

<script>alert(0)</script>

点击搜索,页面弹出alert对话框。

存储型XSS

​ 存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本。允许用户存储数据的WEB应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当再次访问页面时,这段XSS代码被程序读取响应给浏览器,造成XSS跨站攻击。

WEB安全之XSS漏洞_第3张图片

​ 与反射型不同的是,存储型XSS属于二次渲染的漏洞,它首先会被持久化,然后从持久化中读取到页面,被页面渲染产生。如新增一个用户,将用户名写成如下形式:


保存后,如果未对用户名进行过滤,第二次访问用户信息时,会弹出alert窗体。

DOM-based XSS

​ DOM的全称为Document Object Model,即文档对象模型,DOM通常用于代表在HTML、XHTML和XML中的对象。使用DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。

​ 通过JavaScript可以重构整个HTML页面,而要重构页面或者页面中的某个对象, JavaScript就需要知道HTML文档中所有元素的“位置”。而DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据DOM规定,HTML文档中的每个成分都是一个节点。

​ JavaScript重构的HTML页面,如果此中包含了恶意的脚本,便会造成DOM-based XSS漏洞。这种类型的漏洞常见的方式如下:

document.write()
document.writeIn()
xxx.innerHTML = 
xxx.outerHTL = 
innerHTML.replace
document.attachEvent()
window.attachEvent()
document.location.replace()
document.location.assign()

防御

​ 不管反射型XSS也好,存储型XSS也罢,DOM-based XSS也包括其中,其本质问题就是让对方浏览器执行你插入的JavaScript脚本。所以对于防御措施,主要有以下几种:

1、永远不要信任前端传过来的参数值,要对其进行过滤过滤再过滤。示例代码如下:

private String cleanXSS(String value) {
		value = value.replaceAll("<", "<").replaceAll(">", ">");
		value = value.replaceAll("\\(", "(").replaceAll("\\)", ")");
		value = value.replaceAll("'", "'");
		value = value.replaceAll("\"", """);
		value = value.replaceAll("eval\\((.*)\\)", "");
		value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
		return value;
	}

2、可采用合适的编码函数,如apache.commons.lang3.StringEscapeUtils中的escapeHtml4函数。

3、为Cookie加上HttpOnly标记。

以上便是对XSS漏洞的一些总结!

你可能感兴趣的:(web安全)