之前积累了XSS 有一段时间,因为目前开始了一件有趣的工程,需要整合非常多的知识,其中Web 安全这一块出现最多的,应该就是XSS,SQL注入了,再加上乌云泡着看别人的文章,看各家大网站的漏洞,决定把这一块知识聚拢一下,写成一篇文章。想了想,从简单到难,那就是一条打怪升级之路,所以就从最简单的反射型漏洞开始,一点一点提高,直到把大部分XSS 的形式找出来。
最简单的跨站,也就是我们说的反射型跨站,也叫作非持久型,参数型跨站脚本。这种类型的脚本出现的面非常的广,互联网上这样的漏洞非常多,一般出没在各路小站点,大站点很少出现。乌云的漏洞列表里,海量的XSS 漏洞都来自互联网上访问量不高的小站,被辛苦挖洞的XSSer 们发掘出来的。
站在新手村我们的,需要一个最简单的野怪刷一下,这个野怪上下无任何装备,没有一点防御。也就是说,这个XSS 漏洞对于用户的输入,不做任何过滤行为。
一般来说,XSS 存在的地方,一定是需要有输入和输出概念的,一般的过滤规则,也是出现在输入阶段或者是输出阶段,如果两个都没有过滤,那么很轻松的就造成了漏洞。通常来说,这种洞非常好刷,比较自动化的方式是,建立一个爬虫系统,预设一些URL,爬虫爬取网页,在网页源码中寻找用户可以输入的地方,然后在可以输入的地方,将构造好的XSS 代码以输入形式,构造成请求,然后观察响应,是否对我们的输入做了过滤策略。如果是原本的返回,那么我们就说可能存在有xss漏洞。
同时,有另一种更为简单的漏洞,是直接在URL 中,如果有直接赋值参数的行为,也相当于一个可输入的位置,我们直接在URL 中将XSS 代码构造在URL 中,观察返回是否做了过滤处理,如果没有,那么就是一个最简单的野怪诞生。
在乌云中,有不少这样的漏洞,小站很多,大站很少,因为大站一般都有完备的过滤规则,很难在这些小问题上有任何闪失,再加上如今浏览器基本上都有安全策略对此类型进行防御,所以这种威力相对较小。
之前在HTTP 的文章里,有详细讲过 URL的格式,其基本格式如此:
每个结构对应的含义如下:
通常的注入发生在query 这一块,而一般一个安全的行为,就是对query 中的字符进行过滤,以防止xss。以百度的URL 为例,一个通常的URL 查询之后的造型是下面这样的:
问号之后有一大堆参数,&用来分割参数,他们对应的是什么意思不是本文关注的重点,可以参见这一篇文章百度搜索URL 参数解析。
其中wd 就是我们所说的搜索关键词,也就是我们的输入,如果我们将此字符改成
|
|
在输出时我们看到,URL 变成了如下,可疑的部分被转义了。
|
|
在这里举一个大站腾讯的简单的xss,是乌云上某马甲提交的,作为一个最简单的XSS 挖给大家学习。网站的网址是这样的:
http://app.data.qq.com/?umod=commentsoutlet&act=count&siteid=3&libid=9&dataid=1480&score=1&func=haoping&_=1353475261886
如果我们在这个URL 里尝试修改参数,将score 参数改成
|
|
而输出的源码并没有发生变化:
在网易中看到的结果就变成了这样:
这很显然,就是一个xss漏洞了,将经典的xss 代码插入进去即可:
|
|
效果如下:
这就是一个最无防御的XSS 存在,很明显的,它简单,暴力,当然也是极容易防御的,所以在一个较高级的攻防对抗,或者是大站漏洞中,基本上不会出现这样的漏洞(然而腾讯还是有这样的问题~~)。