0%

RPO简单入门

RPO简单入门

今天和AA聊天感觉最近刷题刷的有点无意义,应该学点东西而不是变成赛棍,故开始学习一些乱七八糟的新知识,比如这个RPO攻击,还蛮有意思的

简介

RPO即relative path overwrite,相对路径覆盖,通过浏览器和服务器解析差异进行攻击

当我们用src标签引入js或者是css资源的时候,如果是以相对路径引入,如src=static/1.js,而这个资源是由浏览器去请求的,浏览器并不知道自己服务器端的文件结构,所以只能凭借url去解析,把最后一个/作为目录发起一个访问,如果我们的url是www.z3ratu1.com/index/RPO/aaa,那么浏览器访问资源的路径就是www.z3ratu1.com/index/RPO/static/1.js

攻击方式目前看到两种,一种是跨目录加载资源,一种是将当前页面内容作为js或css解析

利用

跨目录资源加载

利用的是Nginx对url的解析和浏览器的差异完成的
比如说我们现在在网站下放一个index.php里面写一句<script src=static/1.js></script>
/的URL编码为%2f,对于Nginx服务器而言,访问www.z3ratu1.com/RPO/../index.php和访问www.z3ratu1.com/RPO/..%2findex.php是一致的,都是跳了一级目录最后又访问回了www.z3ratu1.com/index.php,Nginx能解析url编码再访问正确的资源
Apache就不能解析这个东西,它会把%2f就正常的当做一个编码,Apache会简单认为你在访问RPO目录下一个名字叫../index.php的文件
那么浏览器看到www.z3ratu1.com/RPO/..%2findex.php这么个东西的时候,必定会觉得当前目录是www.z3ratu1.com/RPO/,比如说我们要加载static/1.js那么访问的就应该是www.z3ratu1.com/RPO/static/1.js,而不是原先index.php应该直接加载根目录下的www.z3ratu1.com/static/1.js
若RPO目录可控,就能包含任意的js代码

将当前页面内容为当做js或css解析

PHP开发或者是python开发的时候会有那种pathinfo的解析形式,就比如www.z3ratu1.com/index.php/mode/login/id/1之类的这种东西,python也可以写路由解析,事实上就是传参,解析完了就是mode=login&id=1这种情况
但是浏览器可不知道你后端是怎么想的,那么就会造成一些玄妙的漏洞出现
而这种模式传参可能会允许你传一些无用的参数,比如你访问一个www.z3ratu1.com/index.php/mode/login/id/1/z33,服务器那边可能就会觉得你只不过是提交了一个无用参数,而返回的界面仍然是访问www.z3ratu1.com/index.php/mode/login/id/1/的结果。
但浏览器不会这么认为,我们假定index.php里面有这么两句:

<script src=RPO.js></script>
<link rel="stylesheet" herf="RPO.css"></link>

那么我们的浏览器就会对www.z3ratu1.com/index.php/mode/login/id/1/RPO.jswww.z3ratu1.com/index.php/mode/login/id/1/RPO.css发起请求
而正如我们上面所说的,pathinfo的解析形式其实是index.php是文件名,而后面跟的这一大堆其实只是个参数,RPO.js和PRO.css也被当作了一个参数,那么www.z3ratu1.com/index.php/mode/login/id/1/的内容就被浏览器当做是js文件的内容和css文件的内容解析了进来,实现对当前页面内容的解析

这里有一个有意思的点,js如果整个代码里面有一个地方有错误就用不了了,但css不会,css会自动忽略不符合语法的点,只解析能解析的语句

参考链接

RPO简单入门
RPO超详细解析
RPOCTF题