前些时间准备面试的时候一直会遇到这个XSS,寥寥几句话好像很简单,后来看到同学的《XSS跨站脚本攻击剖析与防御》这本书,稍微翻看了一下,其中的学问还是挺多的。这系列的文章就当做读书笔记吧。
什么是XSS
听过很多道理,当然很多人都已经知道XSS是个啥,跨站脚本(Cross-Site Scripting),由于它前面有个老大哥CSS摆在那儿,就只能叫XSS了。官方是这么说的"A cross-site scripting vulnerability may be used by attackers to bypass access controls such as the same-origin policy."“一种可能会被攻击者用来 通过 比如同源策略 来获取用户权限的跨站脚本。”
通俗点来说,比如你在浏览百度的时候,假设百度没做任何安全策略(当然这是不可能的),攻击者对百度的登陆按钮做了点修改,你登陆的时候,它把你登陆的信息都发送到攻击者那儿去了,GG,2个T的学习资料没了。这还算好的,给你的花旗银行网站来个这玩意,2个亿没了。
XSS的分类
反射型XSS
也叫做非持久性、参数性跨站脚本,顾名思义,攻击者制作了一个含有恶意代码的url,比如
http://www.test.com/search.ph...="><script>alert("xss")</script>
(这个算恶意比较小的,要是在里面获取你的cookie
然后攻击者给你发了个链接,“大胸妹妹正在直播,邀请您观看。”
大家可以搭个DVWA自己玩一下嘛,别的漏洞也有,就是别用太高级的浏览器,这时候深恶痛绝的IE就该上场了,时候表演真正的技术了。
“我不服,就这URL我还不一眼就看出来有毛病?”
“http%3A//www.test.com/search.php%3Fkey%3D%22%3Cscript%3Ealert%28%22xss%22%29%3C/script%3E%22,继续装逼。”
持久型XSS
相当于存储型跨站脚本。
来看看有什么效果(想想还有点小激动呢)
当然了这不是你的锅,但如果这个网站是你搭的,那你等着GG吧。如果这个玩意儿一直没有被搞掉,而攻击者给你来了10000个这样的评论,每一次刷新后都会来10000下,想想会发生什么吧。
XSS构造剖析
绕过XSS-Filter
当然大部分的程序员儿是不会像我这么挫的,正常情况下基本都会在Web应用中设计一个XSS Filter,一些白名单、黑名单什么的来过滤掉大胸妹。那有没有能过滤掉所有大胸妹的Filter呢?
我们有很多绕过Filter的方法:
1)利用<>标记注射代码
前面我们写的大胸妹,哦不是,代码都是这样的,不多说了。
2)利用HTML标签属性执行XSS
<table background="javascript:alert(/XSS/)"></table>
<img src="javascript:alert('XSS')">;
这玩意儿呢对我们这些使用Canary、Nighty的人来说是没有任何威胁的?,当然对一些非功能需要还在使用IE6的山顶洞人还是有点威胁的。
3)空格回车Tab
加入你在你的黑名单里加了'javascript',然后说这下没办法来写脚本了吧。对不起,没用。<img src="java script:alert('XSS')">
再次GG。这玩意儿涉及到一点js和浏览器引擎解析的问题。我们知道
var a = daxiongmei
var b = "kan na ge daxiongmei"
这样虽然没有分号不像我们这些规范的程序员的编程习惯,但它是没毛病的而且很Geek,那这样呢?
var a
= 'kan na ge daxiongmei;
alert(a);
也是可以的!因为引擎并不会把换行符看成一个完整语句的终点(上面的可以是因为引擎已经意识到一个完整的语句了),它会继续处理后面发现的内容,知道一个分号出现或者这个语句变成一个完整的语句。
4)对标签属性值转码
那我处理输入的时候.split(" ").join("")
行了吧,对不起还是不行。
还记得大写字母A的ASCII码是多少吗,不记得先向你的老师说声对不起又还给您了。
说正事,HTML是支持ASCII码形式的。我们把上面的代码换成这样。
<img src="javascript:alert("XSS")>;
GG
所以最好把这些字符也给过滤了吧。
5)产生自己的事件
这个和上面的第二点有点类似,只不过这次把属性换成事件,像这样:
<img src="#" onerror=alert(/xss/)>
onerror
换成onclick
,onblur
什么都是可以的。
6)利用CSS跨站
CSS也可以用来跨站,想的起来是什么吗?方式还挺多的
<div style="backgroun-image:url(javascript:alert('XSS'))"></div>
或者用@important引入,引入文件写个xss,就是这么简单。你说我们名字简写都一样的,相煎何太急呢。
利用字符串编码
其实之前我们已经几次提到了用字符串编码来绕过Filter的方法,由于js支持Unicode、escapes、十六进制、八进制等编码,还有很多加密编码,防止XSS变得很麻烦,心累。
拆分跨站法
可能有的同学要想好事儿了,你每次攻击我都要写那么长的代码,我限制你个字符输入字数为比如30个不就行了吗,你写两个script标签都要17个字符了。Naive
<script>z='document.'</script>
<script>z=z+'write('</script>
...
<script>eval(z)</script>
GG
Shellcode的调用
有几个概念我们先来了解一下。
【Shellcode】
这玩意儿呢一开始是指溢出程序和蠕虫病毒的核心,其实看单词就能看出来了,就是一个利用漏洞执行时的代码。在咱么这儿呢,就是指XSS利用代码。
【Exploit】
翻译:利用。这玩意我我不知道怎么解释,“通常表示完整编写好的漏洞利用工具”,总之记住Exploit往往包含了Shellcode。
payload、shellcode、exp、poc怎么区别?
【POC】
Proof of Concept,是一段证明漏洞存在的程序代码片段。
动态调用远程JavaScript
其实这和JSONP有点类似,在url后面跟个script标签,标签里引入远程的js文件,这文件不是个好东西,恩差不多就是这样。
使用window.location.hash
知道location.hash获取什么吗?比如我们有个url:http://domain/#admin, location.hash获取的就是'#'后面的东西,这里就是admin。那location.hash怎么用到我们的XSS里面呢?
http://www.bug.com/veiw.php?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')"
应该都能看懂我就不多说了啊。
XSS Downloader
介绍另外一种存储和调用Shellcode的方法,把它存储到网站的数据库中个,然后再把它下载下来执行。简单说呢,就是我们写了个XSS的下载器,把这个下载器放在网站的某个页面,再用Ajax什么的来向这个网站发送请求,执行了返回的数据,返回的是啥?Shellcode。
备选存储技术
浏览器的存储技术有哪些?相信经过校招的同学都应该不陌生。Cookie、Flash、UserData、localStorage等。既然这些玩意儿都能存储数据,那Shellcode呢,当然也可以。
好了第一章就到此结束了。本来说的只用1天完成的,没想到各种事儿拖了两天,enjoy。当然肯定大部分都不enjoy的,欢迎提意见。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。