您的位置:首页 > 其它

XSS的一些总结(原理+检测+防御)

2015-06-06 16:12 323 查看


0x00XSS简述


原理介绍

跨站脚本漏洞(XSS)是一种将恶意JavaScript代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。Web应用软件将用户的交互信息没有作有效验证和过滤就输出给了其他用户,攻击者插入的可执行脚本就可能形成跨站脚本攻击。

XSS可用于触发各类攻击,如:盗取cookie、帐户劫持、拒绝服务攻击等。

跨站脚本攻击又分为反射型XSS、存储型XSS以及DOM型XSS。


产生场景

数据通过一个不可信赖的方式进入Web应用软件,最常见是一个网络请求,或是其它用户可控的输入点

在未检验包含数据的动态内容是否存在恶意代码的情况下,便将其传送给Web用户


0x01XSS测试思路


基本思路

寻找可能的输入点
发送畸形的输入,看程序是否返回异常的结果


可能的输入点

URL中的参数
HTTP头中可控的部分
Cookie内容
表单
数据库
配置文件
其它可被用户输入控制的地方


0x02XSS通用解决方案

解决XSS安全问题最基本的两条原则:

用户输入的内容,过滤其中的特殊字符,如",',<,>,&
输出给用户的内容,对其中包含的特殊字符进行转义,如<转为<>转为>

如果web应用要与数据库进行交互,则需要遵循下面的原则:

对存入数据库的内容进行合法性验证

对于存入的文本过滤掉",',<,>,&等特殊字符

对于URL字段判断URL格式合规性

对于email字段判断email格式合规性

对从数据库取出的内容进行输出转义

另外,为了防止DOM-XSS

的出现,一般禁止在JavaScript中滥用eval()、.innerHTML等函数。


0x03特定场景下XSS的安全防范

下面将列举几个常见的XSS漏洞形成场景,以及在这些场景下应当遵循的安全编码规范。($var代表用户的输入)


场景一

通过JavaScript从Cookie、URL、页面或数据库中获取数据,然后在页面上展示。

<divid="test"></div><script>vara=location.href;varb=document.cookie;document.getElementById("test").innerHTML=b;</script>


从Cookie、URL、页面或数据库中获取的数据,有可能包括恶意攻击的代码;
在展示之前,需要使用JavaScript编写转义函数,将获取的数据中的",',<,>,&进行HTML转义。


场景二

通过JavaScript对目标字符串进行HTML编码或解码。

<script>functionhtmlDecode(strEncodeHtml){vardiv=document.createElement('div');div.innerHTML=strEncodeHtml;returndiv.innerText;}htmlDecode($var);</script>


此种写法隐含着DOMinnerHTML节点的建立。若执行htmlDecode('<imgsrc=#>'),虽然最终的结果是建立了节点,但在建立过程中已经执行了
onerror代码。
这里应该使用replace等替换方法进行编码或解码。


场景三

通过JavaScript获取DOM元素的innerHTML内容,增改后重新输出到innerHTML中。

copying-innerHTML:x.innerHTML=y.innerHTML+…

若y.innerHTML存在HTML标签,则需在赋值到x.innerHTML前,过滤y.innerHTML里的反引号`为空。

<divid="test">$var</div><script>document.getElementById("test").innerHTML=document.getElementById("test").innerHTML</script>


浏览器中y.innerHTML取值时,会对y中的值做预先解析,比如把`解码为`。
IE下存在一个特性,反引号`可作为标签属性的定界符。且IE在copying-innerHTML时,会对y.innerHTML里标签的相关属性(如title、alt等)的值做预“简化”处理。如其值中不包含空格、单双引号等控制符,则去掉该属性值两边的引号。
若$var的内容为:

<imgsrc=#title="`test`onerror=alert(/xss/)">


实际上最终document.getElementById("test").innerHTML的内容成为:

<imgsrc=#title=`test`onerror=alert(/xss/)>


从而产生XSS。此场景下应该把y.innerHTML中的反引号`过滤为空(非空格)或编码为`。

场景四


JavaScript动态生成HTML标签中,注意以下几种使用方法:

在标签内容引入$var。

<script>varhtml='<div>titleis"$var".</div>';document.write(html);//或node.innerHTML=html;</script>
在标签的属性中引入$var。
<script>varhtml='<ahref="$var">test</a>';document.write(html);//或node.innerHTML=html;</script>
在标签的事件中中引入$var。
<script>varhtml='<inputtype="button"onclick="add('+$var+')">';document.write(html);//或node.innerHTML=html;</script>
以上各类情况,都要确保对特殊字符有正确的转义。
-<转成`<`
->转成`>`
-'转成`'`
-"转成`"`

场景五

$var变量是一个JSON对象,对其进行解析输出。
<script>varj={'src':$var,'height':200}varhtml='<imgsrc='+j['src']+'width=200height='+j['height']+'>';document.write(html);//或yyy.innerHTML=html;</script>
要确保特殊字符有正确的转义。
-<转成`<`
->转成`>`
-'转成`'`
-"转成`"`

场景六

JSON类型的数据,Response头部contentType的设置,必须设为text/javascript;避免contentType未设置或者设置为text/html。

场景七

AJAX异步提交中,URL的参数由用户提交。
<script>varname=$var;varurl='http://taobao.com/jump?name'+name;varajax=newAjax.Request(...);</script>
变量name需要使用encodeURIComponent进行编码:
<script>varname=encodeURIComponent($var);</script>
注意:encodeURIComponent是以UTF-8编码的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: