Web缓存中毒-攻击示例(五)

admin 2023年2月16日19:59:58评论16 views字数 2692阅读8分58秒阅读模式
在接下来的章节中,将展示如何通过利用缓存系统具体实施实现机制问题来获得更大的Web缓存中毒攻击面。将亚你就为什么缓存键生成方式的缺陷有时会使网站容易受到缓存中毒的影响,而这些漏洞通常被认为是不可利用的。另外还将展示如何进一步使用经典技术来潜在地破坏应用程序级缓存,通常会带来毁灭性的结果。


缓存参数隐藏
如果缓存将一个无害的参数排除在缓存键外,而又不能根据完整的URL找到任何可利用的小工具,那么可能就会认为已经进入死胡同。
但如果能够弄清楚缓存是如何解析URL以识别和删除不需要的参数,那么可能会发现一些有趣的特性。
尤其值得注意的是缓存和应用程序之间的解析差异,这可能允许通过将任意参数“隐藏”在一个排除的参数中,从而将其偷偷带入应用程序逻辑。
例如,如果参数是查询字符串中的第一个,那么它的前面会有一个"?"或者一个"&",一些写的很差的解析算法会处理任意"?"后作为一个新参数的开始,不管它是不是第一个。
假设从缓存键中排除参数的算法以这种方式表现,但服务器的算法只接受第一个"?"作为分隔符,那么看下下面这个请求:
Web缓存中毒-攻击示例(五)
在这种情况下,缓存将识别两个参数,并从缓存键中排除第二个参数。但是,服务器不接受第二个"?"作为分隔符,而只看到一个参数"example",其值是查询字符串的其余部分,包括payload。如果"example"的值被传递到一个有用的小工具中,那么就成功注入了payload,而不会影响缓存键。


利用参数解析的特性
类似参数隐蔽问题可能出现在相反的情况下,即后端识别出不同的参数,而缓存没有。
例如,Ruby on Rails框架将"&"和";"都解释为分隔符,当与不允许这样做的缓存一起使用时,可能会利用另一个奇怪的特性来覆盖应用程序逻辑中键控参数的值。
看下下面的请求:
Web缓存中毒-攻击示例(五)
正如名字所示的,"keyed_param"包含在缓存键中,但"exclusion_param"不包含,许多缓存区只将其理解为两个参数,以"&"为界:
Web缓存中毒-攻击示例(五)
一旦解析算法删除"excluded_param"后,缓存键将只包含"keyed_param=abc",然后在后端,Ruby On Rails看到分号,会将查询字符串分成三个独立的参数:
Web缓存中毒-攻击示例(五)
但现在有一个重复的"keyed_param",这就是第二个怪异特性发挥作用的地方。如果有重复的参数,每个参数都有不同的值,Ruby on Rails将优先考虑最后出现的参数。最终结果是缓存键包含一个正常的、预期的参数值,允许缓存响应正常地提供给其他用户。然后在后端,相同的参数有一个完全不同的值,这就是我们注入的payload。也正是这个第二个值将被传递到小工具中,并反映在中毒的响应中。
如果这个漏洞能够控制将要执行的函数,那么会特别强大。
例如,如果网站使用JSONP进行跨域请求,通常会包含一个回调参数,对返回的数据执行给定的函数。
Web缓存中毒-攻击示例(五)
在这种情况下,可以使用一些技术来覆盖预期的回调函数并执行任意JavaScript。

场景试验-参数隐身:
https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking
场景说明:
这个试验场景容易受到Web缓存中毒的影响,因为它将某个参数排除在缓存键之外。缓存和后端之间也存在不一致的解析参数。一个用户经常使用Chrome浏览器访问这个网站的主页。
试验目的:
要完成这个试验,需要使用参数隐蔽技术,在访问者的浏览器中执行alert(1)的响应来毒害缓存。
攻击过程:
访问页面后在Burp Buite中可以观察到,页面会调用/js/geolocate.js这个页面

Web缓存中毒-攻击示例(五)


使用”Param Miner”扩展工具来扫描隐藏参数,可以发现存在注入漏洞

Web缓存中毒-攻击示例(五)


Web缓存中毒-攻击示例(五)


从测试包和响应来看,参数后面利用”;”进行分割后的内容不会被作为缓存建,但第二个参数内容会被返回到响应中

Web缓存中毒-攻击示例(五)


将下面的Payload注入到这个请求页面中,反复重放,直到命中缓存,即可完成试验
&utm_content=test;callback=alert(1)

Web缓存中毒-攻击示例(五)



利用Fat Get进行注入
在某些情况下,HTTP方法可能没有被缓存建,这种情况下可能可以使用POST请求中加载恶意payload来毒害缓存,然后这个payload会响应用户的GET请求。虽然这种情况非常罕见,但有时可以通过简单地在GET请求中添加一个body来创建一个”Fat GET”请求来达到类似的效果:
Web缓存中毒-攻击示例(五)
在这种情况下,缓存键将基于请求行,但参数的服务器端值将取自正文。

场景试验-利用”Fat GET”来进行Web缓存中毒:
https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get
场景说明:
这个试验场景容易受到Web缓存中毒的影响,它接受有具有主体的GET请求,但不将主体包含在缓存建中。受害者经常使用Chrome浏览器访问本网站主页。
试验目的:
要完成这个试验,在受害者的浏览器中执行alert(1)的响应来毒害缓存。
攻击过程:
可以注意到,每个页面都会导入脚本/js/geolocate.js,执行回调函数setCountryCookie(),将GET /js/gelocate.js?callback=setCountryCookie发送到Repeater

Web缓存中毒-攻击示例(五)


我们在请求的Body中增加如下这条
callback=arbitraryFunction
重复发送直到刷新缓存,可以发现响应函数名被替换了

Web缓存中毒-攻击示例(五)


把callback的参数修改成alert(1)后再重复发送请求,当成功刷新缓存时即可完成试验

Web缓存中毒-攻击示例(五)


试验小结:
这种方法只有在网站接受具有主体的GET请求时才有可能成功,不过也存在变通的方法,有时可以通过重写HTTP方法来鼓励”FAT GET”请求,比如:
Web缓存中毒-攻击示例(五)
只要X-HTTP-Method-Override标头不是keyed,就可以提交伪post请求,同时保留从请求行派生的GET缓存键。

Web缓存中毒-攻击示例(五)


服务器端请求伪造(SSRF)-概念梳理

文件上传漏洞-概念梳理

访问控制和权限提升漏洞-概念梳理

信息泄露漏洞-概念梳理

业务逻辑漏洞-概念梳理

命令注入攻击(上)
目录遍历攻击(上)

身份验证漏洞-概念梳理

SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理


原文始发于微信公众号(H君网安白话):Web缓存中毒-攻击示例(五)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月16日19:59:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Web缓存中毒-攻击示例(五)http://cn-sec.com/archives/1554512.html

发表评论

匿名网友 填写信息