XSS攻击原理

针对目前日趋复杂化的web应用,web的安全问题逐渐暴露了出来。在绝大多数黑客成功攻击案例中,xss漏洞是应用最广泛、作用最关键的web安全漏洞之一。

xss漏洞的全称是:跨站脚本攻击(cross site scripting)。从首写字母命名的方式来看,应该取名css,但是这样就和层叠样式表的扩展名重名了,故取名为xss。而实际上,就连“跨站脚本攻击”这个名字本身也另有来历,仅仅是因为当时第一次演示这个漏洞的黑客是通过“跨站”的方式植入脚本进行攻击的。由于现代浏览器的“同源策略”已经让运行在浏览器中的javascript代码很难对外站进行访问了,所以,这个漏洞的名称可能存在一定的误导性,让很多初学者看了很多次都不能理解这个漏洞的原理。

xss漏洞的原理

主要是依靠一切可能的手段,将浏览器中可以执行的脚本(javascript)植入到页面代码中,从而对用户客户端实施攻击。这才是我认为在目前这个“大前端时代”xss攻击的定义。

实际上黑客攻击这种行为从本质上讲,就是想尽一切手段在别人的代码环境中执行自己的代码。

这件事情又可以分为两部分进行研究,一是如何把代码植入到对方的系统中去,二是植入进去的代码能不能被对方的系统执行。

xss漏洞是对web客户端(浏览器)的攻击,所以说植入的代码基本上以javascript和html标签(有时也有结合css样式的xss向量)为主。

xss的脚本植入方式

从web开发者的视角来看,这实际上是通过一个post接口将xss代码作为参数传入,由于这套B/S系统中刚好存在“前台接收数据存入数据库,在渲染页面时从数据库中读取相应信息”这样的逻辑,于是我们的xss代码成功植入到了这个页面中。

在现实生产环境中,我们同样可以通过get接口或是其他http接口、甚至tcp、socket等其他协议的接口将xss代码传入,然后观察其对页面内容的影响。有时,可能在A页面上面发现的某个看似简单的get接口,却可以把数据传入到B页面,C页面,甚至传到一个外网环境无法访问的“后台页”,这就是所谓的“xss盲打后台”。

xss的类型

可以分为很多种,网上的很多有关xss的资料将其划分出了很多种不同的类型。实际上,我认为xss主要可以分为:持久型xss和非持久型xss。

持久型xss就是将对客户端攻击的脚本植入到服务器上,从而导致每个正常访问页面的用户都会遭到这段xss脚本的攻击。

非持久型xss是对一个页面的url中的某个参数做文章,把精心构造的恶意脚本包装到url参数中,再将这个url散布到网上,骗取用户访问这个url,从而对其进行攻击。

散布的方式通常伴有一些美女图片、游戏外挂或是其他的一些强诱惑力的内容,而其真实目的则是为了骗取用户访问这个url。非持久型xss的安全威胁较小,因为只要服务端调整业务代码进行过滤,黑客精心构造的这段url就瞬间失效了。

而相比之下,持久型xss的攻击影响力很大,有时候服务端需要删好几张表,查询很多库,才能将带有恶意代码的数据全部清除。

通过xss能做的事情

有很多,绝大多数的网络攻击行为都是把xss作为漏洞链中的第一环。通过xss,黑客可以得到的最直接的利益就是拿到用户浏览器(或者一些类浏览器app)的cookie。由于目前web系统中实现session的办法主要是cookie,所以一旦黑客拿到了用户的cookie,就可以劫持用户的session,从而变相达到盗取用户账号的目的。

xss也使黑客可以以受害用户的ip地址向其他站点发起web攻击,因为一切的攻击脚本都可以借受害用户的浏览器执行。

以这样的方式,将xss配合起csrf、sql注入等漏洞可以在短时间内对一个服务器发起大量攻击,并且服务端无法将攻击ip封死,因为ip是成百上千的xss受害者的ip。

2015年github遭遇的大规模DDOS,实际上就是黑客以某种方式把而已脚本植入到“熊场”的广告联盟iframe中,从而对github的某些接口实施攻击,最终达到DDOS的效果。

另外,持久性xss的传播性极强,由于web的特点是轻量级、灵活性高,每个用户每天都可能访问很多web站点,每个web站点每天都有成千上万的来访。所以将xss攻击配合起一些系统内核级的漏洞,完全可能在几个小时之内击垮几百万台智能设备。

如今的xss

相比网上很多资料中,在技术上已经发生了很大变化。由于各大网站加强了对于js脚本、html标签等关键信息的过滤,单纯依靠植入javascript代码很难实施攻击。

PC端页面,一些视频类、页游网站存在大量的flash内嵌在页面中,可以尝试将flash代码植入,往往可以规避网站安全过滤。移动端页面,可以植入native代码(android系统植入java,ios系统植入oc)。