哈喽,大家好,纯洁的小莫冷又来给大家科普啦
今天我们来讲讲XSS攻击
XSS攻击原理
说起XSS,其实它和CSRF很像,CSRF是通过你打开的网站的缓存信息来进行攻击的,而XSS则是通过服务器来窃取信息的,也就是说,CSRF和XSS的目的都是窃取用户信息,而CSRF是操作客户端,XSS则是操作服务器。
反射型XSS
既然是针对服务器的操作,那就是说服务器必须有这个漏洞才可以,而如何验证自己的服务器存不存在被XSS攻击的可能呢,其实很简单,只需要在服务器存在输入框的地方写个js脚本,看看能不能给执行就可以知道,最简单的莫过于alert弹窗,即在输入框里输入
查看浏览器是否弹窗。
下图为测试案例 点击submit后弹窗
上图就是一个经典的反射型XSS攻击,反射型XSS的特征就是具有一次性的特征,通常通过邮件将包含XSS攻击脚本的链接发送给用户,当用户点击链接时浏览器就会执行XSS攻击脚本将黑客需要的信息发送给黑客所在的服务器。
存储型XSS 说到这有的小伙伴就要问了,既然有反射型XSS,那是不是还有别的类型呢?没错,除了反射型XSS之外,还有存储型XSS、DOM型XSS,存储型XSS与反射型的区别在于反射型XSS依赖于用户输入,而存储型XSS则不需要用户任何输入,并且存储型XSS是永久存在的,通常为黑客在网站发布的贴子、博客、评论等位置,当你浏览此博客时,博客上存在的XSS脚本就会运行,你在此的个人信息(如cookie等)也就随之泄露了。
DOM型XSS
而DOM型XSS比较特殊,owasp关于DOM型XSS的定义是基于DOM的XSS是一种XSS攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。其特殊的地方就是payload在浏览器本地修改DOM树而执行,并不会传到服务器上,这也就使得DOM型XSS比较难以检测。
网页的生成与修改
在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。
客户端可以通过JS脚本对文档对象进行编辑,从而修改页面的元素 。 也就是说,客户端的脚本程序可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的xss漏洞不需要与服务器端交互,它只发生在客户端处理数据的阶段。
攻击方式
用户请求一个经过专门设计的URL,它由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时, DOM对象就会处理XSS代码,导致存在XSS漏洞 。
XSS攻击的防御方式
1.输入过滤
其实上面的内容大家不难看出来,XSS攻击的主要方式就是在用户的输入侧添加JS脚本执行,那么防御起来其实也就很简单了,只要我们将用户输入进行过滤即可,比如<script>标签,不过过滤时需要注意的一点就是过滤的节点,即在什么位置进行过滤,如果仅仅在前端html页面过滤的话,若黑客直接访问后台接口,那么前端过滤就不起作用了,如果在代码在后端准备写入数据库中进行定义如何?答案也是不行的,举一个例子,如果我们提交5 < 7,此时如果在准备插入数据库进行ecapeHTML编码,此时就会编译成5 < 7,此时当前端请求数据时,此时返回页面是5 < 7是没有问题的,但是如果在像vue这些框架中使用,则无法进行转义,任然显示5 &It; 7。所以输入过滤是不行的。但是对于一些特别的输入比如电话号码,邮箱地址等等信息可以使用输入过滤。此时我们应该将侧重点放在防止浏览器恶意执行代码。
2.预防存储型和反射型XSS攻击
存储型和反射型XSS都是在服务端取出恶意代码,输入到对性的HTML种,轰击者可以编写数据被内嵌到代码中,被浏览器执行,所以针对这两个漏洞,常见的作法就是改为纯前端渲染,把代码和数据分开,或者对HTML做充分的转义。
3.预防DOM型XSS
DMS型XSS实际上就是前端js代码不够严谨,把不可信的数据当作代码执行了,所以我们在使用innerHTML、outerHTML、document.write时要特别小心,不要把不可信的数据当作HTML插入到页面上,尽量使用textContent和setAttribute
AF针对XSS攻击防护配置
AF针对XSS攻击的配置项较简单,默认为开启状态,即使用默认模板即可防御XSS攻击,XSS对应的配置位置为
|