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中的反引号`过滤为空(非空格)或编码为`。在标签的属性中引入$var。场景四
在
JavaScript动态生成HTML标签中,注意以下几种使用方法:
在标签内容引入$var。
<script>varhtml='<div>titleis"$var".</div>';document.write(html);//或node.innerHTML=html;</script>
<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编码的。
相关文章推荐
- Openstack 使用
- 《大道至简》读书笔记 第1篇
- 03链栈_LinkStack--(栈与队列)
- Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
- ios app应用中在AppDelegate设置全局变量
- BAE添加部署后使用git上传代码遇到的问题
- [倚天屠龙记] vim 查找与替换(简单替换)
- QT编写的嵌入式工业控制系统
- 电脑网络设置
- 2015.05
- leetcode--Anagrams
- TechParty-IOS与iwatch专题沙龙笔记
- VTK轮廓提取
- 第十四周项目1(4)-小玩文件
- 02两栈共享空间_DoubleStack--(栈与队列)
- 关于 AppDelegate 、UIApplication 简单的用法
- 算法导论实验四_分治法求平面上的最小点对
- 每日一题F
- 黑马程序员——Java基础---集合(Collection和List)
- 01顺序栈_Stack---(栈与队列)