ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PortSwigger网络缓存欺骗(4)

PortSwigger网络缓存欺骗(4) 这是第四期的网络缓存欺骗为了防止大家的头脑已经转不过来了今天再来重新梳理下并区分下缓存静态路径与缓存静态资源“静态资源”一种让缓存服务器认为“这个响应可以缓存”的特征。/resources只是网站上可能存在的一个具体静态资源目录。所以如果缓存服务器是根据文件扩展名判断是否缓存那么你可以用类似/my-account.css或者/my-account.js来冒充静态资源不需要/resources。但如果这个 Lab 的缓存规则明确是/resources/*才会缓存那么你就不能简单把resources去掉因为/my-account.css虽然看起来像 CSS但缓存服务器未必会缓存它。可以这么理解假设缓存规则是/resources/* → 缓存那么/my-account 某种路径混淆 /resources是为了让缓存服务器产生“这个请求属于 resources。”而如果缓存规则是*.css *.js *.jpg那么/my-account.css就足够让缓存服务器产生“这是 CSS缓存它。”所以resources不是“静态资源”的代名词它只是一个具体的静态资源路径。对你当前这个 PortSwigger Lab如果你做的是你前面提到的Web cache deception via origin server normalization那么不要简单认为“我加.css就能替代resources”。这个 Lab 要利用的是缓存服务器的 URL 解析 ≠ 源服务器的 URL 规范化而resources是根据该实验环境的缓存行为选择的一个缓存诱饵路径。所以判断能不能替换最简单的方法就是先确认什么 URL 会被缓存如果/resources/xxx → HIT而/xxx.css → MISS那就说明这个环境依赖resources。反过来如果/xxx.css → HIT那么.css就可能承担resources的作用。因此不是“Web Cache Deception 必须使用 resources”而是“必须让缓存服务器把这个请求当成可缓存的资源”具体用/resources、.css还是其他形式取决于目标缓存服务器的规则。在第三篇的时候我没有重点去了解为什么必须要在url的路径中添加resources在深度了解后发现在发现漏洞的过程中我们做的每一步中就包含了试探缓存服务器的规则基于怎样的规则才能缓存到用户的cookiesession而最简单易懂的就是直接缓存文件例如.css .js .jpg 等等但最难懂的是缓存路径和分隔符的试探我们则需要通过intruder去遍历payload不断试探状态码。当然我们接下来要说的归一化处理也是其中很重要的一环相当于结合缓存服务器和源服务器。归一化图同一个 HTTP 请求 │ ┌────────────┴────────────┐ ↓ ↓ 缓存服务器 源服务器 │ │ 认为是 resources 规范化后 可缓存资源 实际访问 my-account │ │ └──────────┬──────────────┘ ↓ my-account 响应 ↓ 被缓存整个攻击过程攻击者 │ │ 构造恶意 URL ↓ /my-account%23%2f%2e%2e%2fresources?wcd │ ↓ ┌───────────────────┐ │ 缓存服务器 │ │ │ │ 看到 resources │ │ ↓ │ │ 认为可以缓存 │ └────────┬──────────┘ │ ↓ ┌───────────────────┐ │ 源服务器 │ │ │ │ 解析 URL │ │ ↓ │ │ 到达 /my-account │ │ ↓ │ │ 返回受害者账户信息 │ └────────┬──────────┘ │ ↓ 返回给受害者 │ ↓ 缓存服务器缓存归一化原理要利用这种差异您还需要找到一个源服务器使用但缓存中未使用的分隔符。通过将可能的分隔符添加到动态路径之后的有效负载中来测试它们如果源服务器使用分隔符它将截断 URL 路径并返回动态信息。如果缓存不使用分隔符它将解析路径并缓存响应。例如考虑有效载荷/profile;%2f%2e%2e%2fstatic。源服务器使用;以下分隔符缓存将路径解释为/static源服务器将路径解释为/profile源服务器会返回动态配置文件信息并将其存储在缓存中。因此您可以利用此有效载荷进行攻击。实验利用缓存服务器规范化进行 Web 缓存欺骗实验利用缓存服务器规范化进行 Web 缓存欺骗根据归一化原理可知 我们需要让缓存服务器认为是resources静态路径 让源服务器认为是my-account 并且在构造的url中需要使用到分隔符 也就是说我们需要intruder对分隔符进行遍历筛选找出符合状态码的分隔符使用/my-account§§%2f%2e%2e%2fresources虽然有四个可以使用 但是我们还是选最熟悉最简单的并将其统一为url编码的%3f 得出/my-account%3f%2f%2e%2e%2fresources经过测试只用%23可以使用后获得x-cache:miss之后便可以注入脚本了
返回列表