RPO(Relative Path Overwrite)
1.What is RPO
RPO(相对路径覆盖)是一种通过覆盖目标文件来利用相对URL的技术。要了解这项技术,我们必须首先研究相对网址和绝对网址之间的差异。绝对URL基本上是包含协议和域名的目标地址的完整URL,而相对URL则是不指定域或协议,并使用现有目的地来确定协议和域。
Absolute URL
https://greyshadow.cn/blog
Relative URL
blog/somedirectory
RPO(Relative Path Overwrite)最早由Gareth Heyes提出。简单的说来就是利用浏览器的一些特性和部分服务端的配置差异导致的漏洞,因为存在这种差异,在精心构造之下,我们可以通过相对路径来引入其他的资源文件。危害甚大,此攻击方法依赖于浏览器和网络服务器的反应,基于服务器的Web缓存技术和配置差异,以及服务器和客户端浏览器的解析差异,利用网页加载的css/js的相对路径,注意是相对路径!来加载其他文件(恶意的),最终浏览器将服务器返回的不是css/js的文件当做css/js来解析,从而导致XSS,信息泄露等漏洞产生。
相对URL会查找非隐藏的内容,并根据当前域名自动包含该域。
相对URL有两种重要的变体:
第一种是我们可以使用当前路径并查找其中的目录,如“xyz”或使用通用目录遍历技术,如“../xyz”。
<html>
<head>
<link href="styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
</body>
</html>
上面的链接元素使用相对URL引用“style.css”,具体取决于您所在的站点目录结构中的哪个位置,它将根据该位置加载样式表。例如,如果您在一个名为“xyz”的目录中,则加载“xyz / style.css”。
有趣的是浏览器并不知道什么是正确的路径,因为它无法访问服务器的文件系统。它没有办法从文件系统外部确定有效的目录结构,只能进行有根据的猜测并使用http状态码来确定它们的存在。
关于服务器和客户端浏览器在解析和识别上的差异性:
- 在Apache中将‘/’编码为%2f后,服务器无法识别url,返回404,但是在Nginx中将‘/’编码为%2f后,服