一.什么是XSS攻击
1.1XSS简介
在web安全的领域中,xss攻击是最常见的一种攻击方式。xxs攻击的全称是Cross Site Scripting即跨站脚本,当目标网站的目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并且执行的时候,xss攻击就发生了。总的来说,它是一种代码注入攻击,攻击者在目标网站注入恶意脚本,使其在用户的浏览器运行,利用这些恶意脚本,来盗取用户的敏感信息如cookie等,进而危害数据安全。
1.2XSS攻击原理
xss漏洞产生的主要原因是由于程序对输入和输出的控制不够严格,导致构建的恶意代码输入后,在前端浏览的时候被当作有效的代码解析执行从而产生危害。XSS攻击的重点不在于跨站,而在于脚本的攻击。
二.XSS攻击的分类
根据攻击的来源,可以分为反射型,DOM型,存储型XSS攻击。
2.1.反射型XSS(非持久型XSS)
2.1.1反射型XSS攻击原理
反射型XSS的攻击方式的注入代码是目标服务器通过错误信息,搜索结果等方式“反射”回来的,发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后相应,XSS代码随着响应内容一起返回到浏览器端,浏览器解析执行XSS代码。这个过程像一次反射,故称为反射型XSS。由于这种攻击具有一次型,由于代码注入的是一个动态产生的页面而不是一个永久的页面,所以这种攻击只有在点击链接时才产生作用,所以也称为非持久型XSS攻击。
2.1.2反射型攻击过程
攻击者构造了一个包含恶意字符串的URL并且将其发送给用户---------->攻击者诱导用户发起这个恶意URL请求---------->网站在响应中引入这个恶意字符串----------->用户的浏览器执行响应中的恶意脚本,把用户的cookies信息发送给攻击者的服务器。
2.1.3反射型XSS攻击位置
用户登录入口,网站搜索框等。
2.1.4漏洞原因
1.将不可信的数据插入到HTML标签之间;
2.将不可信的数据插入到HTML属性中;
3.将不可信数据插入到SCRIPT中;
4.将不可信的数据插入到style属性当中,也具有一样的危害性
5.将不可信的数据插入到HTML的URL中
2.2.存储型攻击(持久型)
2.2.1存储型攻击原理
存储型xss是将攻击脚本永久地嵌入某一个页面中,当用户访问的时候就会触发执行,从而用户受到相关的攻击,并且该类型的攻击主要发生在服务端,所有用户访问该页面都会受到相应的攻击,所以也称为持久性XSS攻击。
2.2.2存储型攻击过程
攻击者利用网站的一个表单,将恶意字符串插入到网站的数据库中------->用户向网站请求页面-------->网站在响应中引入恶意字符串,并将其发送给用户---------->用户浏览器执行响应中的恶意脚本,并把受害者的cookies发给攻击者服务器。
2.2.3攻击位置
论坛,博客,留言板,评论区等交互区。
2.3 DOM型
2.3.1原理
DOM全称Document Object Model,是一个与平台,编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容,结构和样式,处理后的结果能够成为显示页面的一部分。由于DOM型XXS不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,大部分属于反射型。
2.3.2攻击过程
1.攻击者构造一个包含恶意字符串的URL发送给用户
2.攻击者诱导用户发起这个URL请求
3.网站收到请求,但是不会在响应中引入该恶意字符串
4.用户浏览器执行响应中的合法脚本,就导致恶意脚本被插入到页面中
5.用户浏览器执行插入到页面中的恶意脚本,将用户的cookies信息发送给攻击者服务器
2.3.3攻击实例
<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "<img
src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>
在上述实例中, submit的按钮调用了xsstest()函数,而在xsstest()函数中修改了dom节点,通过innerHtml把用户数据当作HTML写入页面中,造成了DOM Based XSS.
2.3.4攻击位置
基于DOM的XSS漏洞是不需要与服务器端交互的,所以,它只会发生在客户端处理数据的阶段.
三.XSS攻击总结
3.1XSS攻击手段和目的:
1.盗用cookie,获取用户的敏感信息;
2.利用iframe,frame等方式,以用户的身份执行一些管理动作,或者执行一些一般的行为比如说发私信,加好友等;
3.在一些访问量极大的页面上进行XSS攻击可以攻击一些小型网站;
4.利用一些可被攻击的域或者其它的域信任的特点,以受信任来源的身份请求一些平时不被允许的操作。
四.如何防御XSS攻击
整体思路:对于用户输入的内容以及访问的URL过滤,对输出内容进行编码,简单来说就是将用户提交的所有内容都进行过滤,排除关键字,敏感内容,对URL的参数也进行一定的过滤,并且对动态输出到页面的内容都进行html编码,转换成html实体,使其用户输入的恶意代码无法在浏览器中执行。
4.1内容过滤
4.1.1白名单过滤
白名单过滤通过对允许放行的内容进行过滤,在这种情况下基本可以杜绝很多的XSS攻击,但是在现实环境中,可能会造成误拦截。
4.1.2黑名单过滤
黑名单过滤是对相关的关键字进行拦截,黑名单输入可能会杜绝绝大多数的XSS攻击,但是存在可能被绕过的可能。
4.2设置http only属性
在服务器端中设置会话cookie的HTTP only属性,这样客户端的脚本就不能获取cookie信息。
4.3明确输入内容
对用户输入的内容进行类型明确,比如个人信息电话或者邮箱地址等位置都过滤一些不符合的内容。
4.4输入内容长度控制
对于不可信的内容都应该进行长度控制,比如控制电话号码的输入长度,这种防御主要是增加XSS攻击的难度。
4.5客户端分层防御策略
客户端跨站脚本攻击的分层防御策略是基于独立分配线程和分层防御策略的安全模型,它建立在客户端(浏览器),这是它与其它模型最大的区别,客户端在接受服务器信息时,选择性执行相关的内容,这样就使防御XSS攻击变得更容易。