1

前些时间准备面试的时候一直会遇到这个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呢?sorryno.jpg

我们有很多绕过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="javascrip&#116&#58alert("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的,欢迎提意见。


loebmraz
1.1k 声望8 粉丝

最肯忘却古人诗,最不屑一顾是相思。