一、简介
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
二、攻击产生原理
HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,<title>与</title>之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。
三、攻击类型
XSS分为:存储型 、反射型 、DOM型XSS,
反射型XSS:反射型跨站脚本(Reflected Cross-Site Scripting)是最常见,也是使用最广的一种,可将恶意脚本附加到 URL 地址的参数中。反射型 XSS 的利用一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
存储型XSS:存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie。
DOM型XSS:传统的 XSS 漏洞一般出现在服务器端代码中,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。 所以,受客户端浏览器的脚本代码所影响。客户端 JavaScript 可以访问浏览器的 DOM 文本对象模型,因此能够决定用于加载当前页面的 URL。换句话说,客户端的脚本程序可以通过 DOM 动态地检查和修改页面内容,它不依赖于服务器端的数据,而从客户端获得 DOM 中的数据(如从 URL 中提取数据)并在本地执行。另一方面,浏览器用户可以操纵 DOM 中的一些对象,例如 URL、location 等。用户在客户端输入的数据如果包含了恶意 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到基于 DOM 的 XSS 攻击。
四、
XSS的攻击载荷
1.标签
<script>标签:<script>标签是最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中
<body>标签:可以使用onload属性或其他更加模糊的属性(如属性)在标记内部传递XSS有效内容background
<iframe>标签:该<iframe>标签允许另一个HTML网页的嵌入到父页面。IFrame可以包含。JavaScript,但是,请注意,由于浏览器的内容安全策略(CSP),iFrame中的JavaScript无法访问父页面的DOM。然而,IFrame仍然是非常有效的解除网络钓鱼攻击的手段。
<input>标签:在某些浏览器中,如果标记的type属性<input>设置为image,则可以对其进行操作以嵌入脚本。
<link>标签:<link>标签,这是经常被用来连接外部的样式表可以包含的脚本。
<table>标签:可以利用和标签的background属性来引用脚本而不是图像。
<div>标签:该<div>标签,类似于<table>和<td>标签也可以指定一个背景,因此嵌入的脚本。
<object>标签:该<object>标签可用于从外部站点脚本包含。
<img>标签:该标签可以通过对img响应传递有效内容。
此外,还有诸如<p>标签,<a>标签,<svg>标签,<dev>标签,<tag>标签,<details>标签,<sryle>标签等等都可能成为XSS攻击可利用有效载荷。
2.事件
1、onmouseenter:当鼠标进入选区执行代码
2、onmouseleave:当鼠标离开选区执行代码
3、onmousewheel:当鼠标在选区滚轮时执行代码
4、onscroll:拖动滚动条执行代码
5、onfocusin:当获得焦点时执行代码
6、onfocusout:当失去焦点时执行代码
7、onstart:当显示内容时执行代码
8、onbeforecopy:选中内容后右键执行代码
9、onbeforecut:选中内容后右键执行代码
10、onbeforeeditfocus:当获得焦点时执行代码
11、onbeforepaste:选中内容后右键执行代码
12、oncontextmenu:鼠标右键执行代码
13、oncopy:鼠标右键执行复制时执行代码
14、oncut:鼠标右键执行剪切时执行代码
15、ondrag:选择内容并拖动时执行代码
16、ondragend:选择内容并拖动松开鼠标执行代码
17、ondragenter:选择内容并拖动时执行代码
18、ondragleave:选择内容并拖出边框执行代码
19、ondragover:选择内容并拖动时执行代码
20、ondragstart:选择内容并拖动时执行代码
21、ondrop:有内容被拖动进来时执行代码
22、onlosecapture:选择内容时执行代码
23、onpaste:粘贴时执行代码
24、onselectstart:选择内容时执行代码
25、onhelp:进入焦点按F1时执行代码
26、onEnd:当时间线执行完毕时执行代码
27、onBegin:当时间线开始执行代码
28、onactivate:激活当前标签时执行代码
29、onfilterchange:当滤镜改变时执行代码
30、onbeforeactivate:当激活当前标签时执行代码
31、onbeforedeactivate:当标签内值改变时执行代码
32、ondeactivate:当标签内值改变时执行代码
五、XSS攻击危害
1.Cookie窃取
攻击者可以通过alert(document.cookie)来获取用户的cookie信息,从而登录到用户的账户。
2.会话劫持
客户端和服务端通过标识符来识别用户身份和维持会话,但这个标识符也有被其他人利用的可能。会话劫持的本质是在攻击中带上了 Cookies 并发送到了服务端。
3.钓鱼
把当前页面重定向到一个钓鱼页面。攻击者往往会伪造一个登录页面,用户输入用户名和密码时则会被攻击者获取并利用。
4.网页挂马
一般都是通过篡改网页的方式来实现的,如在 XSS 中使用 <iframe> 标签。
5.DOS与DDOS
注入恶意 JavaScript 代码,可能会引起一些拒绝服务攻击。
6. XSS蠕虫
XSS蠕虫是指一种具有自我传播能力的XSS攻击,杀伤力很大。引发XSS蠕虫的条件比较高,需要在用户之间发生交互行为的页面,这样才能形成有效的传播。一般要同时结合反射型XSS和存储型XSS。
7.XSS结合CSRF
CSRF(Cross-site request forgery)跨站请求伪造,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。这种攻击方式触发条件比较苛刻,需要用户在访问一个网页后(该网页的cookie等信息还未失效)访问攻击者布置的站点,此时用户会向之前访问的站点发送攻击者请求的信息,而服务器会认为这个请求是用户主动发送的,不会进行拦截,简单说就是骗取用户信任,向服务器发送恶意请求。
XSS结合CSRF是攻击者常用的攻击方式,触发XSS的条件比CSRF的条件低的多,当用户触发了一个XSS后,该XSS可以指向用户布置的CSRF站点,从而达到恶意攻击的目的。
六、XSS攻击防护
1.输入过滤
对<a>、<img>等标签、onload、onerror等事件进行过滤,降低XSS风险
2.编码
对一些常见的符号,字符串编码类型,如<>在输入的时候要对其进行转换编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。
3.设置HttpOnly
如果在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。
XSS攻击的危害是巨大的,一直高居OWASP TOP10,XSS攻击主要是由程序漏洞造成的,要完全防止XSS安全漏洞主要依靠程序员较高的编程能力和安全意识,当然安全的软件开发流程及其他一些编程安全原则也可以大大减少XSS安全漏洞的发生。