存储型XSS与反射型XSS有什么区别?
曾经我也疑惑过,XSS主要是通过可操控的JS代码来做一些羞羞的事。要解决题主的疑问,需要一些前置知识。这要从XSS的分类说起。
如今最常见的XSS一般被分为存储型、反射型、DOM型,可能有很多人对这三类不是很清楚,我来简单解释一下。
存储型:恶意代码被当做正常数据插入到数据库中,当用户正常访问页面的时候,恶意代码从数据库中被取出,在当前页面被触发。用户不会发现自己被攻击。这种XSS可以无差别攻击,影响很大。比如留言板的XSS。反射型:恶意代码被当做正常数据提交到后台后,由后台进行处理,并立刻返回到前端被触发。这种XSS的攻击方式一般是骗人点链接,恶意代码在url中,有一些安全常识的人可能会发现一些端倪。比如前几年在QQ空间留言区很火的“你这张照片好好看啊:恶意连接”。DOM型XSS:和反射型一样,单独提出来是因为它不过后端,由JS直接在前台处理。所以在后端是无法防御的,这个必须要前台过滤。比如当你在一个购物网站搜索“上衣”,返回页面中显示“上衣的搜索结果如下:”,这里的上衣可能就是直接由js获取你提交的值插入的,而不是从后端而来。然后开始回答题主的疑问,一个一个来:
1.这东西到底咋攻击的?
XSS的攻击一般是通过各种方式注入JS代码,这是一个客户端攻击,不得不承认,虽然影响也不小,和服务端攻击比确实还是不够看。具体的攻击方式请看上方三种XSS的加粗部分。XSS使黑客可以操作受害者当前页面的JS代码,这其实就可以做很多事情了,这个后面会细讲。
2.服务器过滤一下就行了,还能翻天不成?
首先,前面说了DOM型XSS不过服务器的,恶意数据直接在前端被处理而触发攻击,所以服务器过滤没有用。
其次,富文本XSS难以防御,比如知乎,用户有插入混合图文的需求,有的场景可能还支持自定义样式,这决定了不能完全阻止html注入,自然也就会带来js注入,引发XSS。比如我现在再给你讲XSS,如果我贴一些XSS的代码,知乎把它过滤掉或者由于它的转义导致我的代码“难看”了一些,都是影响用户体验的事情。很多时候,理想中的安全需要给实际业务场景让步。
再者,XSS精妙的地方在于有过多的绕过方式,因为前端那一堆本来就是不严格的,用黑名单去过滤是不能完全防御的。而且XSS是区分场景的,这个《白帽子讲Web安全》中就提到过,恶意代码输出在html中、输出在js中和输出在href链接中,触发XSS的原因是不同的,它们的安全转义方式也不同,尴尬的是,复杂业务场景下,你不知道用户的这个输入会在哪里出现。。过滤的太严格,就改变了用户输入,影响用户体验。
最后,不得不承认,现在的XSS其实越来越少了,这是前后端分离时代必然的结果。
3.在客户端js代码,html里面插入东西?那有什么用?静态资源这些都是服务器输出的,他改了自己客户端的,也改不了别的用户的啊?那还咋攻击?
参考之前我对XSS咋攻击的回答,你会发现他可以通过骗用户点恶意链接(恶意代码在url中)和把恶意代码插入到数据库中(比如留言板)来操控目标受害者的客户端上运行什么js代码。
XSS之所以有的需要通过html注入完成是因为html拥有很多js域
比如script标签中可以运行js代码比如标签的onXXX事件中可以运行js代码比如a标签的href跳转时,一些伪协议(比如javascript:)可以运行js代码比如src的data伪协议,iframe标签等,可以直接构造html,然后为所欲为4.最后说一下XSS可以干的事儿。
控制了受害者客户端运行的JS代码,你可以:
盗取受害者cookie,登录他的账户,这个cookie很可能是某个大企业多子域通用的,等于他很多业务的账号被你瞬间劫持。apt攻击中,XSS可以用来探测内网环境,侦查对于apt其实还蛮重要的。可以钓鱼,操控js代码可以动态生成一个html覆盖在你当前页面。可以偷你当前页面的重要数据,偷偷回传到攻击者服务器。可以挖矿,js挖矿。还有很多。。。懒得写了