XSS攻击的原理、分类和防御方法

一.XSS攻击的原理

XSS的原理是WEB应用程序混淆了用户提交的数据和JS脚本的代码边界,导致浏览器把用户的输入当成了JS代码来执行。XSS的攻击对象是浏览器一端的普通用户。

二.XSS攻击的分类

1.反射型XSS

反射型XSS,又称非持久型XSS。也就是攻击相当于受害者而言是一次性的,具体表现在受害者点击了含有的恶意JavaScript脚本的url,而Web应用程序只是不加处理的把该恶意脚本“反射”回受害者的浏览器而使受害者的浏览器执行响应的脚本。

2.存储型XSS

存储型XSS,也就是持久型XSS。攻击者上传的包含恶意js脚本的留言等信息被Web应用程序保存到数据库中,Web应用程序在生成新的页面的时候如果包含了该恶意js脚本,这样会导致所有访问该网页的浏览器解析执行该恶意脚本。这种攻击类型一般常见在博客、论坛等网站中。

3.DOM型XSS

DOM,全称是Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构和样式。

DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞,而且不需要与服务器进行交互。

客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。

三、XSS攻击的主要途径

SQL注入的事件已经是上个世纪最令人头疼的攻击方法,21世纪又出现了HTML注入漏洞,随着web飞速的发展,XSS漏洞已经不容忽视,简单介绍一下XSS漏洞, 只要有用户输入的地方,就会出现XSS漏洞,例如在发表一篇帖子的时候,在其中加入脚本。

1.HTML标签注入:

   

很简单,就是用alert输出一个Hello World文本,如果在帖子内容里,出现了这样的语句,浏览器会执行这个脚本:

image.png

很多网站为了避免XSS的攻击,对用户的输入都采取了过滤,最常见的就是对<>转换成<以及>,经过转换以后<>虽然可在正确显示在页面上,但是已经不能构成代码语句了。这个貌似很彻底,因为一旦<>被转换掉,什么就会转换成“”,不能执行,因此,很多人认为只要用户的输入没有构成<>,就不能闭合前后的标签,其语句当然也不会有害,但是,万事总有可能,只要有一定的条件,我们就可以构造经过编码后的语句来进行XSS,稍候我会提到16进制、8进制转换,以及混合转换。

2. HTML属性注入

于是程序员想办法封堵这个漏洞,过滤了 标签,那么在页面上就不会执行这段js代码,

于是乎,黑客想了一个不用标签转换成10进制 ASCII转义字符:

<script>alert("Hello world");</script>";

接下来,使用URL编码得到:

%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%48%65%6C%6C%6F%20%77%6F%72%6C%64%22%29%3B%3C%2F%73%63%72%69%70%74%3E

然后放入到参数中:

http://www.test.com/a=%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%22%48%65%6C%6C%6F%20%77%6F%72%6C%64%22%29%3B%3C%2F%73%63%72%69%70%74%3E

接着程序员用JSP得到参数

<% string str_a = rrequest.getParameter("a");%>

var a= <%=str_a%>

document.write(a);

同样会引发XSS漏洞

4. ASCII 16进制转换

格式: &#x(ASCII16进制编码);

与10进制ASCII转义一样,只不过换了一种进制规则表示

5. ASCII 8进制转换

其实16进制还有一种表现形式,与8进制类似

格式:\x(ASCII 16进制编码)

格式:(ASCII 8进制编码)

例如:

转换为16进制是:

\x3C\x73\x63\x72\x69\x70\x74\x3E\x61\x6C\x65\x72\x74\x28\x22\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x21\x22\x29\x3B\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E

八进制是去掉\后的x,数值转换为8进制数值即可,我就懒的自己转了,有兴趣大家可以试试

同样以构造URL参数,或者HTML属性的形式注入到HTML当中,即可产生XSS漏洞

6. 8进制、10进制、16进制混合转换

道理一样,只不过一段代码中的进制数混合,自由构造,组合比较多

7. 加入混淆字符

这样做的目的还是为了绕开程序员代码的过滤, 其中加入一些混淆转义字符,在系统控制字符中,除了头部的�(null)和尾部的�(del)外,其他31个字符均可作为混淆字符,比如、等字符都可插入到javascript或vbscript的头部,其中Tab符 、换行符、回车符还可以插入到代码中任意地方, 当然还包括字母的大小写混合;

这里我摘抄了网上的一些例子:

例1: '/插入到代码头部,其中可写成,效果一样
例2: '/插入到代码中任意位置,其中 可写成

例3: '/ 是回车符的16进制形式

例4: '/ 是换行符的16进制形式

例5:workbench/login_light?from=1234%27;prompt(1);//

四.XSS攻击的防御方法

1.对输入(和URL参数)进行过滤,对输出进行编码。

对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分XSS攻击。

为了避免反射式或存储式的XSS漏洞,最好的办法是根据HTML输出的上下文(包括:主体、属性、JavaScript、CSS或URL)对所有不可信的HTTP请求数据进行恰当的转义。

在客户端修改浏览器文档时,为了避免DOM型XSS攻击,最好的选择是实施上下文敏感数据编码。

2.使用内容安全策略(CSP)是对抗XSS的深度防御策略。

你可能感兴趣的:(XSS攻击的原理、分类和防御方法)