什么是XSS
XSS(Cross Site Script,又称CSS)跨站脚本攻击,是指攻击者利用站点的安全漏洞往Web页面里插入恶意html代码或JS脚本,当用户浏览该页时,嵌入Web里面的攻击脚本会被执行,达到攻击目的。
因为这种攻击是通过别人的网站脚本漏洞达到攻击的效果,就是说可以隐藏攻击者的身份,因此叫做跨站攻击。
(1)非持久性XSS
最直观的就是构造URL欺骗用户点击,URL中构造的参数值,没有进行任何过滤和转义处理就立即显示在页面上,另外一种情况就是在检索框中注入XSS脚本。
没有进行转义处理可能存在两种情况:
1、服务器对特定参数没有进行相应的转义处理;
2、客户端脚本直接获取URL中特定参数,没有进行转义处理直接打印在页面上。
非持久性XSS的特性:
1、非存储性:构造的恶意脚本不会保存在后端服务器
2、一次性特征:点击了构造的特定URL才会触发XSS。
例如可以将构造有XSS漏洞的URL在贴吧中发帖传播,从而可以达到攻击效果。
(2)持久性XSS
它是将攻击代码提交到了服务器端的数据库或文件系统中,不用构造URL,而是保存在文章或论坛帖子中,从而使得访问该页面的用户都有可能受到攻击。
一般需要网站有用户自输入内容的特征。所以在BBS、贴吧等发帖形式的网站中最容易出现。
持久性XSS漏洞的特征:
1、存储性:注入的恶意脚本是保存在后端数据库或者文件系统中。
2、持久性:只要用户打开注入脚本的页面,就会受到攻击,所以这种XSS的危害性更大。
(3)基于DOM操作的XSS
前两种xss攻击,都是由于服务器端程序没有对特殊字符进行转义导致的。Dom-based XSS攻击是基于JS脚本程序在操作document对象以及URL地址时不当而导致的。
一段获取浏览器参数并使用它去更新Web页面的JS代码就很容易被利用。
通常情况下:document.location、document.URL、document.referrer这几个对象最容易被利用。
例子:
<html>
<title>Welcome!</title> Hi
<script>
varpos=document.URL.indexOf("name=")+5; document.write(document.URL.substring(pos));</script>
<br/> Welcome to our system
</html>
如果浏览器传入正常的参数,则可以正确显示,但是如果有类似下面的请求时:http://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>这样的请求时,这段恶意代码就会被执行
1.模板中UI变量未进行合理字符转义
例如某个UI变量的使用应该选择转义,但是模板开发人员却忘记了转义。或者某个转义方案遗漏某些字符的转义,例如转义方案中,只对<和>进行了转义,但是却遗忘了单引号和双引号的转义。这些错误都会导致XSS的产生。
例子:
<input type="text"name="title" value="$title$"/>
其中$title$即表示标题的UI变量。模板开发人员没有正确选择的转义。这样,攻击者可以发一个title标题为如下:
"/><script>alert("xss");</script>
标题中的双引号以及尖括号都没有进行相应的转义就直接替换到模板中的UI变量$title$,直接替换的源代码如下:
<input type="text"name="title"value=""/><script>alert("xss");</script>"/>
成功地在页面中注入了JS脚本代码。
2.通过输入半个汉字来构造
可以通过输入单字节(半个汉字)来构造XSS漏洞,是由于后端程序没有对输入的数据进行字符扫描,去除半个汉字或超过GBK编码范围的字符.
例子:
<script>var v = “$title$”;</script>
由于$title$变量进行js转义(对标题中的双引号“进行转义成”),所以标题转义成:半个汉字出现在中间呢?\“;alert(1);”
又由于半个汉字“呢?”会把紧跟其后的反斜杠吃掉,所以替换到模板中的代码如下:
<script>var v = "半个汉字出现在中间呢";alert(1);"";</script>
于是,户可以写入自定义的js代码就被执行了。
3.整个标签导致的XSS漏洞
例子:
< script >
<!--
var _title = "$title:j$";
//-->
</script >
如果输入的帖子标题为:
//--></script><script>alert(document.cookie);//
由于没有整体对</script>标签进行过滤处理,</script>与前面的<script>进行了匹配
<script>
<!--
var _title ="//--></script><script>alert(document.cookie);//";
//-->
</script >
4.JS中注释导致的XSS漏洞
例子:
<script>
</ script >
JS注释中存在JS代码,并且还存在模板解析的变量
如果title变量为:*/alert("XSS");alert("XSS");
</ script >
5.通过字符集编码来构造
如果产品线对外可以开放CSS,那么攻击者可以通过上传如下代码的CSS文件,从而达到XSS攻击的效果
@charset "utf-7";a{80sec:expre/+ACoAKg-/ssion(if(!window.x){alert(/xxx/);window.x=1})}
漏洞原因:
@charset “utf-7”; 表明了css代码的编码格式为utf-7,而根据utf-7的编码规则,是由“+”开始, “-”结束的一堆代码(- 结尾非必要)。 那么 +ACoAKg- 即utf-7编码格式,经由浏览器转换成gbk之后,就变成了
**,即原来的 /+ACoAKg-/ 变成了 也就是普通的css注释了,xss自然就发生了
6.富编辑导致的漏洞
一般富编辑中需要进行如下处理:
•标签的转义:<script>、<style>等等
•关键词的过滤:javascript、exepression
如果下面的语句不处理会导致XSS产生:
style="top:expression_r(alert('XSS'));"只对IE有效style="background:url(javascript:alert('XSS'));“
•标签属性的过滤:
<img οnlοad=“alert(‘cookie’);” src=“”/>
有关富编辑器的过滤处理请参考:http://fe.baidu.com/doc/websafe/editor_xss.html
www服务依赖于Htpp协议实现,Http是无状态的协议,所以为了在各个会话之间传递信息,就不可避免地用到Cookie或者Session等技术来标记访问者的状态,而无论是Cookie还是Session,一般都是利用Cookie来实现的(Session其实是在浏览器的Cookie里带了一个Token来标记,服务器取得了这个Token并且检查合法性之后就把服务器上存储的对应的状态和浏览器绑定),这样就不可避免地安全聚焦到了Cookie上面,只要获得这个Cookie,就可以取得别人的身份,这对于入侵者是一件很美妙的事情,特别当获得的Cookie属于管理员等高权限身份者时,危害就更大了。在各种web安全问题里,其中XSS漏洞就因此显得格外危险。
熟悉导致XSS漏洞的起因和常见XSS攻击方式,排查代码。使用标准的机制去验证用户输入内容的长度、类型、语法和商业规则,然后才将它们显示或保存到数据库中。不能仅仅依赖于客户端验证数据的合法性。因为攻击者会绕过客户端验证,直接构造恶意URL或数据包,所以要在服务器端对数据进行严格验证,在页面上输出要客户提交的内容时,进行正确编码。
虽然有很多工具可以帮助我们进行漏洞检测,但是工具是死的,攻击者是活的,攻击方法也曾出不穷。所以我们不能完全依赖工具,应该采用手工测试和自动检测相结合的手段。
必须在Code Review工作中关注代码的安全性,排查并优化代码,从源头上控制漏洞的产生,防患于未然。
如果应用必须支持用户提供的HTML,需要确认接收的HTML内容被妥善地格式化,仅包含最小化的、安全的tag,绝对不允许JavaScript代码出现,去掉任何对远程内容的引用(尤其是样式表和JavaScript)。
RatProxy Google的开源XSS检测工具。下载地址:http://code.google.com/p/ratproxy/
Paros proxy
一个基于Java的网页程序漏洞评估代理,它包含有网页通讯记录器、Web spider和一个常用网页程序攻击扫描器,可以检测SQL注入和跨网站脚本等。
TamperIE
一款非常优秀的可以截取并修改客户端 Post和Get请求的软件,通过它可以在浏览器发出请求前允许修改数据,从而绕过客户端的脚本验证。通过它,借助已有的XSS测试语句,就可以构造恶意 URL来测试Web页面的XSS漏洞。
SQL & XSS Finder
一个网站检测工具,可以构造SQL和XSS注入语句,提供了常见的语句,并将语句最终的执行效果展现在浏览器中,通过它能发现Web页面是否具有常见的XSS漏洞,是一款简单的XSS漏洞检测辅助工具。
WebInspect,Acunetix WebSecurity Scanner,AppScan等等。