什么是XSS跨站攻击
css(Cross Site Script),又叫XSS跨站脚本攻击。它指的是恶意攻击者往Web页面的html代码中插入恶意的ActiveX、HTML、JAVAScript、Flash或VBScript脚本,当用户访问该页之时,嵌入Web里面的代码会被执行,窃取过此用户信息、改变其设置、破坏用户数据,从而达到恶意攻击用户的特殊目的。
XSS在多数情况下对web程序和服务器的运行不会造成影响,但严重威胁了客户端的安全,主要源于服务器对用户提交的数据过滤不完整。
跨站脚本攻击属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。现在为了规避风险且节约安全检测成本,一般企业会选择联系具备资质的IDC服务器提供商购买或租用云WAF或高防IP服务,能够从根源上阻拦所有的web攻击(包括XSS跨站脚本攻击)。
尽管XSS劫持是一种不容易被web设计者重视的攻击方式,单XSS代码甚至不符合图灵完备的语言,但因为引发攻击的方式并不困难(不需要依赖JavaScript),攻击者可以利用XSS作为工具记录用户的密码等信息,因此也会被黑客当作攻击方式的选择之一。
传统的XSS跨站利用方式,一般都是由攻击者先构造一个跨站网页,然后在另一空间里放一个收集Cookie的页面,接着结合其它技术让用户打开跨站页面以盗取用户的Cookie,以便进一步的攻击。
对于这种方式而言,即便攻击者收集到了Cookie,也未必能进一步渗透进去,毕竟随着网络安全意识的提高,现在多数的Cookie里面的密码都是经过加密的。如果想要Cookie欺骗的话,同样也要受到其它的条件的限约。比较成熟的方法是通过跨站构造一个表单,表单的内容则为利用程序的备份功能或者加管理员等功能得到一个高权限。
作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的。
XSS攻击一般包括三个核心组成部分:攻击者、目标服务器、受害者浏览器。
在网络安全意识还远远跟不上互联网发展的时代,有些服务器并不要求对用户的输入进行安全方面的验证,这时攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码。当受害者的浏览器访问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍。而此时,攻击者的目的就已经达到了。
2018年,谷歌安全工程师Ruslan Habalov在其博客上透露,他分别在火狐和Chrome等浏览器上发现了一个可以泄露跨站源框架视觉内容的旁路攻击。发现此攻击的同时还有德国的渗透测试工程师和另一名安全研究员。
该漏洞归因于2016年CSS3 Web标准中引入的名为“mix-blend-mode”的特性,允许Web开发人员将Web组件叠加在一起,并添加控制其交互方式的效果。为展示此漏洞,研究人员造访了一个恶意网站,发现可以利用跨域iframe获取用户的Facebook资料,包括照片和用户名等信息,整个过程不需要与用户有额外的互动。
Habalov 在文中解释称,在启用 “mix-blend-mode” 时,攻击者可以利用 DIV 元素的层叠来覆盖目标对象的浮动框架(iframe),浏览器渲染此一层叠的时间会根据浮动框架内的像素颜色而有所不同,最后在浮动框架中移动该DIV层叠,强迫重新渲染并测量个别的渲染时间,即有可能算出浮动框架的内容。经过测试,大概20秒左右就能拿到用户的ID,5分钟左右就能拿到模糊的个人资料和图片。
据悉,受影响的浏览器主要是火狐和Chrome,IE和Microsoft Edge不受影响是因为它们不支持mix-blend-mode,Safari由于采用的是矢量化的实现方式也不受影响。
XSS攻击样例:
很多登陆界面都有记住用户名、密码的功能,方便用户下次登录,有些网站是直接用明文记录用户名、密码。
攻击者通过账户登陆页面,使用简单工具查看cookie结构名称后,如果网站有xss漏洞,那么简单的利用j5onp就可以获取其它用户的用户名和密码了。
利用几句简单的JavaScript,在用户浏览器执行第三方黑客工程的js文件,获取了cookie中的用户密码并发起一个黑客工程的Http url请求,这样黑客工程就获取了用户的账号密码。
这时,用户自己登录了论坛,而黑客提供了一个被伪装的链接,一旦点击该链接就会在论坛上发起一个Http url请求,即将表单信息进行提交。
或者说,有这么一个登录页面:
一个用户的账号为abc,密码为123,他觉得每次访问还需要输入账号密码是件非常麻烦的事,因此选择了保留。F12可以看到Html页面是这样的:
如果直接在账号栏输入alert("1"),然后输入一个错误的密码,并没有执行script代码,因为返回的html页面是这样的:
上图中那样的script代码是不会执行的,因为在input的value中只有独立的script代码才会执行。所以要想实现script代码的执行,就需要进行拼接,将script代码排到input标签外。
怎么实现呢?
说白了就是自己拼接,将input标签进行闭合,然后将script代码缀在后边,通过用户名的输入,将input拼接成如下,即可实现script代码的执行:
因为此时input已经闭合了,所以script代码会执行,至于拼接后的html文件是有语法错误的问题(因为最后剩下一个"/>,这个html是有错误的,但是不影响页面展示和script代码执行)就可以忽略了
因此,只需要在用户名那里输入abc"/>alert("1"),然后输入一个错误的密码,点击登录,就会执行script代码,弹出弹框。