扫描的爬网阶段包括在应用程序中导航,跟踪链接,提交表单以及在必要时登录,以对应用程序的内容及其中的导航路径进行分类。 这个看似简单的任务提出了Burp的爬虫能够应对的各种挑战,以创建应用程序的准确地图。
Burp的搜寻器通过单击链接并提交输入,以与使用浏览器的用户相同的方式在目标应用程序中导航。 它以有向图的形式构造应用程序内容和功能的映射,表示应用程序中的不同位置以及这些位置之间的链接:
搜寻器不假设应用程序使用的URL结构。 根据位置的内容(而不是用于访问它们的URL)来标识位置(并在以后重新标识)。 这使搜寻器能够可靠地处理将短暂数据(例如CSRF令牌或缓存破坏器)放入URL的现代应用程序。 即使每个链接中的整个URL每次都发生变化,爬网程序仍会构建准确的地图:
该方法还允许爬网程序根据应用程序的状态或用户与其交互来处理使用相同URL到达不同位置的应用程序:
当搜寻器四处导航并建立目标应用程序的覆盖范围时,它会跟踪图中尚未完成的边缘。 这些代表在应用程序中已观察到但尚未访问的链接(或其他导航过渡)。 但是搜寻器从不“跳转”到挂起的链接并脱离上下文访问它。 相反,它要么直接从当前位置导航,要么还原到起始位置并从那里导航。 这将使用浏览器尽可能接近地复制普通用户的操作:
以不假设URL结构的方式进行爬网在处理现代web应用程序时非常有效,但可能会导致看到“太多”内容的问题。 现代网站通常包含大量多余的导航路径(通过页面页脚、菜单等),这意味着所有内容都直接链接到其他内容。Burp的搜寻器采用了多种技术来解决此问题:它建立到已访问位置的链接的指纹,以避免重复访问它们。 它以优先进入新内容的广度优先顺序进行爬网; 并且它具有可配置的截止时间,可限制抓取的范围。 这些措施还有助于正确处理“无限”应用程序,例如日历。
由于Burp的搜寻器以与使用浏览器的用户相同的方式在目标应用程序中导航,因此它几乎可以自动使用浏览器能够处理的任何会话处理机制。 无需记录宏或配置会话处理规则即可告诉Burp如何获取会话或验证当前会话是否有效。
搜寻器使用多个搜寻器“代理”来并行化其工作。 每个代理代表使用自己的浏览器浏览的应用程序的不同用户。 每个代理都有其自己的cookie jar,当应用程序向其发出cookie时,将对其进行更新。 当代理返回起始位置以开始从此处开始爬网时,其cookie jar将被清除,以模拟完全新鲜的浏览器会话。
爬网程序在其四处导航时发出的请求是根据前面的响应动态构建的,因此URL或表单字段中的CSRF令牌会自动处理。 这使爬网程序可以正确导航使用复杂会话处理的功能,而用户只需进行零配置:
现代web应用程序具有高度的状态,由于用户同时执行的操作,同一应用程序功能通常会在不同的场合返回不同的内容。 Burp的搜寻器能够检测到它在搜寻期间执行的操作导致的应用程序状态更改。
在下面的示例中,导航路径BC导致应用程序从状态1转换为状态2。链接D转到状态1与状态2逻辑上不同的位置。因此,路径AD转到空购物车,而路径ABCD转到已填充的购物车。 爬网不仅能够确定链接D是不确定的,还能够识别链接D所依赖的状态改变路径。 这使搜寻器可以在将来可靠地到达填充的购物车位置,以访问那里可用的其他功能:
Burp的搜寻器以未经身份验证的阶段开始,该阶段不提交任何凭据。 完成此操作后,Burp将发现该应用程序中的所有登录和自我注册功能。
如果该应用程序支持自我注册,Burp将尝试注册用户。 您还可以将搜寻器配置为使用一个或多个预先存在的登录名。
然后,搜寻器进入验证阶段。 它将多次访问登录功能并提交:
对于提交给登录名的每组凭据,Burp都会对登录名后面发现的内容进行爬网。 这允许搜寻器捕获可用于不同类型的用户的不同功能:
尽管搜寻器通常并行使用多个搜寻器代理,但是某些应用程序禁止同一用户并发登录。 在这种情况下,当用户登录时,该用户的任何现有身份验证会话都将终止。 Burp能够检测到此行为,并且将仅对每个不同的用户帐户执行一次并发登录:
现代的web应用程序经常包含易失性内容,其中“相同”的位置或功能将返回在不同情况下有显着差异的响应,而不是(不必要)由于用户的任何操作而导致的响应。 这种行为可能是由诸如社交媒体渠道的提要或用户评论,内联广告或真正随机的内容(每日消息,A / B测试等)等因素引起的。
Burp的搜寻器能够识别易失性内容的许多实例,并且尽管响应有所不同,但在不同的访问中可以正确地重新标识相同的位置。 这使搜寻器可以将注意力集中在一组应用程序响应中的“核心”元素上,这对于发现有趣的应用程序内容和功能的关键导航路径而言可能是最重要的:
在某些情况下,在不同的情况下访问给定的链接将返回仅相差太大而不能被视为“相同”的响应。 在这种情况下,Burp的搜寻器会将两个版本的响应捕获为两个不同的位置,并将在图中绘制不确定的边。 如果整个应用程序的不确定性程度不是很大,那么Burp仍可以抓取关联的内容,并可靠地找到其通往不确定性链接背后的内容的方式: