跨站脚本攻击(Cross
Site Scripting)。这是一种将恶意Javascript代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。自1996年诞生以来,如今已经历十多年的演化。由于和另一种网页技术-层叠样式表(Cascading Style Sheets,CSS)的缩写一样,为了防止混淆,故把原本的CSS简称为XSS。在各种WEB应用安全漏洞中,XSS跨站脚本攻击漏洞一直被OWASP(Open Web Application Security Project)组织评为十大应用安全之一。
流程
以博客留言板为例:
用户一般都是按照正常的语言文字在留言板进行留言。假如有一个攻击者,别有用心,反其道而行之,留言不再是一段正常的文字,而是输入了一串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漏洞。
反射型XSS其基本思想就是依靠站点服务端返回脚本,在客户端触发执行从而发起Web攻击。例如,在搜索框中输入如下脚本:
<script>alert(0)</script>
点击搜索,页面弹出alert对话框。
存储型XSS
存储型XSS又被称为持久性XSS,存储型XSS是最危险的一种跨站脚本。允许用户存储数据的WEB应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当再次访问页面时,这段XSS代码被程序读取响应给浏览器,造成XSS跨站攻击。
与反射型不同的是,存储型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漏洞的一些总结!