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.js
和www.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会自动忽略不符合语法的点,只解析能解析的语句