【技术分享】梨子带你刷burpsuite靶场系列之客户端漏洞篇 – 基于DOM的漏洞

VSole2021-08-19 11:04:19

 

本系列介绍

PortSwigger是信息安全从业者必备工具burpsuite的发行商,作为网络空间安全的领导者,他们为信息安全初学者提供了一个在线的网络安全学院(也称练兵场),在讲解相关漏洞的同时还配套了相关的在线靶场供初学者练习,本系列旨在以梨子这个初学者视角出发对学习该学院内容及靶场练习进行全程记录并为其他初学者提供学习参考,希望能对初学者们有所帮助。

什么是DOM?

DOM,全称document object model,译为文档对象模型。是浏览器对页面元素的分层表示。网站可以使用JS操作DOM的节点和对象以及它们的属性。在DOM的概念中有两个专有名词source和sink,目前梨子还找不到合适的中文翻译。我们暂且理解为DOM操作的入口点和出口点。如果当不安全的payload从入口点传递给出口点则可能存在基于DOM的漏洞。

source

source是一个JS属性,可以接收用户输入。比如location.search,它可以从查询字符串中获取数据,这也是攻击者比较容易利用的点。还有其他的也是容易被攻击者控制的source,例如document.referrer、document.cookie还有Web消息等。

sink

既然source是接收用户输入,那么sink就是使用危险的方式处理source的函数或DOM对象。比如eval()就是一种sink,可以处理JS传递给它的参数值。还有一种sink是document.body.innerHTML,攻击者可以向其注入恶意的HTML和JS脚本并执行。

什么是污点流(Taint-flow)?

当网站将数据从source传递给sink,然后sink以不安全的方式处理该数据,则可能出现基于DOM的漏洞。危险的数据由source流向sink,所以叫做污点流(Taint-flow)。最常见的source就是URL,通常使用location对象访问。攻击者可以构造一个链接,然后让受害者跳转到指定的页面。例如

goto = location.hash.slice(1)if (goto.startsWith('https:')) {  location = goto;}

上面这段代码会检查URL,如果包含以https开头的哈希片段则提取location.hash属性的值并将其设置为window对象的location属性。所以攻击者可以构造这样的URL来利用这个基于DOM的开放重定向漏洞。

https://www.innocent-website.com/example#https://www.evil-user.net

经过上面那段代码处理以后,会将https://www.evil-user.net 设置为location属性的值,这会自动将受害者重定向到该站点。一般可以用于钓鱼攻击。

常见的source

下面列出一些常见的可能触发污点流(Taint-flow)漏洞的source

  • document.URL
  • document.documentURI
  • document.URLUnencoded
  • document.baseURI
  • location
  • document.cookie
  • document.referrer
  • window.name
  • history.pushState
  • history.replaceState
  • localStorage
  • sessionStorage
  • IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
  • Database

下面几种数据也是可能触发污点流(Taint-flow)漏洞的source

  • 反射型数据(已在XSS专题中讲解)
  • 存储型数据(已在XSS专题中讲解)
  • Web消息

以Web消息为source的基于DOM的漏洞

如果网站以不安全的方式传递Web消息,例如,未在事件侦听器中正确验证传入的Web消息的源,则事件侦听器调用的属性和函数可能会成为sink。攻击者可以托管恶意iframe并使用postMessage()方法将Web消息数据传递给事件监听器,然后将payload发送到父页面上的sink。这就以为着攻击者可以以Web消息为source将恶意数据传递到这些所有的sink。

如何以Web消息为source构造攻击?

首先我们考虑这样的代码

<script>window.addEventListener('message', function(e) {  eval(e.data);});script>

这段代码添加了一个事件监听器,在接收到消息时执行里面的data部分。这里我们通过iframe注入这个消息

domburpsuite
本作品采用《CC 协议》,转载必须注明作者和本文链接
DOM,全称document object model,译为文档对象模型。是浏览器对页面元素的分层表示。
Web缓存就是服务器会先将之前没见过的请求对应的响应缓存下来,然后当有认为是相同请求的时候直接将缓存发给用户,这样可以减轻服务器的负荷。
点击劫持,就是诱导受害者点击页面上透明的按钮或链接以发送一些恶意的请求。
NoXss是一个供web安全人员批量检测xss隐患的脚本工具。其主要用于批量检测,比如扫描一些固定的URL资产,或者流量数据,会有不错的效果。测试到目前一个月发现将近300个xss。
1.验证码复用 漏洞描述 当服务器端受理请求后,没有将上一次保存的session及时清空,将会导致验证码可重复使用 通常情况下在网站注册、登录、找回密码等页面都会设计验证码验证。如果设计不合理,将会刀子验证码在验证成功一次之后,下次使用的就不在验证也就说可以重复使用。 案例: 可以看到此处前端登录虽有验证码验证,但是只验证一次。后续可一直使用该验证码。 测试方法:发送到repeater
Headless Chrome是谷歌Chrome浏览器的无界面模式,通过命令行方式打开网页并渲染,常用于自动化测试、网站爬虫、网站截图、XSS检测等场景。
以上功能点均存在类似的通过修改请求方式的CSRF漏洞。字段来验证请求的主动性。AddTime参数能控制前台显示的时间,但是时间格式有严格限制,无法实现存储型XSS。经测试,该处存在CSRF可以通过此种方式替他人创建文章分类。
当我们输入正确的手机号和正确的短信验证码,然后进入重置密码的最后一步,也就是输入新的密码输入密码后提交到服务端的post数据包需要包含当前用户的身份信息。修改响应包重置任意账号密码:通过手机找回密码一般需要短信验证码验证,服务端需要告诉客户端,输入的验证码是否正确。
自己接过的一个项目,不过其实是客户自己在使用的一个SaaS平台,也就是对SaaS平台的测试本质上来说没有严格授权。由于没有严格授权也就将测试范围局限在了单个网站上,并没有根据域名进行拓展。Web应用信息通过Burp发送一定请求包,可以得到服务器如下信息:开发语言:ASP. 由于使用的是ASP.NET开发框架,因此服务器中间件大概率是IIS了。以上功能点均存在类似的通过修改请求方式的CSRF漏洞。
⽹上整理的⾯试问题⼤全,有些 HW ⾯试的题,已经收集好了,提供给⼤家。
VSole
网络安全专家