RPO(Relative Path Overwrite)相对路径覆盖,是一种新型攻击技术,主要是利用浏览器的一些特性和部分服务端的配置差异导致的漏洞,通过一些技巧,我们可以通过相对路径来引入其他的资源文件,以至于达成我们想要的目的。

测试环境:

winxp + php 5.3.29 + nginx

本次测试的网站根目录下的文件结构及文件内容如下图:

Alt text

利用RPO加载任意js | css文件

首先我们访问http://192.168.177.131/test/1/index.php,可以看到它引用了上一级目录——也就是/test/下的a.js:

Alt text

我们的目的是要让index.php加载出/test/2/下的a.js

此时我们访问http://192.168.177.131/test/2/xxx%2f..%2f..%2f1/index.php

服务器接收的数据是经过浏览器URL解码的,因此服务器接收到的路径是/test/2/xxx/../../1/index.php(注意这里xxx可以是不存在的),也就是/test/1/index.php,因此页面依然显示的是index.php的内容

Alt text

而浏览器自己接收到的就是最原始未处理的数据:/test/2/xxx%2f..%2f..%2f1/index.php,此时%2f还没有被URL解码为/,那么浏览器就会把/xxx%2f..%2f..%2f1/当作一个目录

由于我们的index.php引入的a.js是用相对路径来写的,此时浏览器就会解析成引用的是/test/2/xxx%2f..%2f..%2f1/index.php/../a.js,也就是/test/2/a.js

Alt text


比较详细的分析可以看这篇文章:

http://blog.nsfocus.net/rpo-attack/

还有34C3-2016-urlstorage考察了RPO攻击,writeup链接:

http://loong716.top/2019/08/21/CTF-Training-Writeup.html