实例理解DOM XSS与反射XSS之差

     分类: 网络安全 发布时间: 2022-10-08 21:39 894人浏览

面试总是会问起DOM型xss和反射型xss的差别,可能大多数人会这么说:
DOM XSS 是由于浏览器解析机制导致的漏洞,服务器不参与,而存储型与反射型都需要服务器响应参与
但我觉得光是这么说,很容易对DOM型XSS的理解产生偏差,导致认为DOM型XSS很鸡肋或者很难以利用。
恰逢发现burpsuite官方自己有个做的很好的在线靶场:https://portswigger.net/web-security/all-labs
就用里面的实例来深入理解这两个XSS之差:

回顾一下反射XSS.

先来看一个大家都很熟悉的反射型XSS的简单例子:


search字段写入<img src=x onerror="alert(1)">,弹出一个框

来看这个攻击的请求响应就是这样的,根据红框处可以看出来search里面的payload原封不动地输出,这也就自动扫描器的主要判断条件。


再看DOM型XSS.

下面我们再来看一个DOM型XSS的例子:

光看页面是不是很像?同样是search字段写入<img src=x onerror="alert(1)">,弹出一个框
我们再来看看请求和响应:

这就能看到了DOM型XSS和反射型XSS最重要的区别:
DOM型XSS的payload不直接输出于相应体中,而是通过一段js处理的方式,把这个payload以某种方法给带出来,再在前端加载的时候实际触发。


这意味着什么呢?我们可以分攻击与防御两方面去看:
攻击方面:显然,对于两者的攻击payload实质都是一样的,没有任何区别,唯一的区别是,在实际挖掘DOM型XSS漏洞中,需要在浏览器F12去看最终输出的结果是否能通过JS函数加载DOM加载出来,这相比直接判断响应中是否有原数据来说要麻烦不少,这就给漏扫和自动化挖掘增加了难度。

防御方面:可以看得出来,两种XSS实质上都要对服务器发起一次带攻击payload的请求,也就意味着对于有监控的防御者来说,他们都可以察觉到有攻击者发起了一次XSS攻击。区别是,防御者可以通过响应体是否存在原数据,判断这次攻击是否成功,但对于DOM型XSS,光从一次请求响应来说,是无法判断是否攻击成功的,这也为防御者的漏洞确认带来了麻烦,一般需要手动复现才行。但防御者一般没这么闲,因此DOM型XSS更有可能隐没在茫茫告警之中,无法引起重视。


上一篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注