原理
RPO攻击又名为相对路径覆盖攻击。主要被利用于xss攻击之中。简单的理解该攻击原理,假设现在有2个目录分别为aaa目录和bbb目录,利用浏览器与服务器对特殊构造的url的解析差异,让获取了aaa目录下的文件的浏览器误以为自己在bbb目录。当aaa下的文件出现了相对路径的文件引用的时候,浏览器会去读取bbb目录下的该文件,从而造成了漏洞的产生。比如,当在aaa目录下读取的html代码中包含了<script>标签下的相对路径时 <script src="./1.js"></script> ,浏览器本该读取aaa目录下的1.js,但因为浏览器误以为自己在bbb目录下,去请求了bbb目录下的1.js,而bbb目录下的1.js又一定程度的用户可控,便产生了xss漏洞。
例子
现有文件
/root/aaa/index.php
/root/aaa/1.js
/root/1.js
其中,/root/1.js 内容为空,/root/aaa/1.js为用户相关文件,内容一定程度可控,为
alert(1);
/root/aaa/index.php为
<html>
<script src="../1.js"></script>
</html>
正常来说,我们访问http://127.0.0.1/aaa/index.php,该页面被解析后要取的../1.js链接为/root/1.js,而/root/1.js内容为空,所以不会导致任何危害。
但是当攻击者把访问的url构造为 http://127.0.0.1/aaa/bbb%2f../index.php的时候,url编码被解码后传往服务端,服务端识别为
http://127.0.0.1/aaa/bbb/../index.php => http://127.0.0.1/aaa/index.php,所以会传回/aaa/index.php的内容。(注意,在nginx下测试有效,apache无法理解该类型url)
而在客户端,因为/被url编码为%2f,所以浏览器会把bbb%2f..当成一个目录名,误以为自己访问的是aaa目录下bbb%2f..目录下的index.php,所以当解析页面的内容获取 ../1.js的链接时,便会获取/root/aaa/bbb%2f../../1.js ,即 /root/aaa/1.js 。而我们的1.js内容为alert(1);,因此便产生了xss。
你可能会觉得,既要有相对路径,内容一定程度可控的文件,这个内容一定程度可控的文件的文件名还要和相对路径的文件名相同,这几乎不可能同时出现,因此这种攻击没有什么意义。
然而,现在随处可见的url pathinfo模式却大大解除了这种攻击的限制。
解除限制的攻击情景
上面提到的攻击的难点在于1.有一个内容可控的文件,2.引用中的相对路径的文件名要与可控文件名重合。 这样才能使有害内容的文件被引用。
对于第一个问题,在日常的情景中,常常能看到把用户输入显示到前端页面的情况。在这种情况下该页面的内容为一定程度的可控,但是因为有很多污染的内容也存在于页面之中,为了使用户的输入可以正确执行,可利用css的相对引用。因为css会忽略掉非法的部分使符合格式的代码正确执行,并且也有其特有的js执行语法。
对于第二个问题,变为了如何在相对路径中引用会输出用户输入的页面。现在假设在开启pathinfo的网站中,存在http://127.0.0.1/index/search 可在前端页面输出用户的输入且引用了相对路径为../a.css的文件,那么当用户把url更改为http://127.0.0.1/index/search/xxx 时,因为xxx为无效参数,服务端仍会返回http://127.0.0.1/index/search的页面内容,引用的相对路径为http://127.0.0.1/index/search/xxx/../a.css => http://127.0.0.1/index/search/a.css 显示内容与上链接相同,又因为css的容错性,用户的输入得以解析。