相对VS绝对
RPO(相对路径覆盖)是一种通过覆盖目标文件来利用相对URL的技术。要理解该技术,我们必须首先研究相对URL和绝对URL之间的差异。绝对URL基本上是目标地址的完整URL,包括协议和域名,而相对URL不指定域或协议,并使用现有目标来确定协议和域。
绝对网址:https://hackvertor.co.uk/public
相对URL:public / somedirectory
显示的相对URL将查找公共,并根据当前域名自动包含其之前的域。相对URL有两个重要的变体,第一个是我们可以使用当前路径并查找其中的目录,如“xyz”或使用常见的目录遍历技术,如“../xyz”。要了解这些在标记中的工作方式,我们来看看样式表中使用的常见相对URL。
上面的link元素使用相对URL引用“style.css”,具体取决于站点目录结构中的位置,它将基于该加载样式表。例如,如果您位于名为“xyz”的目录中,则样式表将从“xyz / style.css”加载。
有趣的方面是浏览器如何知道正确的路径是什么,因为它无法访问服务器的文件系统。无法从文件系统外部确定有效的目录结构,您只能进行有根据的猜测并使用http状态代码来确定它们的存在。
缺少的样式
我注意到相对样式的一些有趣的东西,操纵网站的路径可能导致样式无法加载。在我看来,这在某种程度上是一个缺陷,但拼图的碎片还没有意义。怎么可能被利用?
上面的两个屏幕截图显示了一个没有使用URL操作的网站,样式加载按预期加载,但是在第二个屏幕截图中,相同的网站加载了添加的正斜杠,并且相关样式表未加载。只需在URL末尾添加正斜杠就会破坏相对样式的样式。在Firebug中我们可以看到当我们添加正斜杠时,wdn.css的样式返回404。
屏幕截图显示样式表返回404的样式,该样式先前在不操纵路径的情况下正常加载。如果样式返回404,我们可以通过更改路径来进一步操纵相对URL。这实际上就是RPO的意义所在,我们尝试将相对URL更改为我们控制的内容,尽管这篇文章是关于XSS的,但值得注意的是,可以对任何此类URL进行操纵相对URL,并且不限于XSS。
快速CSS课程
由于我们正在考虑将样式表操作为我们控制的东西,因此我们必须首先理解CSS解析以利用它。我们非常感兴趣的CSS 2规范中有一个有趣的部分。
“在某些情况下,用户代理必须忽略非法样式表的一部分。该规范定义忽略意味着用户代理解析非法部分(为了找到它的开头和结尾),否则就好像它不存在一样。“CSS 2规范。
添加了另一段拼图,CSS2忽略了非法语法,我们可以通过提供包含CSS和其他内容的混合内容的文件来使用它。如果我们可以在我们想要的代码之前欺骗CSS解析忽略非法语法,我们可以让CSS解析器加载我们的代码。CSS选择器提供了执行此操作的最佳方法,因为可以忽略无效的选择器以及之前的所有非法语法。
无效的代码
有两种技巧可以忽略非法代码,这些代码都涉及选择器,具体取决于单个}将工作的CSS解析器或{}。我们将看看IE compat,因为解析器非常松散并且支持CSS表达式。CSS表达式如下所示:
第一部分是全局选择器“*”,{打开选择器使用自定义属性xss,然后表达式包含执行alert(1)的JavaScript。
自引用
如果我们可以为它所在的页面设置样式表自引用,那么我们可以使用CSS解析来忽略HTML并在IE compat中执行我们的自定义CSS。当网站包含如下样式表时:
我们只需要在URL的末尾包含一个正斜杠,样式表将结束(如果可以重写)通过浏览器认为是目录但实际上是当前页面加载原始页面。例如somepage.php /。现在我们的样式表正在加载网页,我们需要为它提供一些要执行的CSS,我们可以通过混合持久性数据(如名字或地址)来实现这一点,将其视为反射攻击和持久攻击但是持久数据包含CSS代码。
要理解这一点,最好显示页面的实际结构,并查看向量本身。想象一下,我们有一个网页,其中包含我们控制的一些数据,例如“名字”,网页如下所示。
PoC(仅限IE):RPO示例
Meta元素强制IE的文档模式进入IE7 compat,这是执行表达式所必需的。我们的持久文本{} * {xss:expression(open(alert(1)))包含在页面上,在实际场景中,它可以是配置文件页面,也可以是其他用户可以查看的共享状态更新。我们使用“open”来防止客户端DoS重复执行警报。“rpo.php /”的简单请求使相对样式将页面本身加载为样式表。实际的请求是“/labs/xss_horror_show/chapter7/rpo.php/styles.css”,浏览器认为还有另一个目录,但实际请求正在发送到文档,实质上是RPO攻击的工作原理。
进一步的RPO攻击
您可能想知道RPO攻击是否仅限于像“styles.css”这样的相对URL,答案是否定的,可以攻击诸如“../../styles.css”之类的URL,但在这种情况下我们需要提供伪目录的级别,直到从当前文档加载样式。“../”表示查看当前目录; 我们需要三个级别的假目录。
PoC:RPO示例2
这一次,因为相对URL正在查找当前目录上方两倍的目录,我们发出“/labs/xss_horror_show/chapter7/rpo2.php/styles.css”的请求,这意味着您还可以将目标定位在不同的目录中,但在这种情况下,我们将其指回原始的html文件。注意我们可以只做rpo2.php ///但是为了清楚起见,我提供了伪目录的文本。
还有其他变体,例如使用@import命令,如果长度或字符有限,则该命令很有用。使用“}”再次忽略HTML后跟@import语句在IE上工作得非常好,即使从技术上来说这是使用import语句的无效语法。
RPO不仅限于IE,我们可以在其他浏览器上使用该技术,但Chrome,Firefox,Opera或Safari上的CSS不支持JavaScript。另一个限制是doctype不能包含在目标文档中,因为这会导致CSS的解析器停止在非IE浏览器上解析HTML文件。
PoC:RPO示例3
上面的文档将文本的颜色更改为灰色,适用于每个浏览器。它的工作方式与之前的PoC相同,但这次使用纯CSS而不使用表达式。如果文档中包含doctype,则除非IE处于compat模式,否则它将在每个浏览器上失败。
RPO攻击适用于任何类型的文档,例如可以更改图像文件的目标,但是因为图像文件在文件的开头查找特定的字符串,而最终的结果只是一个图像,这使得RPO攻击在这些情况。
反映RPO
如果在页面上输出URL,我们可以通过路径发送XSS向量。以下PHP示例显示了页面上输出的URL。
这里有一个相对URL,“echo $ _SERVER ['PHP_SELF']”输出所请求页面的当前URL。我们可以通过提供一些CSS作为路径的一部分来利用这一点,因为相对URL将通过我们的注入加载,然后CSS将从HTML加载。在某些配置中,PHP_SELF将截断路径信息,在这种情况下可以使用PATH_INFO。
PoC:RPO示例4
摘要
我认为相对URL有害,因为您不能依赖浏览器来确定正确的目录,以及何时使用所谓的“漂亮URL”。如果输出路径信息或者存在攻击者可以操纵的一些持久数据,那么使用相对URL的每个人都会受到这种类型的攻击。我建议在整个站点使用绝对URL或以正斜杠开头的相对URL,因为这是唯一一种不易受RPO攻击的相对URL,因为它从文档根开始。